Fix: define _LGPL_SOURCE in C files
[lttng-tools.git] / src / bin / lttng-sessiond / session.c
index b6b24b76c3f9ae28cec31d3c9e3224351647a2ef..99b0165070ebc296c9f2bc9dc46a6d5967703741 100644 (file)
@@ -16,7 +16,9 @@
  */
 
 #define _GNU_SOURCE
+#define _LGPL_SOURCE
 #include <limits.h>
+#include <inttypes.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -48,13 +50,49 @@ static struct ltt_session_list ltt_session_list = {
        .next_uuid = 0,
 };
 
+/* These characters are forbidden in a session name. Used by validate_name. */
+static const char *forbidden_name_chars = "/";
+
+/*
+ * Validate the session name for forbidden characters.
+ *
+ * Return 0 on success else -1 meaning a forbidden char. has been found.
+ */
+static int validate_name(const char *name)
+{
+       int ret;
+       char *tok, *tmp_name;
+
+       assert(name);
+
+       tmp_name = strdup(name);
+       if (!tmp_name) {
+               /* ENOMEM here. */
+               ret = -1;
+               goto error;
+       }
+
+       tok = strpbrk(tmp_name, forbidden_name_chars);
+       if (tok) {
+               DBG("Session name %s contains a forbidden character", name);
+               /* Forbidden character has been found. */
+               ret = -1;
+               goto error;
+       }
+       ret = 0;
+
+error:
+       free(tmp_name);
+       return ret;
+}
+
 /*
  * Add a ltt_session structure to the global list.
  *
  * The caller MUST acquire the session list lock before.
  * Returns the unique identifier for the session.
  */
-static unsigned int add_session_list(struct ltt_session *ls)
+static uint64_t add_session_list(struct ltt_session *ls)
 {
        assert(ls);
 
@@ -123,7 +161,7 @@ void session_unlock(struct ltt_session *session)
  * NULL is returned. This must be called with the session lock held using
  * session_lock_list and session_unlock_list.
  */
-struct ltt_session *session_find_by_name(char *name)
+struct ltt_session *session_find_by_name(const char *name)
 {
        struct ltt_session *iter;
 
@@ -159,6 +197,7 @@ int session_destroy(struct ltt_session *session)
        pthread_mutex_destroy(&session->lock);
 
        consumer_destroy_output(session->consumer);
+       snapshot_destroy(&session->snapshot);
        free(session);
 
        return LTTNG_OK;
@@ -192,6 +231,22 @@ int session_create(char *name, uid_t uid, gid_t gid)
                goto error;
        }
 
+       ret = validate_name(name);
+       if (ret < 0) {
+               ret = LTTNG_ERR_SESSION_INVALID_CHAR;
+               goto error;
+       }
+
+       ret = gethostname(new_session->hostname, sizeof(new_session->hostname));
+       if (ret < 0) {
+               if (errno == ENAMETOOLONG) {
+                       new_session->hostname[sizeof(new_session->hostname) - 1] = '\0';
+               } else {
+                       ret = LTTNG_ERR_FATAL;
+                       goto error;
+               }
+       }
+
        /* Init kernel session */
        new_session->kernel_session = NULL;
        new_session->ust_session = NULL;
@@ -202,6 +257,12 @@ int session_create(char *name, uid_t uid, gid_t gid)
        new_session->uid = uid;
        new_session->gid = gid;
 
+       ret = snapshot_init(&new_session->snapshot);
+       if (ret < 0) {
+               ret = LTTNG_ERR_NOMEM;
+               goto error;
+       }
+
        /* Add new session to the session list */
        session_lock_list();
        new_session->id = add_session_list(new_session);
@@ -212,8 +273,8 @@ int session_create(char *name, uid_t uid, gid_t gid)
         * up and, if valid, assign it to the session.
         */
 
-       DBG("Tracing session %s created with ID %u by UID %d GID %d", name,
-                       new_session->id, new_session->uid, new_session->gid);
+       DBG("Tracing session %s created with ID %" PRIu64 " by UID %d GID %d",
+                       name, new_session->id, new_session->uid, new_session->gid);
 
        return LTTNG_OK;
 
This page took 0.02631 seconds and 5 git commands to generate.