X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fcmd.c;h=27acbada09627970ee2c6a46ebe301bacf4e2ae9;hp=803a88090c95d28a733f7e04614238c830980055;hb=a1ae2ea59428174575b7328b1062a6248d636b72;hpb=d40f035921a2d3be652d31bdcc250db521f96209 diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 803a88090..27acbada0 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -2373,6 +2373,113 @@ error: return -ret; } +static +int domain_mkdir(const struct consumer_output *output, + const struct ltt_session *session, + uid_t uid, gid_t gid) +{ + struct consumer_socket *socket; + struct lttng_ht_iter iter; + int ret; + char *path = NULL; + + if (!output || !output->socks) { + ERR("No consumer output found"); + ret = -1; + goto end; + } + + path = zmalloc(LTTNG_PATH_MAX * sizeof(char)); + if (!path) { + ERR("Cannot allocate mkdir path"); + ret = -1; + goto end; + } + + ret = snprintf(path, LTTNG_PATH_MAX, "%s%s%s", + session_get_base_path(session), + output->chunk_path, output->subdir); + if (ret < 0 || ret >= LTTNG_PATH_MAX) { + ERR("Format path"); + ret = -1; + goto end; + } + + DBG("Domain mkdir %s for session %" PRIu64, path, session->id); + rcu_read_lock(); + /* + * We have to iterate to find a socket, but we only need to send the + * rename command to one consumer, so we break after the first one. + */ + cds_lfht_for_each_entry(output->socks->ht, &iter.iter, socket, node.node) { + pthread_mutex_lock(socket->lock); + ret = consumer_mkdir(socket, session->id, output, path, uid, gid); + pthread_mutex_unlock(socket->lock); + if (ret) { + ERR("Consumer mkdir"); + ret = -1; + goto end_unlock; + } + break; + } + + ret = 0; + +end_unlock: + rcu_read_unlock(); +end: + free(path); + return ret; +} + +static +int session_mkdir(const struct ltt_session *session) +{ + int ret; + struct consumer_output *output; + uid_t uid; + gid_t gid; + + /* + * Unsupported feature in lttng-relayd before 2.11, not an error since it + * is only needed for session rotation and the user will get an error + * on rotate. + */ + if (session->consumer->type == CONSUMER_DST_NET && + session->consumer->relay_major_version == 2 && + session->consumer->relay_minor_version < 11) { + ret = 0; + goto end; + } + + if (session->kernel_session) { + output = session->kernel_session->consumer; + uid = session->kernel_session->uid; + gid = session->kernel_session->gid; + ret = domain_mkdir(output, session, uid, gid); + if (ret) { + ERR("Mkdir kernel"); + goto end; + } + } + + if (session->ust_session) { + output = session->ust_session->consumer; + uid = session->ust_session->uid; + gid = session->ust_session->gid; + ret = domain_mkdir(output, session, uid, gid); + if (ret) { + ERR("Mkdir UST"); + goto end; + } + } + + ret = 0; + +end: + return ret; +} + /* * Command LTTNG_START_TRACE processed by the client thread. *