X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Futils.c;h=d0c8dd16f62571618db8118759d7a8ee4e650a76;hp=ce2e97561f0170c3dbdb072370e79b1e5ec502ae;hb=ef599319218f03ff160778e577cd8389a165f47c;hpb=6364a07adde1072d595044a19359e61fc27940dd diff --git a/src/bin/lttng-sessiond/utils.c b/src/bin/lttng-sessiond/utils.c index ce2e97561..d0c8dd16f 100644 --- a/src/bin/lttng-sessiond/utils.c +++ b/src/bin/lttng-sessiond/utils.c @@ -18,6 +18,7 @@ #define _GNU_SOURCE #include +#include #include #include #include @@ -52,3 +53,77 @@ const char *get_home_dir(void) { return ((const char *) getenv("HOME")); } + +/* + * Create a pipe in dst. + */ +int utils_create_pipe(int *dst) +{ + int ret; + + if (dst == NULL) { + return -1; + } + + ret = pipe(dst); + if (ret < 0) { + PERROR("create pipe"); + } + + return 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 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; + } + } + +error: + return ret; +} + +/* + * Close both read and write side of the pipe. + */ +void utils_close_pipe(int *src) +{ + int i, ret; + + if (src == NULL) { + return; + } + + for (i = 0; i < 2; i++) { + /* Safety check */ + if (src[i] < 0) { + continue; + } + + ret = close(src[i]); + if (ret) { + PERROR("close pipe"); + } + } +}