Move health comm to health-internal.h
[lttng-tools.git] / src / lib / lttng-ctl / lttng-ctl.c
index 033a28105ef6744f464434c32ad0f01b2ada889c..0efc1591510fbff0b1eebf8f4e0bd313166204a6 100644 (file)
@@ -34,6 +34,7 @@
 #include <common/uri.h>
 #include <common/utils.h>
 #include <lttng/lttng.h>
+#include <lttng/health-internal.h>
 
 #include "filter/filter-ast.h"
 #include "filter/filter-parser.h"
@@ -574,6 +575,7 @@ static int _lttng_stop_tracing(const char *session_name, int wait)
        }
 
        _MSG("Waiting for data availability");
+       fflush(stdout);
 
        /* Check for data availability */
        do {
@@ -591,6 +593,7 @@ static int _lttng_stop_tracing(const char *session_name, int wait)
                if (data_ret) {
                        usleep(DEFAULT_DATA_AVAILABILITY_WAIT_TIME);
                        _MSG(".");
+                       fflush(stdout);
                }
        } while (data_ret != 0);
 
@@ -1363,45 +1366,37 @@ int lttng_disable_consumer(struct lttng_handle *handle)
  * Set health socket path by putting it in the global health_sock_path
  * variable.
  *
- * Returns 0 on success or assert(0) on ENOMEM.
+ * Returns 0 on success or -ENOMEM.
  */
 static int set_health_socket_path(void)
 {
-       int in_tgroup = 0;      /* In tracing group */
        uid_t uid;
        const char *home;
+       int ret;
 
        uid = getuid();
 
-       if (uid != 0) {
-               /* Are we in the tracing group ? */
-               in_tgroup = check_tracing_group(tracing_group);
-       }
-
-       if ((uid == 0) || in_tgroup) {
+       if (uid == 0 || check_tracing_group(tracing_group)) {
                lttng_ctl_copy_string(health_sock_path,
                                DEFAULT_GLOBAL_HEALTH_UNIX_SOCK, sizeof(health_sock_path));
+               return 0;
        }
 
-       if (uid != 0) {
-               int ret;
-
-               /*
-                * With GNU C <  2.1, snprintf returns -1 if the target buffer is too small;
-                * With GNU C >= 2.1, snprintf returns the required size (excluding closing null)
-                */
-               home = utils_get_home_dir();
-               if (home == NULL) {
-                       /* Fallback in /tmp .. */
-                       home = "/tmp";
-               }
+       /*
+        * With GNU C <  2.1, snprintf returns -1 if the target buffer
+        * is too small; With GNU C >= 2.1, snprintf returns the
+        * required size (excluding closing null).
+        */
+       home = utils_get_home_dir();
+       if (home == NULL) {
+               /* Fallback in /tmp */
+               home = "/tmp";
+       }
 
-               ret = snprintf(health_sock_path, sizeof(health_sock_path),
-                               DEFAULT_HOME_HEALTH_UNIX_SOCK, home);
-               if ((ret < 0) || (ret >= sizeof(health_sock_path))) {
-                       /* ENOMEM at this point... just kill the control lib. */
-                       assert(0);
-               }
+       ret = snprintf(health_sock_path, sizeof(health_sock_path),
+                       DEFAULT_HOME_HEALTH_UNIX_SOCK, home);
+       if ((ret < 0) || (ret >= sizeof(health_sock_path))) {
+               return -ENOMEM;
        }
 
        return 0;
@@ -1418,8 +1413,8 @@ static int set_health_socket_path(void)
 int lttng_health_check(enum lttng_health_component c)
 {
        int sock, ret;
-       struct lttcomm_health_msg msg;
-       struct lttcomm_health_data reply;
+       struct health_comm_msg msg;
+       struct health_comm_reply reply;
 
        /* Connect to the sesssion daemon */
        sock = lttcomm_connect_unix_sock(health_sock_path);
@@ -1428,7 +1423,7 @@ int lttng_health_check(enum lttng_health_component c)
                goto error;
        }
 
-       msg.cmd = LTTNG_HEALTH_CHECK;
+       msg.cmd = HEALTH_CMD_CHECK;
        msg.component = c;
 
        ret = lttcomm_send_unix_sock(sock, (void *)&msg, sizeof(msg));
@@ -1594,6 +1589,51 @@ int lttng_create_session_snapshot(const char *name, const char *snapshot_url)
        return ret;
 }
 
+/*
+ * Create a session exclusively used for live.
+ *
+ * Returns LTTNG_OK on success or a negative error code.
+ */
+int lttng_create_session_live(const char *name, const char *url,
+               unsigned int timer_interval)
+{
+       int ret;
+       ssize_t size;
+       struct lttcomm_session_msg lsm;
+       struct lttng_uri *uris = NULL;
+
+       if (name == NULL) {
+               return -LTTNG_ERR_INVALID;
+       }
+
+       memset(&lsm, 0, sizeof(lsm));
+
+       lsm.cmd_type = LTTNG_CREATE_SESSION_LIVE;
+       lttng_ctl_copy_string(lsm.session.name, name, sizeof(lsm.session.name));
+
+       size = uri_parse_str_urls(url, NULL, &uris);
+       if (size < 0) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       /* file:// is not accepted for live session. */
+       if (uris[0].dtype == LTTNG_DST_PATH) {
+               ret = -LTTNG_ERR_INVALID;
+               goto end;
+       }
+
+       lsm.u.session_live.nb_uri = size;
+       lsm.u.session_live.timer_interval = timer_interval;
+
+       ret = lttng_ctl_ask_sessiond_varlen(&lsm, uris,
+                       sizeof(struct lttng_uri) * size, NULL);
+
+end:
+       free(uris);
+       return ret;
+}
+
 /*
  * lib constructor
  */
@@ -1602,7 +1642,9 @@ static void __attribute__((constructor)) init()
        /* Set default session group */
        lttng_set_tracing_group(DEFAULT_TRACING_GROUP);
        /* Set socket for health check */
-       (void) set_health_socket_path();
+       if (set_health_socket_path()) {
+               abort();
+       }
 }
 
 /*
This page took 0.027684 seconds and 5 git commands to generate.