Add lttng_trace_archive_location lttng-ctl API
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 5 Apr 2018 03:21:02 +0000 (23:21 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 7 Apr 2018 20:03:55 +0000 (16:03 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
include/Makefile.am
include/lttng/location-internal.h [new file with mode: 0644]
include/lttng/location.h [new file with mode: 0644]
src/common/Makefile.am
src/common/location.c [new file with mode: 0644]

index ddf252899c56d6e608beee5384b8c712c24bd32f..5eeb0caff8a7aca7c20fc40b7dd09909a6f7c641 100644 (file)
@@ -79,6 +79,7 @@ lttnginclude_HEADERS = \
        lttng/load.h \
        lttng/endpoint.h \
        lttng/rotation.h \
+       lttng/location.h \
        version.h.tmpl
 
 lttngactioninclude_HEADERS= \
@@ -115,4 +116,5 @@ noinst_HEADERS = \
        lttng/notification/channel-internal.h \
        lttng/channel-internal.h \
        lttng/rotate-internal.h \
-       lttng/ref-internal.h
+       lttng/ref-internal.h \
+       lttng/location-internal.h
diff --git a/include/lttng/location-internal.h b/include/lttng/location-internal.h
new file mode 100644 (file)
index 0000000..dc71373
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License, version 2.1 only,
+ * as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef LTTNG_LOCATION_INTERNAL_H
+#define LTTNG_LOCATION_INTERNAL_H
+
+#include <lttng/location.h>
+#include <common/macros.h>
+
+struct lttng_trace_archive_location {
+       enum lttng_trace_archive_location_type type;
+       union {
+               struct {
+                       char *absolute_path;
+               } local;
+               struct {
+                       char *host;
+                       enum lttng_trace_archive_location_relay_protocol_type protocol;
+                       struct {
+                               uint16_t control, data;
+                       } ports;
+                       char *relative_path;
+               } relay;
+       } types;
+};
+
+LTTNG_HIDDEN
+struct lttng_trace_archive_location *lttng_trace_archive_location_local_create(
+               const char *path);
+
+LTTNG_HIDDEN
+struct lttng_trace_archive_location *lttng_trace_archive_location_relay_create(
+               const char *host,
+               enum lttng_trace_archive_location_relay_protocol_type protocol,
+               uint16_t control_port, uint16_t data_port,
+               const char *relative_path);
+
+LTTNG_HIDDEN
+void lttng_trace_archive_location_destroy(
+               struct lttng_trace_archive_location *location);
+
+#endif /* LTTNG_LOCATION_INTERNAL_H */
diff --git a/include/lttng/location.h b/include/lttng/location.h
new file mode 100644 (file)
index 0000000..6312b44
--- /dev/null
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2018 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License, version 2.1 only,
+ * as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef LTTNG_LOCATION_H
+#define LTTNG_LOCATION_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum lttng_trace_archive_location_type {
+       LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_UNKNOWN = 0,
+       LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL = 1,
+       LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY = 2,
+};
+
+enum lttng_trace_archive_location_status {
+       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK = 0,
+       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_INVALID = -1,
+       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_ERROR = -2,
+};
+
+enum lttng_trace_archive_location_relay_protocol_type {
+       LTTNG_TRACE_ARCHIVE_LOCATION_RELAY_PROTOCOL_TYPE_TCP = 0,
+};
+
+/*
+ * Location of a trace archive.
+ */
+struct lttng_trace_archive_location;
+
+/*
+ * Get a trace archive location's type.
+ */
+extern enum lttng_trace_archive_location_type
+lttng_trace_archive_location_get_type(
+               const struct lttng_trace_archive_location *location);
+
+/*
+ * Get the absolute path of a local trace archive location.
+ *
+ * The trace archive location maintains ownership of the absolute_path.
+ */
+extern enum lttng_trace_archive_location_status
+lttng_trace_archive_location_local_get_absolute_path(
+               const struct lttng_trace_archive_location *location,
+               const char **absolute_path);
+
+/*
+ * Get the host address of the relay daemon associated to this trace archive
+ * location. May be a hostname, IPv4, or IPv6 address.
+ *
+ * The trace archive location maintains ownership of relay_host.
+ */
+extern enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_host(
+               const struct lttng_trace_archive_location *location,
+               const char **relay_host);
+
+/*
+ * Get the control port of the relay daemon associated to this trace archive
+ * location.
+ */
+extern enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_control_port(
+               const struct lttng_trace_archive_location *location,
+               uint16_t *control_port);
+
+/*
+ * Get the data port of the relay daemon associated to this trace archive
+ * location.
+ */
+extern enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_data_port(
+               const struct lttng_trace_archive_location *location,
+               uint16_t *data_port);
+
+/*
+ * Get the protocol used to communicate with the relay daemon associated to this
+ * trace archive location.
+ */
+extern enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_protocol_type(
+               const struct lttng_trace_archive_location *location,
+               enum lttng_trace_archive_location_relay_protocol_type *protocol);
+
+/*
+ * Get path relative to the relay daemon's current output path.
+ *
+ * The trace archive location maintains ownership of relative_path.
+ */
+extern enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_relative_path(
+               const struct lttng_trace_archive_location *location,
+               const char **relative_path);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LTTNG_LOCATION_H */
index 5392bf4d94a2f79f5f563f842ab64ba0435a5492..c6b42e4dd77236bf3e2e8ed5231b2bb6ff5c5bfd 100644 (file)
@@ -76,6 +76,7 @@ libcommon_la_SOURCES = error.h error.c utils.c utils.h runas.c runas.h \
                        evaluation.c notification.c trigger.c endpoint.c \
                        dynamic-buffer.h dynamic-buffer.c \
                        buffer-view.h buffer-view.c \
+                       location.c \
                        waiter.h waiter.c
 
 libcommon_la_LIBADD = \
diff --git a/src/common/location.c b/src/common/location.c
new file mode 100644 (file)
index 0000000..d1fd538
--- /dev/null
@@ -0,0 +1,254 @@
+/*
+ * Copyright (C) 2018 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License, version 2.1 only,
+ * as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <lttng/location-internal.h>
+#include <common/macros.h>
+#include <stdlib.h>
+
+static
+struct lttng_trace_archive_location *lttng_trace_archive_location_create(
+               enum lttng_trace_archive_location_type type)
+{
+       struct lttng_trace_archive_location *location;
+
+       location = zmalloc(sizeof(*location));
+       if (!location) {
+               goto end;
+       }
+
+       location->type = type;
+end:
+       return location;
+}
+
+LTTNG_HIDDEN
+void lttng_trace_archive_location_destroy(
+               struct lttng_trace_archive_location *location)
+{
+       if (!location) {
+               return;
+       }
+
+       switch (location->type) {
+       case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL:
+               free(location->types.local.absolute_path);
+               break;
+       case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY:
+               free(location->types.relay.host);
+               free(location->types.relay.relative_path);
+               break;
+       default:
+               abort();
+       }
+
+       free(location);
+}
+
+LTTNG_HIDDEN
+struct lttng_trace_archive_location *lttng_trace_archive_location_local_create(
+               const char *absolute_path)
+{
+       struct lttng_trace_archive_location *location = NULL;
+
+       if (!absolute_path) {
+               goto end;
+       }
+
+       location = lttng_trace_archive_location_create(
+                       LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL);
+       if (!location) {
+               goto end;
+       }
+
+       location->types.local.absolute_path = strdup(absolute_path);
+       if (!location->types.local.absolute_path) {
+               goto error;
+       }
+
+end:
+       return location;
+error:
+       lttng_trace_archive_location_destroy(location);
+       return NULL;
+}
+
+LTTNG_HIDDEN
+struct lttng_trace_archive_location *lttng_trace_archive_location_relay_create(
+               const char *host,
+               enum lttng_trace_archive_location_relay_protocol_type protocol,
+               uint16_t control_port, uint16_t data_port,
+               const char *relative_path)
+{
+       struct lttng_trace_archive_location *location = NULL;
+
+       if (!host || !relative_path) {
+               goto end;
+       }
+
+       location = lttng_trace_archive_location_create(
+                       LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY);
+       if (!location) {
+               goto end;
+       }
+
+       location->types.relay.host = strdup(host);
+       if (!location->types.relay.host) {
+               goto error;
+       }
+       location->types.relay.relative_path = strdup(relative_path);
+       if (!location->types.relay.relative_path) {
+               goto error;
+       }
+
+       location->types.relay.protocol = protocol;
+       location->types.relay.ports.control = control_port;
+       location->types.relay.ports.data = data_port;
+end:
+       return location;
+error:
+       lttng_trace_archive_location_destroy(location);
+       return NULL;
+}
+
+enum lttng_trace_archive_location_type lttng_trace_archive_location_get_type(
+               const struct lttng_trace_archive_location *location)
+{
+       enum lttng_trace_archive_location_type type;
+
+       if (!location) {
+               type = LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_UNKNOWN;
+               goto end;
+       }
+
+       type = location->type;
+end:
+       return type;
+}
+
+enum lttng_trace_archive_location_status
+lttng_trace_archive_location_local_get_absolute_path(
+               const struct lttng_trace_archive_location *location,
+               const char **absolute_path)
+{
+       enum lttng_trace_archive_location_status status =
+                       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK;
+
+       if (!location || !absolute_path ||
+                       location->type != LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL) {
+               status = LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_INVALID;
+               goto end;
+       }
+
+       *absolute_path = location->types.local.absolute_path;
+end:
+       return status;
+}
+
+enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_host(
+               const struct lttng_trace_archive_location *location,
+               const char **relay_host)
+{
+       enum lttng_trace_archive_location_status status =
+                       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK;
+
+       if (!location || !relay_host ||
+                       location->type != LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY) {
+               status = LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_INVALID;
+               goto end;
+       }
+
+       *relay_host = location->types.relay.host;
+end:
+       return status;
+}
+
+enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_relative_path(
+               const struct lttng_trace_archive_location *location,
+               const char **relative_path)
+{
+       enum lttng_trace_archive_location_status status =
+                       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK;
+
+       if (!location || !relative_path ||
+                       location->type != LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY) {
+               status = LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_INVALID;
+               goto end;
+       }
+
+       *relative_path = location->types.relay.relative_path;
+end:
+       return status;
+}
+
+enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_control_port(
+               const struct lttng_trace_archive_location *location,
+               uint16_t *control_port)
+{
+       enum lttng_trace_archive_location_status status =
+                       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK;
+
+       if (!location || !control_port ||
+                       location->type != LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY) {
+               status = LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_INVALID;
+               goto end;
+       }
+
+       *control_port = location->types.relay.ports.control;
+end:
+       return status;
+}
+
+enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_data_port(
+               const struct lttng_trace_archive_location *location,
+               uint16_t *data_port)
+{
+       enum lttng_trace_archive_location_status status =
+                       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK;
+
+       if (!location || !data_port ||
+                       location->type != LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY) {
+               status = LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_INVALID;
+               goto end;
+       }
+
+       *data_port = location->types.relay.ports.data;
+end:
+       return status;
+}
+
+enum lttng_trace_archive_location_status
+lttng_trace_archive_location_relay_get_protocol_type(
+               const struct lttng_trace_archive_location *location,
+               enum lttng_trace_archive_location_relay_protocol_type *protocol)
+{
+       enum lttng_trace_archive_location_status status =
+                       LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK;
+
+       if (!location || !protocol ||
+                       location->type != LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY) {
+               status = LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_INVALID;
+               goto end;
+       }
+
+       *protocol = location->types.relay.protocol;
+end:
+       return status;
+}
This page took 0.030666 seconds and 4 git commands to generate.