Don't really need O_CLOEXEC, instead rely on mutexes and fcntl() instead
Also add wrapper call for setting FD_CLOEXEC on sockets
This commit is contained in:
parent
489e102834
commit
6846e3a21d
9 changed files with 46 additions and 12 deletions
|
@ -343,7 +343,7 @@ capmt_thread(void *aux)
|
|||
pthread_mutex_unlock(&global_lock);
|
||||
|
||||
/* open connection to camd.socket */
|
||||
capmt->capmt_sock = socket(AF_LOCAL, SOCK_STREAM, 0);
|
||||
capmt->capmt_sock = tvh_socket(AF_LOCAL, SOCK_STREAM, 0);
|
||||
|
||||
struct sockaddr_un serv_addr_un;
|
||||
memset(&serv_addr_un, 0, sizeof(serv_addr_un));
|
||||
|
@ -354,7 +354,7 @@ capmt_thread(void *aux)
|
|||
capmt->capmt_connected = 1;
|
||||
|
||||
/* open connection to emulated ca0 device */
|
||||
capmt->capmt_sock_ca0 = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
capmt->capmt_sock_ca0 = tvh_socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
|
||||
struct sockaddr_in serv_addr;
|
||||
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
|
||||
|
|
|
@ -185,7 +185,7 @@ iptv_transport_start(th_transport_t *t, unsigned int weight, int force_start)
|
|||
|
||||
/* Now, open the real socket for UDP */
|
||||
|
||||
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
fd = tvh_socket(AF_INET, SOCK_DGRAM, 0);
|
||||
if(fd == -1) {
|
||||
tvhlog(LOG_ERR, "IPTV", "\"%s\" cannot open socket", t->tht_identifier);
|
||||
return -1;
|
||||
|
|
|
@ -137,7 +137,7 @@ output_multicast_load(struct config_head *head)
|
|||
|
||||
om = calloc(1, sizeof(output_multicast_t));
|
||||
|
||||
om->om_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
om->om_fd = tvh_socket(AF_INET, SOCK_DGRAM, 0);
|
||||
|
||||
if((b = config_get_str_sub(head, "interface-address", NULL)) != NULL) {
|
||||
memset(&sin, 0, sizeof(sin));
|
||||
|
|
|
@ -67,6 +67,7 @@ time_t dispatch_clock;
|
|||
static LIST_HEAD(, gtimer) gtimers;
|
||||
pthread_mutex_t global_lock;
|
||||
pthread_mutex_t ffmpeg_lock;
|
||||
pthread_mutex_t fork_lock;
|
||||
static int log_stderr;
|
||||
static int log_decorate;
|
||||
|
||||
|
@ -332,7 +333,7 @@ main(int argc, char **argv)
|
|||
hts_settings_init("tvheadend", homedir);
|
||||
|
||||
pthread_mutex_init(&ffmpeg_lock, NULL);
|
||||
|
||||
pthread_mutex_init(&fork_lock, NULL);
|
||||
pthread_mutex_init(&global_lock, NULL);
|
||||
|
||||
pthread_mutex_lock(&global_lock);
|
||||
|
|
|
@ -832,7 +832,7 @@ rtsp_setup_udp(http_connection_t *hc, rtsp_t *rtsp,
|
|||
|
||||
|
||||
retry:
|
||||
fd[0] = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
fd[0] = tvh_socket(AF_INET, SOCK_DGRAM, 0);
|
||||
|
||||
memset(&sin, 0, sizeof(struct sockaddr_in));
|
||||
sin.sin_family = AF_INET;
|
||||
|
@ -851,7 +851,7 @@ rtsp_setup_udp(http_connection_t *hc, rtsp_t *rtsp,
|
|||
|
||||
sin.sin_port = htons(server_ports[1]);
|
||||
|
||||
fd[1] = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
fd[1] = tvh_socket(AF_INET, SOCK_DGRAM, 0);
|
||||
|
||||
if(bind(fd[1], (struct sockaddr *)&sin, sizeof(sin)) == -1) {
|
||||
close(fd[0]);
|
||||
|
|
|
@ -146,12 +146,17 @@ spawn_and_store_stdout(const char *prog, char *const argv[], char **outp)
|
|||
argv = (void *)local_argv;
|
||||
}
|
||||
|
||||
if(pipe(fd) == -1)
|
||||
pthread_mutex_lock(&fork_lock);
|
||||
|
||||
if(pipe(fd) == -1) {
|
||||
pthread_mutex_unlock(&fork_lock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
p = fork();
|
||||
|
||||
if(p == -1) {
|
||||
pthread_mutex_unlock(&fork_lock);
|
||||
syslog(LOG_ERR, "spawn: Unable to fork() for \"%s\" -- %s",
|
||||
prog, strerror(errno));
|
||||
return -1;
|
||||
|
@ -170,6 +175,8 @@ spawn_and_store_stdout(const char *prog, char *const argv[], char **outp)
|
|||
exit(1);
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&fork_lock);
|
||||
|
||||
spawn_enq(prog, p);
|
||||
|
||||
close(fd[1]);
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <arpa/inet.h>
|
||||
|
||||
#include "tcp.h"
|
||||
#include "tvhead.h"
|
||||
|
||||
|
||||
/**
|
||||
|
@ -94,7 +95,7 @@ tcp_connect(const char *hostname, int port, char *errbuf, size_t errbufsize,
|
|||
free(tmphstbuf);
|
||||
return -1;
|
||||
}
|
||||
fd = socket(hp->h_addrtype, SOCK_STREAM, 0);
|
||||
fd = tvh_socket(hp->h_addrtype, SOCK_STREAM, 0);
|
||||
if(fd == -1) {
|
||||
snprintf(errbuf, errbufsize, "Unable to create socket: %s",
|
||||
strerror(errno));
|
||||
|
@ -469,7 +470,7 @@ tcp_server_create(int port, tcp_server_callback_t *start, void *opaque)
|
|||
struct sockaddr_in s;
|
||||
int one = 1;
|
||||
memset(&e, 0, sizeof(e));
|
||||
fd = socket(AF_INET, SOCK_STREAM, 0);
|
||||
fd = tvh_socket(AF_INET, SOCK_STREAM, 0);
|
||||
if(fd == -1)
|
||||
return NULL;
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
|
||||
extern pthread_mutex_t global_lock;
|
||||
extern pthread_mutex_t ffmpeg_lock;
|
||||
extern pthread_mutex_t fork_lock;
|
||||
|
||||
typedef struct source_info {
|
||||
char *si_device;
|
||||
|
@ -735,4 +736,6 @@ extern void scopedunlock(pthread_mutex_t **mtxp);
|
|||
|
||||
int tvh_open(const char *pathname, int flags, mode_t mode);
|
||||
|
||||
int tvh_socket(int domain, int type, int protocol);
|
||||
|
||||
#endif /* TV_HEAD_H */
|
||||
|
|
|
@ -1,9 +1,31 @@
|
|||
#define _GNU_SOURCE
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h> /* See NOTES */
|
||||
#include <sys/socket.h>
|
||||
#include "tvhead.h"
|
||||
|
||||
int
|
||||
tvh_open(const char *pathname, int flags, mode_t mode)
|
||||
{
|
||||
return open(pathname, flags | O_CLOEXEC, mode);
|
||||
int fd;
|
||||
|
||||
pthread_mutex_lock(&fork_lock);
|
||||
fd = open(pathname, flags, mode);
|
||||
if (fd != -1)
|
||||
fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
|
||||
pthread_mutex_unlock(&fork_lock);
|
||||
return fd;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
tvh_socket(int domain, int type, int protocol)
|
||||
{
|
||||
int fd;
|
||||
|
||||
pthread_mutex_lock(&fork_lock);
|
||||
fd = socket(domain, type, protocol);
|
||||
if (fd != -1)
|
||||
fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
|
||||
pthread_mutex_unlock(&fork_lock);
|
||||
return fd;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue