X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fpipe.c;h=45be43fa3833fe21966b8377a9831e6c185b7540;hb=48a4000561343808724f7cb5fa8c131877489ccd;hp=4220a4089590d28121af9e3c2bb395c590b5c97a;hpb=258fbe9b0ff52ded4311ff8a94a9abfc079d1387;p=lttng-tools.git diff --git a/src/common/pipe.c b/src/common/pipe.c index 4220a4089..45be43fa3 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; } } @@ -169,7 +177,6 @@ end: * * Return a newly allocated lttng pipe on success or else NULL. */ -LTTNG_HIDDEN struct lttng_pipe *lttng_pipe_open(int flags) { int ret; @@ -206,7 +213,6 @@ error: * * Return a newly allocated lttng pipe on success or else NULL. */ -LTTNG_HIDDEN struct lttng_pipe *lttng_pipe_named_open(const char *path, mode_t mode, int flags) { @@ -257,12 +263,11 @@ error: * * Return 0 on success else a negative value. */ -LTTNG_HIDDEN int lttng_pipe_read_close(struct lttng_pipe *pipe) { int ret; - assert(pipe); + LTTNG_ASSERT(pipe); /* Handle read side first. */ lock_read_side(pipe); @@ -277,12 +282,11 @@ int lttng_pipe_read_close(struct lttng_pipe *pipe) * * Return 0 on success else a negative value. */ -LTTNG_HIDDEN 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); @@ -296,12 +300,11 @@ int lttng_pipe_write_close(struct lttng_pipe *pipe) * * Return 0 on success else a negative value. */ -LTTNG_HIDDEN 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) { @@ -319,7 +322,6 @@ int lttng_pipe_close(struct lttng_pipe *pipe) /* * Close and destroy a lttng pipe object. Finally, pipe is freed. */ -LTTNG_HIDDEN void lttng_pipe_destroy(struct lttng_pipe *pipe) { int ret; @@ -333,9 +335,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); @@ -356,13 +358,12 @@ void lttng_pipe_destroy(struct lttng_pipe *pipe) * Return "count" on success. Return < count on error. errno can be used * to check the actual error. */ -LTTNG_HIDDEN 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)) { @@ -382,14 +383,13 @@ error: * Return "count" on success. Return < count on error. errno can be used * to check the actual error. */ -LTTNG_HIDDEN ssize_t lttng_pipe_write(struct lttng_pipe *pipe, const void *buf, size_t count) { ssize_t ret; - assert(pipe); - assert(buf); + LTTNG_ASSERT(pipe); + LTTNG_ASSERT(buf); lock_write_side(pipe); if (!lttng_pipe_is_write_open(pipe)) { @@ -412,7 +412,6 @@ error: * 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; @@ -445,7 +444,6 @@ end: * 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;