Move hash table to common/ directory
[lttng-tools.git] / lttng-sessiond / ust-app.c
index 6de177564a0c53b38af847b3453c72e740301cf1..12e9572455d8385b3cc406fce5be8bef67a4357e 100644 (file)
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <unistd.h>
+#include <runas.h>
 
 #include <urcu/compiler.h>
 #include <lttngerr.h>
 #include <lttng-share.h>
+#include <runas.h>
 
-#include "hashtable.h"
+#include "../common/hashtable.h"
 #include "ust-app.h"
 #include "ust-consumer.h"
 #include "ust-ctl.h"
@@ -769,7 +771,9 @@ static void shadow_copy_session(struct ust_app_session *ua_sess,
 
        DBG2("Shadow copy of session handle %d", ua_sess->handle);
 
+       ua_sess->id = usess->id;
        ua_sess->uid = usess->uid;
+       ua_sess->gid = usess->gid;
 
        ret = snprintf(ua_sess->path, PATH_MAX,
                        "%s/%s-%d-%s",
@@ -817,13 +821,13 @@ void __lookup_session_by_app(struct ltt_ust_session *usess,
 {
        /* Get right UST app session from app */
        (void) hashtable_lookup(app->sessions,
-                       (void *) ((unsigned long) usess->uid), sizeof(void *),
+                       (void *) ((unsigned long) usess->id), sizeof(void *),
                        iter);
 }
 
 /*
  * Return ust app session from the app session hashtable using the UST session
- * uid.
+ * id.
  */
 static struct ust_app_session *lookup_session_by_app(
                struct ltt_ust_session *usess, struct ust_app *app)
@@ -857,8 +861,8 @@ static struct ust_app_session *create_ust_app_session(
 
        ua_sess = lookup_session_by_app(usess, app);
        if (ua_sess == NULL) {
-               DBG2("UST app pid: %d session uid %d not found, creating it",
-                               app->key.pid, usess->uid);
+               DBG2("UST app pid: %d session id %d not found, creating it",
+                               app->key.pid, usess->id);
                ua_sess = alloc_ust_app_session();
                if (ua_sess == NULL) {
                        /* Only malloc can failed so something is really wrong */
@@ -881,7 +885,7 @@ static struct ust_app_session *create_ust_app_session(
 
                /* Add ust app session to app's HT */
                hashtable_node_init(&ua_sess->node,
-                               (void *)((unsigned long) ua_sess->uid), sizeof(void *));
+                               (void *)((unsigned long) ua_sess->id), sizeof(void *));
                hashtable_add_unique(app->sessions, &ua_sess->node);
 
                DBG2("UST app session created successfully with handle %d", ret);
@@ -1050,8 +1054,8 @@ static int enable_ust_app_channel(struct ust_app_session *ua_sess,
        ua_chan_node = hashtable_lookup(ua_sess->channels,
                        (void *)uchan->name, strlen(uchan->name), &iter);
        if (ua_chan_node == NULL) {
-               DBG2("Unable to find channel %s in ust session uid %u",
-                               uchan->name, ua_sess->uid);
+               DBG2("Unable to find channel %s in ust session id %u",
+                               uchan->name, ua_sess->id);
                goto error;
        }
 
@@ -1082,8 +1086,8 @@ static struct ust_app_channel *create_ust_app_channel(
        ua_chan_node = hashtable_lookup(ua_sess->channels,
                        (void *)uchan->name, strlen(uchan->name), &iter);
        if (ua_chan_node == NULL) {
-               DBG2("Unable to find channel %s in ust session uid %u",
-                               uchan->name, ua_sess->uid);
+               DBG2("Unable to find channel %s in ust session id %u",
+                               uchan->name, ua_sess->id);
                ua_chan = alloc_ust_app_channel(uchan->name, &uchan->attr);
                if (ua_chan == NULL) {
                        goto error;
@@ -1165,7 +1169,6 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess,
                char *pathname, struct ust_app *app)
 {
        int ret = 0;
-       mode_t old_umask;
 
        if (ua_sess->metadata == NULL) {
                /* Allocate UST metadata */
@@ -1191,13 +1194,12 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess,
                        goto error;
                }
 
-               old_umask = umask(0);
-               ret = mkdir(ua_sess->path, S_IRWXU | S_IRWXG);
+               ret = mkdir_run_as(ua_sess->path, S_IRWXU | S_IRWXG,
+                               ua_sess->uid, ua_sess->gid);
                if (ret < 0) {
                        PERROR("mkdir UST metadata");
                        goto error;
                }
-               umask(old_umask);
 
                ret = snprintf(ua_sess->metadata->pathname, PATH_MAX,
                                "%s/metadata", ua_sess->path);
@@ -1382,7 +1384,7 @@ int ust_app_list_events(struct lttng_event **events)
        rcu_read_lock();
 
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
-               struct lttng_ust_tracepoint_iter iter;
+               struct lttng_ust_tracepoint_iter uiter;
 
                handle = ustctl_tracepoint_list(app->key.sock);
                if (handle < 0) {
@@ -1392,7 +1394,7 @@ int ust_app_list_events(struct lttng_event **events)
                }
 
                while ((ret = ustctl_tracepoint_list_get(app->key.sock, handle,
-                                               &iter)) != -ENOENT) {
+                                               &uiter)) != -ENOENT) {
                        if (count >= nbmem) {
                                DBG2("Reallocating event list from %zu to %zu entries", nbmem,
                                                2 * nbmem);
@@ -1404,9 +1406,9 @@ int ust_app_list_events(struct lttng_event **events)
                                        goto rcu_error;
                                }
                        }
-                       memcpy(tmp[count].name, iter.name, LTTNG_UST_SYM_NAME_LEN);
-                       memcpy(tmp[count].loglevel, iter.loglevel, LTTNG_UST_SYM_NAME_LEN);
-                       tmp[count].loglevel_value = iter.loglevel_value;
+                       memcpy(tmp[count].name, uiter.name, LTTNG_UST_SYM_NAME_LEN);
+                       memcpy(tmp[count].loglevel, uiter.loglevel, LTTNG_UST_SYM_NAME_LEN);
+                       tmp[count].loglevel_value = uiter.loglevel_value;
                        tmp[count].type = LTTNG_UST_TRACEPOINT;
                        tmp[count].pid = app->key.pid;
                        tmp[count].enabled = -1;
@@ -1478,13 +1480,15 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
                goto error;
        }
 
-       DBG2("UST app disabling channel %s from global domain for session uid %d",
-                       uchan->name, usess->uid);
+       DBG2("UST app disabling channel %s from global domain for session id %d",
+                       uchan->name, usess->id);
 
        rcu_read_lock();
 
        /* For every registered applications */
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
+               struct cds_lfht_iter uiter;
+
                ua_sess = lookup_session_by_app(usess, app);
                if (ua_sess == NULL) {
                        continue;
@@ -1492,7 +1496,7 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess,
 
                /* Get channel */
                ua_chan_node = hashtable_lookup(ua_sess->channels,
-                               (void *)uchan->name, strlen(uchan->name), &iter);
+                               (void *)uchan->name, strlen(uchan->name), &uiter);
                /* If the session if found for the app, the channel must be there */
                assert(ua_chan_node);
 
@@ -1531,8 +1535,8 @@ int ust_app_enable_channel_glb(struct ltt_ust_session *usess,
                goto error;
        }
 
-       DBG2("UST app enabling channel %s to global domain for session uid %d",
-                       uchan->name, usess->uid);
+       DBG2("UST app enabling channel %s to global domain for session id %d",
+                       uchan->name, usess->id);
 
        rcu_read_lock();
 
@@ -1564,7 +1568,7 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
                struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent)
 {
        int ret = 0;
-       struct cds_lfht_iter iter, uiter;
+       struct cds_lfht_iter iter;
        struct cds_lfht_node *ua_chan_node, *ua_event_node;
        struct ust_app *app;
        struct ust_app_session *ua_sess;
@@ -1572,12 +1576,14 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
        struct ust_app_event *ua_event;
 
        DBG("UST app disabling event %s for all apps in channel "
-                       "%s for session uid %d", uevent->attr.name, uchan->name, usess->uid);
+                       "%s for session id %d", uevent->attr.name, uchan->name, usess->id);
 
        rcu_read_lock();
 
        /* For all registered applications */
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
+               struct cds_lfht_iter uiter;
+
                ua_sess = lookup_session_by_app(usess, app);
                if (ua_sess == NULL) {
                        /* Next app */
@@ -1588,8 +1594,8 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
                ua_chan_node = hashtable_lookup(ua_sess->channels,
                                (void *)uchan->name, strlen(uchan->name), &uiter);
                if (ua_chan_node == NULL) {
-                       DBG2("Channel %s not found in session uid %d for app pid %d."
-                                       "Skipping", uchan->name, usess->uid, app->key.pid);
+                       DBG2("Channel %s not found in session id %d for app pid %d."
+                                       "Skipping", uchan->name, usess->id, app->key.pid);
                        continue;
                }
                ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
@@ -1623,7 +1629,7 @@ int ust_app_disable_all_event_glb(struct ltt_ust_session *usess,
                struct ltt_ust_channel *uchan)
 {
        int ret = 0;
-       struct cds_lfht_iter iter, uiter;
+       struct cds_lfht_iter iter;
        struct cds_lfht_node *ua_chan_node;
        struct ust_app *app;
        struct ust_app_session *ua_sess;
@@ -1631,12 +1637,14 @@ int ust_app_disable_all_event_glb(struct ltt_ust_session *usess,
        struct ust_app_event *ua_event;
 
        DBG("UST app disabling all event for all apps in channel "
-                       "%s for session uid %d", uchan->name, usess->uid);
+                       "%s for session id %d", uchan->name, usess->id);
 
        rcu_read_lock();
 
        /* For all registered applications */
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
+               struct cds_lfht_iter uiter;
+
                ua_sess = lookup_session_by_app(usess, app);
                /* If ua_sess is NULL, there is a code flow error */
                assert(ua_sess);
@@ -1682,8 +1690,8 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess,
                goto error;
        }
 
-       DBG2("UST app adding channel %s to global domain for session uid %d",
-                       uchan->name, usess->uid);
+       DBG2("UST app adding channel %s to global domain for session id %d",
+                       uchan->name, usess->id);
 
        rcu_read_lock();
 
@@ -1719,15 +1727,15 @@ int ust_app_enable_event_glb(struct ltt_ust_session *usess,
                struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent)
 {
        int ret = 0;
-       struct cds_lfht_iter iter, uiter;
+       struct cds_lfht_iter iter;
        struct cds_lfht_node *ua_chan_node, *ua_event_node;
        struct ust_app *app;
        struct ust_app_session *ua_sess;
        struct ust_app_channel *ua_chan;
        struct ust_app_event *ua_event;
 
-       DBG("UST app enabling event %s for all apps for session uid %d",
-                       uevent->attr.name, usess->uid);
+       DBG("UST app enabling event %s for all apps for session id %d",
+                       uevent->attr.name, usess->id);
 
        /*
         * NOTE: At this point, this function is called only if the session and
@@ -1739,6 +1747,8 @@ int ust_app_enable_event_glb(struct ltt_ust_session *usess,
 
        /* For all registered applications */
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
+               struct cds_lfht_iter uiter;
+
                ua_sess = lookup_session_by_app(usess, app);
                /* If ua_sess is NULL, there is a code flow error */
                assert(ua_sess);
@@ -1779,14 +1789,14 @@ int ust_app_create_event_glb(struct ltt_ust_session *usess,
                struct ltt_ust_channel *uchan, struct ltt_ust_event *uevent)
 {
        int ret = 0;
-       struct cds_lfht_iter iter, uiter;
+       struct cds_lfht_iter iter;
        struct cds_lfht_node *ua_chan_node;
        struct ust_app *app;
        struct ust_app_session *ua_sess;
        struct ust_app_channel *ua_chan;
 
-       DBG("UST app creating event %s for all apps for session uid %d",
-                       uevent->attr.name, usess->uid);
+       DBG("UST app creating event %s for all apps for session id %d",
+                       uevent->attr.name, usess->id);
 
        /*
         * NOTE: At this point, this function is called only if the session and
@@ -1798,6 +1808,8 @@ int ust_app_create_event_glb(struct ltt_ust_session *usess,
 
        /* For all registered applications */
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
+               struct cds_lfht_iter uiter;
+
                ua_sess = lookup_session_by_app(usess, app);
                /* If ua_sess is NULL, there is a code flow error */
                assert(ua_sess);
@@ -2120,8 +2132,8 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
                goto error;
        }
 
-       DBG2("UST app global update for app sock %d for session uid %d", sock,
-                       usess->uid);
+       DBG2("UST app global update for app sock %d for session id %d", sock,
+                       usess->id);
 
        rcu_read_lock();
 
@@ -2142,6 +2154,8 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
         * ltt ust session.
         */
        cds_lfht_for_each_entry(ua_sess->channels, &iter, ua_chan, node) {
+               struct cds_lfht_iter uiter;
+
                ret = create_ust_channel(app, ua_sess, ua_chan);
                if (ret < 0) {
                        /* FIXME: Should we quit here or continue... */
@@ -2149,7 +2163,7 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
                }
 
                /* For each events */
-               cds_lfht_for_each_entry(ua_chan->events, &iter, ua_event, node) {
+               cds_lfht_for_each_entry(ua_chan->events, &uiter, ua_event, node) {
                        ret = create_ust_event(app, ua_sess, ua_chan, ua_event);
                        if (ret < 0) {
                                /* FIXME: Should we quit here or continue... */
@@ -2180,7 +2194,7 @@ int ust_app_add_ctx_channel_glb(struct ltt_ust_session *usess,
 {
        int ret = 0;
        struct cds_lfht_node *ua_chan_node;
-       struct cds_lfht_iter iter, uiter;
+       struct cds_lfht_iter iter;
        struct ust_app_channel *ua_chan = NULL;
        struct ust_app_session *ua_sess;
        struct ust_app *app;
@@ -2188,6 +2202,8 @@ int ust_app_add_ctx_channel_glb(struct ltt_ust_session *usess,
        rcu_read_lock();
 
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
+               struct cds_lfht_iter uiter;
+
                ua_sess = lookup_session_by_app(usess, app);
                if (ua_sess == NULL) {
                        continue;
@@ -2221,7 +2237,7 @@ int ust_app_add_ctx_event_glb(struct ltt_ust_session *usess,
 {
        int ret = 0;
        struct cds_lfht_node *ua_chan_node, *ua_event_node;
-       struct cds_lfht_iter iter, uiter;
+       struct cds_lfht_iter iter;
        struct ust_app_session *ua_sess;
        struct ust_app_event *ua_event;
        struct ust_app_channel *ua_chan = NULL;
@@ -2230,6 +2246,8 @@ int ust_app_add_ctx_event_glb(struct ltt_ust_session *usess,
        rcu_read_lock();
 
        cds_lfht_for_each_entry(ust_app_ht, &iter, app, node) {
+               struct cds_lfht_iter uiter;
+
                ua_sess = lookup_session_by_app(usess, app);
                if (ua_sess == NULL) {
                        continue;
This page took 0.031659 seconds and 4 git commands to generate.