From: Jérémie Galarneau Date: Fri, 5 May 2017 02:53:22 +0000 (-0400) Subject: Add named pipe support to the pipe wrapper X-Git-Tag: v2.10.0-rc1~49 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=9c2bd8db1c70269d37537b7d02bae41ccab29056;p=lttng-tools.git Add named pipe support to the pipe wrapper Signed-off-by: Jérémie Galarneau --- diff --git a/src/common/pipe.c b/src/common/pipe.c index 00211238e..c8f001415 100644 --- a/src/common/pipe.c +++ b/src/common/pipe.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include @@ -112,6 +114,55 @@ end: return ret_val; } +static struct lttng_pipe *_pipe_create(void) +{ + int ret; + struct lttng_pipe *p; + + p = zmalloc(sizeof(*p)); + if (!p) { + PERROR("zmalloc pipe create"); + goto end; + } + p->fd[0] = p->fd[1] = -1; + + ret = pthread_mutex_init(&p->read_mutex, NULL); + if (ret) { + PERROR("pthread_mutex_init read lock pipe create"); + goto error_destroy; + } + ret = pthread_mutex_init(&p->write_mutex, NULL); + if (ret) { + PERROR("pthread_mutex_init write lock pipe create"); + goto error_destroy_rmutex; + } +end: + return p; +error_destroy_rmutex: + (void) pthread_mutex_destroy(&p->read_mutex); +error_destroy: + free(p); + return NULL; +} + +static int _pipe_set_flags(struct lttng_pipe *pipe, int flags) +{ + int i, ret = 0; + + if (!flags) { + goto end; + } + + for (i = 0; i < 2; i++) { + ret = fcntl(pipe->fd[i], F_SETFD, flags); + if (ret < 0) { + PERROR("fcntl lttng pipe %d", flags); + goto end; + } + } +end: + return ret; +} /* * Open a new lttng pipe and set flags using fcntl(). @@ -124,9 +175,8 @@ struct lttng_pipe *lttng_pipe_open(int flags) int ret; struct lttng_pipe *p; - p = zmalloc(sizeof(*p)); + p = _pipe_create(); if (!p) { - PERROR("zmalloc pipe open"); goto error; } @@ -135,32 +185,75 @@ struct lttng_pipe *lttng_pipe_open(int flags) PERROR("lttng pipe"); goto error; } + p->r_state = LTTNG_PIPE_STATE_OPENED; + p->w_state = LTTNG_PIPE_STATE_OPENED; - if (flags) { - int i; - - for (i = 0; i < 2; i++) { - ret = fcntl(p->fd[i], F_SETFD, flags); - if (ret < 0) { - PERROR("fcntl lttng pipe %d", flags); - goto error; - } - } + ret = _pipe_set_flags(p, flags); + if (ret) { + goto error; } - pthread_mutex_init(&p->read_mutex, NULL); - pthread_mutex_init(&p->write_mutex, NULL); - p->r_state = LTTNG_PIPE_STATE_OPENED; - p->w_state = LTTNG_PIPE_STATE_OPENED; p->flags = flags; return p; - error: lttng_pipe_destroy(p); return NULL; } +/* + * Open a new lttng pipe at path and set flags using fcntl(). + * + * 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) +{ + int ret, fd_r, fd_w; + struct lttng_pipe *pipe; + + pipe = _pipe_create(); + if (!pipe) { + goto error; + } + + ret = mkfifo(path, mode); + if (ret) { + PERROR("mkfifo"); + goto error; + } + + 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; + pipe->r_state = LTTNG_PIPE_STATE_OPENED; + + 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; + pipe->w_state = LTTNG_PIPE_STATE_OPENED; + + ret = _pipe_set_flags(pipe, flags); + if (ret) { + goto error; + } + pipe->flags = flags; + + return pipe; +error: + lttng_pipe_destroy(pipe); + return NULL; +} + /* * Close read side of a lttng pipe. * diff --git a/src/common/pipe.h b/src/common/pipe.h index 0bc2db325..1a1087c10 100644 --- a/src/common/pipe.h +++ b/src/common/pipe.h @@ -76,6 +76,9 @@ static inline int lttng_pipe_get_writefd(struct lttng_pipe *pipe) LTTNG_HIDDEN struct lttng_pipe *lttng_pipe_open(int flags); LTTNG_HIDDEN +struct lttng_pipe *lttng_pipe_named_open(const char *path, mode_t mode, + int flags); +LTTNG_HIDDEN int lttng_pipe_write_close(struct lttng_pipe *pipe); LTTNG_HIDDEN int lttng_pipe_read_close(struct lttng_pipe *pipe);