diff options
| -rw-r--r-- | src/misc/syslog.c | 3 | ||||
| -rw-r--r-- | src/network/socket.c | 15 | 
2 files changed, 15 insertions, 3 deletions
| diff --git a/src/misc/syslog.c b/src/misc/syslog.c index a4f36dee..8de34f8d 100644 --- a/src/misc/syslog.c +++ b/src/misc/syslog.c @@ -51,8 +51,7 @@ static void __openlog(const char *ident, int opt, int facility)  	if (!(opt & LOG_NDELAY) || log_fd>=0) return; -	log_fd = socket(AF_UNIX, SOCK_DGRAM, 0); -	fcntl(log_fd, F_SETFD, FD_CLOEXEC); +	log_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0);  }  void openlog(const char *ident, int opt, int facility) diff --git a/src/network/socket.c b/src/network/socket.c index 4f1e86db..ba8d45b1 100644 --- a/src/network/socket.c +++ b/src/network/socket.c @@ -1,7 +1,20 @@  #include <sys/socket.h> +#include <fcntl.h> +#include <errno.h>  #include "syscall.h"  int socket(int domain, int type, int protocol)  { -	return socketcall(socket, domain, type, protocol, 0, 0, 0); +	int s = socketcall(socket, domain, type, protocol, 0, 0, 0); +	if (s<0 && errno==EINVAL && (type&(SOCK_CLOEXEC|SOCK_NONBLOCK))) { +		s = socketcall(socket, domain, +			type & ~(SOCK_CLOEXEC|SOCK_NONBLOCK), +			protocol, 0, 0, 0); +		if (s < 0) return s; +		if (type & SOCK_CLOEXEC) +			fcntl(s, F_SETFD, FD_CLOEXEC); +		if (type & SOCK_NONBLOCK) +			fcntl(s, F_SETFL, fcntl(s, F_GETFL) | O_NONBLOCK); +	} +	return s;  } | 
