/* * 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; }
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; }