Add a save API to lttng-ctl
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 22 Jan 2014 16:57:19 +0000 (11:57 -0500)
committerDavid Goulet <dgoulet@efficios.com>
Thu, 6 Mar 2014 20:53:10 +0000 (15:53 -0500)
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 <jeremie.galarneau@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
include/Makefile.am
include/lttng/save-internal.h [new file with mode: 0644]
include/lttng/save.h [new file with mode: 0644]
src/common/sessiond-comm/sessiond-comm.h
src/lib/lttng-ctl/Makefile.am
src/lib/lttng-ctl/save.c [new file with mode: 0644]

index e813575a7d6eed44fee8b018f69d593a3d112f2c..547857edb8f62e5072eeda76637cd4459d71876f 100644 (file)
@@ -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 (file)
index 0000000..f4a56f8
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2013 - 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_SAVE_INTERNAL_ABI_H
+#define LTTNG_SAVE_INTERNAL_ABI_H
+
+#include <limits.h>
+#include <stdint.h>
+
+#include <common/macros.h>
+
+/*
+ * 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 (file)
index 0000000..1fbeb86
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2013 - 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_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 */
index 7ce252d591f28b609216bb1ec2d1a367051694d4..bbc7ce5a8e403156e1bedc38ba574ffdccc390ea 100644 (file)
@@ -29,6 +29,7 @@
 #include <limits.h>
 #include <lttng/lttng.h>
 #include <lttng/snapshot-internal.h>
+#include <lttng/save-internal.h>
 #include <common/compat/socket.h>
 #include <common/uri.h>
 #include <common/defaults.h>
@@ -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;
 
index c588037d9ed50b6c39d548580b68057192e43b3f..9a6ca3815c354b5bcde37154d3e7f2919d0d6571 100644 (file)
@@ -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 (file)
index 0000000..f215468
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2013 - 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
+ */
+
+#define _GNU_SOURCE
+#include <assert.h>
+#include <string.h>
+
+#include <lttng/lttng-error.h>
+#include <lttng/save.h>
+#include <lttng/save-internal.h>
+#include <common/sessiond-comm/sessiond-comm.h>
+
+#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;
+}
This page took 0.03091 seconds and 4 git commands to generate.