X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fpipe.c;h=e052e6fe09f951bcfd3f7c68090530cd1c39e02b;hp=52ee08a978e5a3a1f9b8ecd45b697b7106956120;hb=a0377dfefe40662ba7d68617bce6ff467114136c;hpb=55dfb029ae73f7a8987c00154ffdddabdf4a1e8c diff --git a/src/common/pipe.c b/src/common/pipe.c index 52ee08a97..e052e6fe0 100644 --- a/src/common/pipe.c +++ b/src/common/pipe.c @@ -1,22 +1,11 @@ /* - * Copyright (C) 2013 - David Goulet + * Copyright (C) 2013 David Goulet * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, version 2 only, as - * published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _LGPL_SOURCE -#include #include #include #include @@ -67,7 +56,7 @@ static int _pipe_read_close(struct lttng_pipe *pipe) { int ret, ret_val = 0; - assert(pipe); + LTTNG_ASSERT(pipe); if (!lttng_pipe_is_read_open(pipe)) { goto end; @@ -95,7 +84,7 @@ static int _pipe_write_close(struct lttng_pipe *pipe) { int ret, ret_val = 0; - assert(pipe); + LTTNG_ASSERT(pipe); if (!lttng_pipe_is_write_open(pipe)) { goto end; @@ -154,9 +143,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 +235,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 +243,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; @@ -264,7 +270,7 @@ int lttng_pipe_read_close(struct lttng_pipe *pipe) { int ret; - assert(pipe); + LTTNG_ASSERT(pipe); /* Handle read side first. */ lock_read_side(pipe); @@ -284,7 +290,7 @@ int lttng_pipe_write_close(struct lttng_pipe *pipe) { int ret; - assert(pipe); + LTTNG_ASSERT(pipe); lock_write_side(pipe); ret = _pipe_write_close(pipe); @@ -303,7 +309,7 @@ int lttng_pipe_close(struct lttng_pipe *pipe) { int ret, ret_val = 0; - assert(pipe); + LTTNG_ASSERT(pipe); ret = lttng_pipe_read_close(pipe); if (ret < 0) { @@ -335,9 +341,9 @@ void lttng_pipe_destroy(struct lttng_pipe *pipe) * succeed so we unlock them after the close pipe below. */ ret = pthread_mutex_trylock(&pipe->read_mutex); - assert(!ret); + LTTNG_ASSERT(!ret); ret = pthread_mutex_trylock(&pipe->write_mutex); - assert(!ret); + LTTNG_ASSERT(!ret); /* Close pipes WITHOUT trying to lock the pipes. */ (void) _pipe_read_close(pipe); @@ -363,8 +369,8 @@ ssize_t lttng_pipe_read(struct lttng_pipe *pipe, void *buf, size_t count) { ssize_t ret; - assert(pipe); - assert(buf); + LTTNG_ASSERT(pipe); + LTTNG_ASSERT(buf); lock_read_side(pipe); if (!lttng_pipe_is_read_open(pipe)) { @@ -390,8 +396,8 @@ ssize_t lttng_pipe_write(struct lttng_pipe *pipe, const void *buf, { ssize_t ret; - assert(pipe); - assert(buf); + LTTNG_ASSERT(pipe); + LTTNG_ASSERT(buf); lock_write_side(pipe); if (!lttng_pipe_is_write_open(pipe)) {