From 434131e45c3b55d74c3feec8b21b0979eecc8671 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Wed, 4 Apr 2018 23:21:02 -0400 Subject: [PATCH] Add lttng_trace_archive_location lttng-ctl API MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérémie Galarneau --- include/Makefile.am | 4 +- include/lttng/location-internal.h | 56 +++++++ include/lttng/location.h | 117 ++++++++++++++ src/common/Makefile.am | 1 + src/common/location.c | 254 ++++++++++++++++++++++++++++++ 5 files changed, 431 insertions(+), 1 deletion(-) create mode 100644 include/lttng/location-internal.h create mode 100644 include/lttng/location.h create mode 100644 src/common/location.c diff --git a/include/Makefile.am b/include/Makefile.am index ddf252899..5eeb0caff 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -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 index 000000000..dc7137337 --- /dev/null +++ b/include/lttng/location-internal.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2017 - Jérémie Galarneau + * + * 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 +#include + +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 index 000000000..6312b44ee --- /dev/null +++ b/include/lttng/location.h @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2018 - Jérémie Galarneau + * + * 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 + +#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 */ diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 5392bf4d9..c6b42e4dd 100644 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -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 index 000000000..d1fd538f2 --- /dev/null +++ b/src/common/location.c @@ -0,0 +1,254 @@ +/* + * Copyright (C) 2018 - Jérémie Galarneau + * + * 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 +#include +#include + +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; +} -- 2.34.1