From 9245bd0e72bbb5cea41f8f6483e7ef3e088a2403 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Wed, 28 May 2014 10:52:16 -0400 Subject: [PATCH] Add the load session API call Introduce lttng_load_session(attr) and some setter/getter for the attribute object. Signed-off-by: David Goulet --- include/Makefile.am | 4 +- include/lttng/load-internal.h | 39 ++++++++ include/lttng/load.h | 109 +++++++++++++++++++++ src/lib/lttng-ctl/Makefile.am | 5 +- src/lib/lttng-ctl/load.c | 173 ++++++++++++++++++++++++++++++++++ 5 files changed, 327 insertions(+), 3 deletions(-) create mode 100644 include/lttng/load-internal.h create mode 100644 include/lttng/load.h create mode 100644 src/lib/lttng-ctl/load.c diff --git a/include/Makefile.am b/include/Makefile.am index cbd8861fc..d40cb4a4f 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -83,9 +83,11 @@ lttnginclude_HEADERS = \ lttng/lttng-error.h \ lttng/snapshot.h \ lttng/save.h \ + lttng/load.h \ version.h noinst_HEADERS = \ lttng/snapshot-internal.h \ lttng/health-internal.h \ - lttng/save-internal.h + lttng/save-internal.h \ + lttng/load-internal.h diff --git a/include/lttng/load-internal.h b/include/lttng/load-internal.h new file mode 100644 index 000000000..85f0afa54 --- /dev/null +++ b/include/lttng/load-internal.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2014 - Jérémie Galarneau + * David Goulet + * + * 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_LOAD_INTERNAL_ABI_H +#define LTTNG_LOAD_INTERNAL_ABI_H + +#include +#include + +#include + +/* + * Object used by the load_session API. This is opaque to the public library. + */ +struct lttng_load_session_attr { + /* Name of the session to load, empty string means all. */ + char session_name[NAME_MAX]; + /* URL of the session configuration file to load. */ + char input_url[PATH_MAX]; + /* Overwrite the session if it exists. */ + uint32_t overwrite; +} LTTNG_PACKED; + +#endif /* LTTNG_LOAD_INTERNAL_ABI_H */ diff --git a/include/lttng/load.h b/include/lttng/load.h new file mode 100644 index 000000000..815529835 --- /dev/null +++ b/include/lttng/load.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2014 - Jérémie Galarneau + * David Goulet + * + * 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_LOAD_H +#define LTTNG_LOAD_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The lttng_load_session_attr object is opaque to the user. Use the helper + * functions below to use them. + */ +struct lttng_load_session_attr; + +/* + * Return a newly allocated load session attribute object or NULL on error. + */ +struct lttng_load_session_attr *lttng_load_session_attr_create(void); + +/* + * Free a given load session attribute object. + */ +void lttng_load_session_attr_destroy(struct lttng_load_session_attr *attr); + + +/* + * Save session attribute getter family functions. + */ + +/* Return session name. NULL indicated all sessions must be loadd. */ +const char *lttng_load_session_attr_get_session_name( + struct lttng_load_session_attr *attr); +/* + * Return destination URL. A NULL value indicates the default session + * configuration location. The URL format used is documented in lttng(1). + * NULL indicates that the default session configuration path is used. + */ +const char *lttng_load_session_attr_get_input_url( + struct lttng_load_session_attr *attr); + +/* + * Return the configuration overwrite attribute. This attribute indicates + * whether or not existing configuration files must be overwritten. + */ +int lttng_load_session_attr_get_overwrite( + struct lttng_load_session_attr *attr); + +/* + * Save session attribute setter family functions. + * + * For every set* call, 0 is returned on success or else -LTTNG_ERR_INVALID is + * returned indicating that at least one given parameter is invalid. + */ + +/* + * Set the name of the session to load. A NULL name means all sessions + * known to the session daemon will be loadd. + */ +int lttng_load_session_attr_set_session_name( + struct lttng_load_session_attr *attr, const char *session_name); + +/* + * Set the URL of the session configuration to load. A NULL value indicates the + * use of the default location being the session one. + * + * Note that file:// is the only supported URL format. + */ +int lttng_load_session_attr_set_input_url( + struct lttng_load_session_attr *attr, const char *url); + +/* + * Set the overwrite attribute. If set to true, files of the same name as the + * current session configuration URL will be overwritten. + */ +int lttng_load_session_attr_set_overwrite( + struct lttng_load_session_attr *attr, int overwrite); + +/* + * Save session configuration(s). + * + * The lttng_load_session_attr object must not be NULL. No ownership of the + * object is kept by the function; it must be released by the caller. + * + * Returns 0 on success or a negative LTTNG_ERR value on error. + */ +int lttng_load_session(struct lttng_load_session_attr *attr); + +#ifdef __cplusplus +} +#endif + +#endif /* LTTNG_LOAD_H */ diff --git a/src/lib/lttng-ctl/Makefile.am b/src/lib/lttng-ctl/Makefile.am index 9a6ca3815..d4a169dc6 100644 --- a/src/lib/lttng-ctl/Makefile.am +++ b/src/lib/lttng-ctl/Makefile.am @@ -5,13 +5,14 @@ SUBDIRS = filter lib_LTLIBRARIES = liblttng-ctl.la liblttng_ctl_la_SOURCES = lttng-ctl.c snapshot.c lttng-ctl-helper.h \ - lttng-ctl-health.c save.c + lttng-ctl-health.c save.c load.c liblttng_ctl_la_LIBADD = \ $(top_builddir)/src/common/sessiond-comm/libsessiond-comm.la \ $(top_builddir)/src/common/libcommon.la \ $(top_builddir)/src/common/hashtable/libhashtable.la \ - $(top_builddir)/src/lib/lttng-ctl/filter/libfilter.la + $(top_builddir)/src/lib/lttng-ctl/filter/libfilter.la \ + $(top_builddir)/src/common/config/libconfig.la pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = lttng-ctl.pc diff --git a/src/lib/lttng-ctl/load.c b/src/lib/lttng-ctl/load.c new file mode 100644 index 000000000..3811981ef --- /dev/null +++ b/src/lib/lttng-ctl/load.c @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2014 - David Goulet + * + * 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 + */ + +#define _GNU_SOURCE +#include +#include + +#include +#include +#include +#include +#include + +#include "lttng-ctl-helper.h" + +struct lttng_load_session_attr *lttng_load_session_attr_create(void) +{ + return zmalloc(sizeof(struct lttng_load_session_attr)); +} + +void lttng_load_session_attr_destroy(struct lttng_load_session_attr *attr) +{ + if (attr) { + free(attr); + } +} + +const char *lttng_load_session_attr_get_session_name( + struct lttng_load_session_attr *attr) +{ + const char *ret = NULL; + + if (attr && attr->session_name[0]) { + ret = attr->session_name; + } + + return ret; +} + +const char *lttng_load_session_attr_get_input_url( + struct lttng_load_session_attr *attr) +{ + const char *ret = NULL; + + if (attr && attr->input_url[0]) { + ret = attr->input_url; + } + + return ret; +} + +int lttng_load_session_attr_get_overwrite( + struct lttng_load_session_attr *attr) +{ + return attr ? attr->overwrite : -LTTNG_ERR_INVALID; +} + +int lttng_load_session_attr_set_session_name( + struct lttng_load_session_attr *attr, const char *session_name) +{ + int ret = 0; + + if (!attr) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + if (session_name) { + size_t len; + + len = strlen(session_name); + if (len >= NAME_MAX) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + strncpy(attr->session_name, session_name, len); + } else { + attr->session_name[0] = '\0'; + } +error: + return ret; +} + +int lttng_load_session_attr_set_input_url( + struct lttng_load_session_attr *attr, const char *url) +{ + int ret = 0; + size_t len, size; + struct lttng_uri *uris = NULL; + + if (!attr) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + if (!url) { + attr->input_url[0] = '\0'; + ret = 0; + goto end; + } + + len = strlen(url); + if (len >= PATH_MAX) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + size = uri_parse_str_urls(url, NULL, &uris); + if (size <= 0 || uris[0].dtype != LTTNG_DST_PATH) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + /* Copy string plus the NULL terminated byte. */ + lttng_ctl_copy_string(attr->input_url, uris[0].dst.path, + sizeof(attr->input_url)); + +end: +error: + free(uris); + return ret; +} + +int lttng_load_session_attr_set_overwrite( + struct lttng_load_session_attr *attr, int overwrite) +{ + int ret = 0; + + if (!attr) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + + attr->overwrite = !!overwrite; +end: + return ret; +} + +/* + * The lttng-ctl API does not expose all the information needed to load the + * session configurations. Thus, we must send a load command to the session + * daemon which will, in turn, load its current session configuration. + */ +int lttng_load_session(struct lttng_load_session_attr *attr) +{ + int ret; + + if (!attr) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + + ret = config_load_session(attr->input_url, attr->session_name, + attr->overwrite); + +end: + return ret; +} -- 2.34.1