X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fpipe.c;h=4fe45efada3e7dabfefd57b72b71cbcf167f2b03;hp=c8f00141574c3a6f11ce278a4c4a07d9cad1fa46;hb=b6151646d77a70cd8054543c07924c840646950b;hpb=9c2bd8db1c70269d37537b7d02bae41ccab29056 diff --git a/src/common/pipe.c b/src/common/pipe.c index c8f001415..4fe45efad 100644 --- a/src/common/pipe.c +++ b/src/common/pipe.c @@ -154,9 +154,28 @@ static int _pipe_set_flags(struct lttng_pipe *pipe, int flags) } for (i = 0; i < 2; i++) { - ret = fcntl(pipe->fd[i], F_SETFD, flags); - if (ret < 0) { - PERROR("fcntl lttng pipe %d", flags); + if (flags & O_NONBLOCK) { + ret = fcntl(pipe->fd[i], F_SETFL, O_NONBLOCK); + if (ret < 0) { + PERROR("fcntl lttng pipe %d", flags); + goto end; + } + } + if (flags & FD_CLOEXEC) { + ret = fcntl(pipe->fd[i], F_SETFD, FD_CLOEXEC); + if (ret < 0) { + PERROR("fcntl lttng pipe %d", flags); + goto end; + } + } + /* + * We only check for O_NONBLOCK or FD_CLOEXEC, if another flag is + * needed, we can add it, but for now just make sure we don't make + * mistakes with the parameters we pass. + */ + if (!(flags & O_NONBLOCK) && !(flags & FD_CLOEXEC)) { + fprintf(stderr, "Unsupported flag\n"); + ret = -1; goto end; } } @@ -227,7 +246,6 @@ struct lttng_pipe *lttng_pipe_named_open(const char *path, mode_t mode, fd_r = open(path, O_RDONLY | O_NONBLOCK); if (fd_r < 0) { PERROR("open fifo"); - ret = fd_r; goto error; } pipe->fd[0] = fd_r; @@ -236,7 +254,6 @@ struct lttng_pipe *lttng_pipe_named_open(const char *path, mode_t mode, fd_w = open(path, O_WRONLY | O_NONBLOCK); if (fd_w < 0) { PERROR("open fifo"); - ret = fd_w; goto error; } pipe->fd[1] = fd_w; @@ -404,3 +421,69 @@ error: unlock_write_side(pipe); return ret; } + +/* + * Return and release the read end of the pipe. + * + * This call transfers the ownership of the read fd of the underlying pipe + * to the caller if it is still open. + * + * Returns the fd of the read end of the pipe, or -1 if it was already closed or + * released. + */ +LTTNG_HIDDEN +int lttng_pipe_release_readfd(struct lttng_pipe *pipe) +{ + int ret; + + if (!pipe) { + ret = -1; + goto end; + } + + lock_read_side(pipe); + if (!lttng_pipe_is_read_open(pipe)) { + ret = -1; + goto end_unlock; + } + ret = pipe->fd[0]; + pipe->fd[0] = -1; + pipe->r_state = LTTNG_PIPE_STATE_CLOSED; +end_unlock: + unlock_read_side(pipe); +end: + return ret; +} + +/* + * Return and release the write end of the pipe. + * + * This call transfers the ownership of the write fd of the underlying pipe + * to the caller if it is still open. + * + * Returns the fd of the write end of the pipe, or -1 if it was alwritey closed + * or released. + */ +LTTNG_HIDDEN +int lttng_pipe_release_writefd(struct lttng_pipe *pipe) +{ + int ret; + + if (!pipe) { + ret = -1; + goto end; + } + + lock_write_side(pipe); + if (!lttng_pipe_is_write_open(pipe)) { + ret = -1; + goto end_unlock; + } + ret = pipe->fd[1]; + pipe->fd[1] = -1; + pipe->w_state = LTTNG_PIPE_STATE_CLOSED; +end_unlock: + unlock_write_side(pipe); +end: + return ret; +}