+#include "notification-thread-commands.h"
+#include "session.h"
+#include "lttng-sessiond.h"
+
+static char *create_channel_path(struct consumer_output *consumer,
+ size_t *consumer_path_offset)
+{
+ int ret;
+ char tmp_path[PATH_MAX];
+ char *pathname = NULL;
+
+ assert(consumer);
+
+ /* Get the right path name destination */
+ if (consumer->type == CONSUMER_DST_LOCAL ||
+ (consumer->type == CONSUMER_DST_NET &&
+ consumer->relay_major_version == 2 &&
+ consumer->relay_minor_version >= 11)) {
+ pathname = strdup(consumer->domain_subdir);
+ if (!pathname) {
+ PERROR("Failed to copy domain subdirectory string %s",
+ consumer->domain_subdir);
+ goto error;
+ }
+ *consumer_path_offset = strlen(consumer->domain_subdir);
+ DBG3("Kernel local consumer trace path relative to current trace chunk: \"%s\"",
+ pathname);
+ } else {
+ /* Network output, relayd < 2.11. */
+ ret = snprintf(tmp_path, sizeof(tmp_path), "%s%s",
+ consumer->dst.net.base_dir,
+ consumer->domain_subdir);
+ if (ret < 0) {
+ PERROR("snprintf kernel metadata path");
+ goto error;
+ } else if (ret >= sizeof(tmp_path)) {
+ ERR("Kernel channel path exceeds the maximal allowed length of of %zu bytes (%i bytes required) with path \"%s%s\"",
+ sizeof(tmp_path), ret,
+ consumer->dst.net.base_dir,
+ consumer->domain_subdir);
+ goto error;
+ }
+ pathname = lttng_strndup(tmp_path, sizeof(tmp_path));
+ if (!pathname) {
+ PERROR("lttng_strndup");
+ goto error;
+ }
+ *consumer_path_offset = 0;
+ DBG3("Kernel network consumer subdir path: %s", pathname);
+ }
+
+ return pathname;
+
+error:
+ free(pathname);
+ return NULL;
+}