X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Futils.c;h=99ec7772bfcf849da5730c5aeca3e7924e870261;hp=d0c8dd16f62571618db8118759d7a8ee4e650a76;hb=4a91420cefb94afc4a20042bdbe2564086dad3cb;hpb=ef599319218f03ff160778e577cd8389a165f47c diff --git a/src/bin/lttng-sessiond/utils.c b/src/bin/lttng-sessiond/utils.c index d0c8dd16f..99ec7772b 100644 --- a/src/bin/lttng-sessiond/utils.c +++ b/src/bin/lttng-sessiond/utils.c @@ -16,114 +16,101 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _GNU_SOURCE -#include -#include -#include -#include +#define _LGPL_SOURCE #include -#include #include #include #include "utils.h" +#include "lttng-sessiond.h" + +int ht_cleanup_pipe[2] = { -1, -1 }; /* * Write to writable pipe used to notify a thread. */ int notify_thread_pipe(int wpipe) { - int ret; + ssize_t ret; - ret = write(wpipe, "!", 1); - if (ret < 0) { - PERROR("write poll pipe"); + /* Ignore if the pipe is invalid. */ + if (wpipe < 0) { + return 0; } - return ret; -} + ret = lttng_write(wpipe, "!", 1); + if (ret < 1) { + PERROR("write poll pipe"); + } -/* - * Return pointer to home directory path using the env variable HOME. - * - * No home, NULL is returned. - */ -const char *get_home_dir(void) -{ - return ((const char *) getenv("HOME")); + return (int) ret; } -/* - * Create a pipe in dst. - */ -int utils_create_pipe(int *dst) +void ht_cleanup_push(struct lttng_ht *ht) { - int ret; + ssize_t ret; + int fd = ht_cleanup_pipe[1]; - if (dst == NULL) { - return -1; + if (!ht) { + return; } - - ret = pipe(dst); - if (ret < 0) { - PERROR("create pipe"); + if (fd < 0) + return; + ret = lttng_write(fd, &ht, sizeof(ht)); + if (ret < sizeof(ht)) { + PERROR("write ht cleanup pipe %d", fd); + if (ret < 0) { + ret = -errno; + } + goto error; } - return ret; + /* All good. Don't send back the write positive ret value. */ + ret = 0; +error: + assert(!ret); } -/* - * Create pipe and set CLOEXEC flag to both fd. - * - * Make sure the pipe opened by this function are closed at some point. Use - * utils_close_pipe(). - */ -int utils_create_pipe_cloexec(int *dst) +int loglevels_match(int a_loglevel_type, int a_loglevel_value, + int b_loglevel_type, int b_loglevel_value, int loglevel_all_type) { - int ret, i; - - if (dst == NULL) { - return -1; - } - - ret = utils_create_pipe(dst); - if (ret < 0) { - goto error; - } - - for (i = 0; i < 2; i++) { - ret = fcntl(dst[i], F_SETFD, FD_CLOEXEC); - if (ret < 0) { - PERROR("fcntl pipe cloexec"); - goto error; + int match = 1; + + if (a_loglevel_type == b_loglevel_type) { + /* Same loglevel type. */ + if (b_loglevel_type != loglevel_all_type) { + /* + * Loglevel value must also match since the loglevel + * type is not all. + */ + if (a_loglevel_value != b_loglevel_value) { + match = 0; + } } + } else { + /* Loglevel type is different: no match. */ + match = 0; } -error: - return ret; + return match; } -/* - * Close both read and write side of the pipe. - */ -void utils_close_pipe(int *src) +const char *session_get_base_path(const struct ltt_session *session) { - int i, ret; - - if (src == NULL) { - return; + struct consumer_output *consumer; + + if (session->kernel_session) { + consumer = session->kernel_session->consumer; + } else if (session->ust_session) { + consumer = session->ust_session->consumer; + } else { + abort(); } - for (i = 0; i < 2; i++) { - /* Safety check */ - if (src[i] < 0) { - continue; - } - - ret = close(src[i]); - if (ret) { - PERROR("close pipe"); - } + if (session->net_handle > 0) { + return consumer->dst.net.base_dir; + } else { + return consumer->dst.session_root_path; } }