X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fpipe.c;h=2544f7b45f76265a8d757d540686953047092758;hp=713db973972ab40de1b9414eebdf02b697545099;hb=8684af09caa3ca7014048753361c23d00f8e3be6;hpb=9fd926379bd4c6c17f2b3c39a5bbf9879bc74e14 diff --git a/src/common/pipe.c b/src/common/pipe.c index 713db9739..2544f7b45 100644 --- a/src/common/pipe.c +++ b/src/common/pipe.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -118,6 +119,7 @@ end: * * Return a newly allocated lttng pipe on success or else NULL. */ +LTTNG_HIDDEN struct lttng_pipe *lttng_pipe_open(int flags) { int ret; @@ -165,6 +167,7 @@ error: * * Return 0 on success else a negative value. */ +LTTNG_HIDDEN int lttng_pipe_read_close(struct lttng_pipe *pipe) { int ret; @@ -184,6 +187,7 @@ 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; @@ -202,6 +206,7 @@ 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; @@ -224,6 +229,7 @@ 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; @@ -257,51 +263,24 @@ void lttng_pipe_destroy(struct lttng_pipe *pipe) /* * Read on a lttng pipe and put the data in buf of at least size count. * - * Return 0 on success or else a negative errno message from read(2). + * 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, read_len, read_left, index; + ssize_t ret; assert(pipe); assert(buf); lock_read_side(pipe); - if (!lttng_pipe_is_read_open(pipe)) { - ret = -EBADF; + ret = -1; + errno = EBADF; goto error; } - - read_left = count; - index = 0; - do { - read_len = read(pipe->fd[0], buf + index, read_left); - if (read_len < 0) { - ret = -errno; - if (errno == EINTR) { - /* Read again. */ - continue; - } else if (errno == EAGAIN || errno == EWOULDBLOCK) { - /* - * Return the number of bytes read up to this point if any. - */ - if (index) { - ret = index; - } - goto error; - } else { - PERROR("lttng pipe read"); - goto error; - } - } - read_left -= read_len; - index += read_len; - } while (read_left > 0); - - /* Everything went fine. */ - ret = index; - + ret = lttng_read(pipe->fd[0], buf, count); error: unlock_read_side(pipe); return ret; @@ -310,52 +289,25 @@ error: /* * Write on a lttng pipe using the data in buf and size of count. * - * Return 0 on success or else a negative errno message from write(2). + * 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, write_len, write_left, index; + ssize_t ret; assert(pipe); assert(buf); lock_write_side(pipe); - if (!lttng_pipe_is_write_open(pipe)) { - ret = -EBADF; + ret = -1; + errno = EBADF; goto error; } - - write_left = count; - index = 0; - do { - write_len = write(pipe->fd[1], buf + index, write_left); - if (write_len < 0) { - ret = -errno; - if (errno == EINTR) { - /* Read again. */ - continue; - } else if (errno == EAGAIN || errno == EWOULDBLOCK) { - /* - * Return the number of bytes read up to this point if any. - */ - if (index) { - ret = index; - } - goto error; - } else { - PERROR("lttng pipe write"); - goto error; - } - } - write_left -= write_len; - index += write_len; - } while (write_left > 0); - - /* Everything went fine. */ - ret = index; - + ret = lttng_write(pipe->fd[1], buf, count); error: unlock_write_side(pipe); return ret;