/* * Init configuration directory and file. * On success, returns 0; * on error, returns -1. */ int config_init(char *session_name) { int ret; char *path; path = utils_get_home_dir(); if (path == NULL) { ret = -1; goto error; } /* Create default config file */ ret = create_config_file(path); if (ret < 0) { goto error; } ret = config_add_session_name(path, session_name); if (ret < 0) { goto error; } DBG("Init config session in %s", path); error: return ret; }
/* * Destroys the default config */ void config_destroy_default(void) { char *path = utils_get_home_dir(); if (path == NULL) { return; } config_destroy(path); }
static char *create_output_path_auto(char *path_name) { int ret; char *traces_path = NULL; char *alloc_path = NULL; char *default_path; default_path = utils_get_home_dir(); if (default_path == NULL) { ERR("Home path not found.\n \ Please specify an output path using -o, --output PATH"); goto exit; }
/* * Set sessiond socket path by putting it in the global sessiond_sock_path * variable. * * Returns 0 on success, negative value on failure (the sessiond socket path * is somehow too long or ENOMEM). */ static int set_session_daemon_path(void) { int in_tgroup = 0; /* In tracing group */ uid_t uid; uid = getuid(); if (uid != 0) { /* Are we in the tracing group ? */ in_tgroup = lttng_check_tracing_group(); } if ((uid == 0) || in_tgroup) { lttng_ctl_copy_string(sessiond_sock_path, DEFAULT_GLOBAL_CLIENT_UNIX_SOCK, sizeof(sessiond_sock_path)); } if (uid != 0) { int ret; if (in_tgroup) { /* Tracing group */ ret = try_connect_sessiond(sessiond_sock_path); if (ret >= 0) { goto end; } /* Global session daemon not available... */ } /* ...or not in tracing group (and not root), default */ /* * 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) */ ret = snprintf(sessiond_sock_path, sizeof(sessiond_sock_path), DEFAULT_HOME_CLIENT_UNIX_SOCK, utils_get_home_dir()); if ((ret < 0) || (ret >= sizeof(sessiond_sock_path))) { goto error; } } end: return 0; error: return -1; }
static int setup_health_path(void) { int is_root, ret = 0; enum lttng_consumer_type type; const char *home_path; type = lttng_consumer_get_type(); is_root = !getuid(); if (is_root) { if (strlen(health_unix_sock_path) != 0) { goto end; } switch (type) { case LTTNG_CONSUMER_KERNEL: snprintf(health_unix_sock_path, sizeof(health_unix_sock_path), DEFAULT_GLOBAL_KCONSUMER_HEALTH_UNIX_SOCK); break; case LTTNG_CONSUMER64_UST: snprintf(health_unix_sock_path, sizeof(health_unix_sock_path), DEFAULT_GLOBAL_USTCONSUMER64_HEALTH_UNIX_SOCK); break; case LTTNG_CONSUMER32_UST: snprintf(health_unix_sock_path, sizeof(health_unix_sock_path), DEFAULT_GLOBAL_USTCONSUMER32_HEALTH_UNIX_SOCK); break; default: ret = -EINVAL; goto end; } } else { home_path = utils_get_home_dir(); if (home_path == NULL) { /* TODO: Add --socket PATH option */ ERR("Can't get HOME directory for sockets creation."); ret = -EPERM; goto end; } /* Set health check Unix path */ if (strlen(health_unix_sock_path) != 0) { goto end; } switch (type) { case LTTNG_CONSUMER_KERNEL: snprintf(health_unix_sock_path, sizeof(health_unix_sock_path), DEFAULT_HOME_KCONSUMER_HEALTH_UNIX_SOCK, home_path); break; case LTTNG_CONSUMER64_UST: snprintf(health_unix_sock_path, sizeof(health_unix_sock_path), DEFAULT_HOME_USTCONSUMER64_HEALTH_UNIX_SOCK, home_path); break; case LTTNG_CONSUMER32_UST: snprintf(health_unix_sock_path, sizeof(health_unix_sock_path), DEFAULT_HOME_USTCONSUMER32_HEALTH_UNIX_SOCK, home_path); break; default: ret = -EINVAL; goto end; } } end: return ret; }
static int setup_health_path(void) { int is_root, ret = 0; char *home_path = NULL, *rundir = NULL, *relayd_path = NULL; ret = parse_health_env(); if (ret) { return ret; } is_root = !getuid(); if (is_root) { rundir = strdup(DEFAULT_LTTNG_RUNDIR); if (!rundir) { ret = -ENOMEM; goto end; } } else { /* * Create rundir from home path. This will create something like * $HOME/.lttng */ home_path = utils_get_home_dir(); if (home_path == NULL) { /* TODO: Add --socket PATH option */ ERR("Can't get HOME directory for sockets creation."); ret = -EPERM; goto end; } ret = asprintf(&rundir, DEFAULT_LTTNG_HOME_RUNDIR, home_path); if (ret < 0) { ret = -ENOMEM; goto end; } } ret = asprintf(&relayd_path, DEFAULT_RELAYD_PATH, rundir); if (ret < 0) { ret = -ENOMEM; goto end; } ret = create_lttng_rundir_with_perm(rundir); if (ret < 0) { goto end; } ret = create_lttng_rundir_with_perm(relayd_path); if (ret < 0) { goto end; } if (is_root) { if (strlen(health_unix_sock_path) != 0) { goto end; } snprintf(health_unix_sock_path, sizeof(health_unix_sock_path), DEFAULT_GLOBAL_RELAY_HEALTH_UNIX_SOCK, (int) getpid()); } else { /* Set health check Unix path */ if (strlen(health_unix_sock_path) != 0) { goto end; } snprintf(health_unix_sock_path, sizeof(health_unix_sock_path), DEFAULT_HOME_RELAY_HEALTH_UNIX_SOCK, home_path, (int) getpid()); } end: free(rundir); free(relayd_path); return ret; }
struct lttng_notification_channel *lttng_notification_channel_create( struct lttng_endpoint *endpoint) { int fd, ret; bool is_in_tracing_group = false, is_root = false; char *sock_path = NULL; struct lttng_notification_channel *channel = NULL; if (!endpoint || endpoint != lttng_session_daemon_notification_endpoint) { goto end; } sock_path = zmalloc(LTTNG_PATH_MAX); if (!sock_path) { goto end; } channel = zmalloc(sizeof(struct lttng_notification_channel)); if (!channel) { goto end; } channel->socket = -1; pthread_mutex_init(&channel->lock, NULL); lttng_dynamic_buffer_init(&channel->reception_buffer); CDS_INIT_LIST_HEAD(&channel->pending_notifications.list); is_root = (getuid() == 0); if (!is_root) { is_in_tracing_group = lttng_check_tracing_group(); } if (is_root || is_in_tracing_group) { lttng_ctl_copy_string(sock_path, DEFAULT_GLOBAL_NOTIFICATION_CHANNEL_UNIX_SOCK, LTTNG_PATH_MAX); ret = lttcomm_connect_unix_sock(sock_path); if (ret >= 0) { fd = ret; goto set_fd; } } /* Fallback to local session daemon. */ ret = snprintf(sock_path, LTTNG_PATH_MAX, DEFAULT_HOME_NOTIFICATION_CHANNEL_UNIX_SOCK, utils_get_home_dir()); if (ret < 0 || ret >= LTTNG_PATH_MAX) { goto error; } ret = lttcomm_connect_unix_sock(sock_path); if (ret < 0) { goto error; } fd = ret; set_fd: channel->socket = fd; ret = handshake(channel); if (ret) { goto error; } end: free(sock_path); return channel; error: lttng_notification_channel_destroy(channel); channel = NULL; goto end; }