From 00c76ceaeb0074e47167be56c0920284e6a0360e Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Wed, 22 Jan 2014 11:57:19 -0500 Subject: [PATCH] Add a save API to lttng-ctl MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This adds multiple function calls to the lttng-ctl API with save.h and save-internal.h files. Signed-off-by: Jérémie Galarneau Signed-off-by: David Goulet --- include/Makefile.am | 6 +- include/lttng/save-internal.h | 38 ++++++ include/lttng/save.h | 104 +++++++++++++++ src/common/sessiond-comm/sessiond-comm.h | 5 + src/lib/lttng-ctl/Makefile.am | 2 +- src/lib/lttng-ctl/save.c | 163 +++++++++++++++++++++++ 6 files changed, 315 insertions(+), 3 deletions(-) create mode 100644 include/lttng/save-internal.h create mode 100644 include/lttng/save.h create mode 100644 src/lib/lttng-ctl/save.c diff --git a/include/Makefile.am b/include/Makefile.am index e813575a7..547857edb 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -2,8 +2,10 @@ lttnginclude_HEADERS = \ lttng/health.h \ lttng/lttng.h \ lttng/lttng-error.h \ - lttng/snapshot.h + lttng/snapshot.h \ + lttng/save.h noinst_HEADERS = \ lttng/snapshot-internal.h \ - lttng/health-internal.h + lttng/health-internal.h \ + lttng/save-internal.h diff --git a/include/lttng/save-internal.h b/include/lttng/save-internal.h new file mode 100644 index 000000000..f4a56f866 --- /dev/null +++ b/include/lttng/save-internal.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2013 - 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_SAVE_INTERNAL_ABI_H +#define LTTNG_SAVE_INTERNAL_ABI_H + +#include +#include + +#include + +/* + * Object used by the save_session API. This is opaque to the public library. + */ +struct lttng_save_session_attr { + /* Name of the session to save, empty string means all. */ + char session_name[NAME_MAX]; + /* Destination of the session configuration. See lttng(1) for URL format. */ + char configuration_url[PATH_MAX]; + /* Overwrite the session configuration file if it exists. */ + uint32_t overwrite; +} LTTNG_PACKED; + +#endif /* LTTNG_SAVE_INTERNAL_ABI_H */ diff --git a/include/lttng/save.h b/include/lttng/save.h new file mode 100644 index 000000000..1fbeb86f6 --- /dev/null +++ b/include/lttng/save.h @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2013 - 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_SAVE_H +#define LTTNG_SAVE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The lttng_save_session_attr object is opaque to the user. Use the helper + * functions below to use them. + */ +struct lttng_save_session_attr; + +/* + * Return a newly allocated save session attribute object or NULL on error. + */ +struct lttng_save_session_attr *lttng_save_session_attr_create(void); + +/* + * Free a given save session attribute object. + */ +void lttng_save_session_attr_destroy(struct lttng_save_session_attr *output); + + +/* + * Save session attribute getter family functions. + */ + +/* Return session name. NULL indicated all sessions must be saved. */ +const char *lttng_save_session_attr_get_session_name( + struct lttng_save_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_save_session_attr_get_output_url( + struct lttng_save_session_attr *attr); +/* + * Return the configuration overwrite attribute. This attribute indicates + * whether or not existing configuration files must be overwritten. + */ +int lttng_save_session_attr_get_overwrite( + struct lttng_save_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 save. A NULL name means all sessions + * known to the session daemon will be saved. + */ +int lttng_save_session_attr_set_session_name( + struct lttng_save_session_attr *attr, const char *session_name); +/* + * Set the URL of the session configuration to save. A NULL value indicates the + * use of the default location being the session one. The URL's format is is + * documented in lttng(1). + */ +int lttng_save_session_attr_set_output_url( + struct lttng_save_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_save_session_attr_set_overwrite( + struct lttng_save_session_attr *attr, int overwrite); + +/* + * Save session configuration(s). + * + * The lttng_save_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_save_session(struct lttng_save_session_attr *attr); + +#ifdef __cplusplus +} +#endif + +#endif /* LTTNG_SAVE_H */ diff --git a/src/common/sessiond-comm/sessiond-comm.h b/src/common/sessiond-comm/sessiond-comm.h index 7ce252d59..bbc7ce5a8 100644 --- a/src/common/sessiond-comm/sessiond-comm.h +++ b/src/common/sessiond-comm/sessiond-comm.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -89,6 +90,7 @@ enum lttcomm_sessiond_command { LTTNG_SNAPSHOT_RECORD = 28, LTTNG_CREATE_SESSION_SNAPSHOT = 29, LTTNG_CREATE_SESSION_LIVE = 30, + LTTNG_SAVE_SESSION = 31, }; enum lttcomm_relayd_command { @@ -280,6 +282,9 @@ struct lttcomm_session_msg { uint32_t nb_uri; unsigned int timer_interval; /* usec */ } LTTNG_PACKED session_live; + struct { + struct lttng_save_session_attr attr; + } LTTNG_PACKED save_session; } u; } LTTNG_PACKED; diff --git a/src/lib/lttng-ctl/Makefile.am b/src/lib/lttng-ctl/Makefile.am index c588037d9..9a6ca3815 100644 --- a/src/lib/lttng-ctl/Makefile.am +++ b/src/lib/lttng-ctl/Makefile.am @@ -5,7 +5,7 @@ SUBDIRS = filter lib_LTLIBRARIES = liblttng-ctl.la liblttng_ctl_la_SOURCES = lttng-ctl.c snapshot.c lttng-ctl-helper.h \ - lttng-ctl-health.c + lttng-ctl-health.c save.c liblttng_ctl_la_LIBADD = \ $(top_builddir)/src/common/sessiond-comm/libsessiond-comm.la \ diff --git a/src/lib/lttng-ctl/save.c b/src/lib/lttng-ctl/save.c new file mode 100644 index 000000000..f215468a2 --- /dev/null +++ b/src/lib/lttng-ctl/save.c @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2013 - 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 + */ + +#define _GNU_SOURCE +#include +#include + +#include +#include +#include +#include + +#include "lttng-ctl-helper.h" + +struct lttng_save_session_attr *lttng_save_session_attr_create(void) +{ + return zmalloc(sizeof(struct lttng_save_session_attr)); +} + +void lttng_save_session_attr_destroy(struct lttng_save_session_attr *output) +{ + if (output) { + free(output); + } +} + +const char *lttng_save_session_attr_get_session_name( + struct lttng_save_session_attr *attr) +{ + const char *ret = NULL; + + if (attr && attr->session_name[0]) { + ret = attr->session_name; + } + + return ret; +} + +const char *lttng_save_session_attr_get_output_url( + struct lttng_save_session_attr *attr) +{ + const char *ret = NULL; + + if (attr && attr->configuration_url[0]) { + ret = attr->configuration_url; + } + + return ret; +} + +int lttng_save_session_attr_get_overwrite( + struct lttng_save_session_attr *attr) +{ + return attr ? attr->overwrite : -LTTNG_ERR_INVALID; +} + +int lttng_save_session_attr_set_session_name( + struct lttng_save_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_save_session_attr_set_output_url( + struct lttng_save_session_attr *attr, const char *url) +{ + int ret = 0; + + if (!attr) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + if (url) { + size_t len; + + len = strlen(url); + if (len >= PATH_MAX) { + ret = -LTTNG_ERR_INVALID; + goto error; + } + + strncpy(attr->configuration_url, url, len); + } else { + attr->configuration_url[0] = '\0'; + } +error: + return ret; +} + +int lttng_save_session_attr_set_overwrite( + struct lttng_save_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 save the + * session configurations. Thus, we must send a save command to the session + * daemon which will, in turn, save its current session configuration. + */ +int lttng_save_session(struct lttng_save_session_attr *attr) +{ + struct lttcomm_session_msg lsm; + int ret; + + if (!attr) { + ret = -LTTNG_ERR_INVALID; + goto end; + } + + memset(&lsm, 0, sizeof(lsm)); + lsm.cmd_type = LTTNG_SAVE_SESSION; + + memcpy(&lsm.u.save_session.attr, attr, + sizeof(struct lttng_save_session_attr)); + ret = lttng_ctl_ask_sessiond(&lsm, NULL); +end: + return ret; +} -- 2.34.1