diff --git a/src/tvheadend.h b/src/tvheadend.h index f03ae96d..0ceb242c 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -440,10 +440,18 @@ static inline const char *tvh_strbegins(const char *s1, const char *s2) return s1; } +typedef struct th_pipe +{ + int rd; + int wr; +} th_pipe_t; + int tvh_open(const char *pathname, int flags, mode_t mode); int tvh_socket(int domain, int type, int protocol); +int tvh_pipe(int flags, th_pipe_t *pipe); + void hexdump(const char *pfx, const uint8_t *data, int len); uint32_t tvh_crc32(uint8_t *data, size_t datalen, uint32_t crc); diff --git a/src/wrappers.c b/src/wrappers.c index ce38af94..fd374ec8 100644 --- a/src/wrappers.c +++ b/src/wrappers.c @@ -1,6 +1,7 @@ #include #include /* See NOTES */ #include +#include #include "tvheadend.h" int @@ -29,3 +30,21 @@ tvh_socket(int domain, int type, int protocol) pthread_mutex_unlock(&fork_lock); return fd; } + +int +tvh_pipe(int flags, th_pipe_t *p) +{ + int fd[2], err; + pthread_mutex_lock(&fork_lock); + err = pipe(fd); + if (err != -1) { + fcntl(fd[0], F_SETFD, fcntl(fd[0], F_GETFD) | FD_CLOEXEC); + fcntl(fd[1], F_SETFD, fcntl(fd[1], F_GETFD) | FD_CLOEXEC); + fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | flags); + fcntl(fd[1], F_SETFL, fcntl(fd[1], F_GETFL) | flags); + p->rd = fd[0]; + p->wr = fd[1]; + } + pthread_mutex_unlock(&fork_lock); + return err; +}