Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
+#include <fcntl.h>
+#include <unistd.h>
#include <sys/poll.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/poll.h>
#include <sys/types.h>
#include <sys/time.h>
extern void *safe_malloc(size_t size, const char *message);
extern void *safe_malloc_ary(size_t size, size_t count, const char *message);
extern void *safe_malloc(size_t size, const char *message);
extern void *safe_malloc_ary(size_t size, size_t count, const char *message);
+void setcloexec(int fd); /* cannot fail */
+
extern int sys_cmd(const char *file, const char *argc, ...);
extern uint64_t now_global;
extern int sys_cmd(const char *file, const char *argc, ...);
extern uint64_t now_global;
st->interface_name=safe_malloc(10,"tun_apply");
sprintf(st->interface_name,"tun%d",ppa);
st->fd=tun_fd;
st->interface_name=safe_malloc(10,"tun_apply");
sprintf(st->interface_name,"tun%d",ppa);
st->fd=tun_fd;
+ setcloexec(if_ifd);
+ setcloexec(ip_ifd);
#else
fatal("tun_phase_hook: TUN_FLAVOUR_STREAMS unexpected");
#endif /* HAVE_TUN_STREAMS */
#else
fatal("tun_phase_hook: TUN_FLAVOUR_STREAMS unexpected");
#endif /* HAVE_TUN_STREAMS */
to set the TUN device's address, and route to add routes to all
our networks. */
to set the TUN device's address, and route to add routes to all
our networks. */
hostaddr=ipaddr_to_string(st->nl.local_address);
secnetaddr=ipaddr_to_string(st->nl.secnet_address);
snprintf(mtu,sizeof(mtu),"%d",st->nl.mtu);
hostaddr=ipaddr_to_string(st->nl.local_address);
secnetaddr=ipaddr_to_string(st->nl.secnet_address);
snprintf(mtu,sizeof(mtu),"%d",st->nl.mtu);
fatal_perror("udp (%s:%d): fcntl(set O_NONBLOCK)",
st->loc.file,st->loc.line);
}
fatal_perror("udp (%s:%d): fcntl(set O_NONBLOCK)",
st->loc.file,st->loc.line);
}
- if (fcntl(st->fd, F_SETFD, FD_CLOEXEC)==-1) {
- fatal_perror("udp (%s:%d): fcntl(set FD_CLOEXEC)",
- st->loc.file,st->loc.line);
- }
FILLZERO(addr);
addr.sin_family=AF_INET;
FILLZERO(addr);
addr.sin_family=AF_INET;
+void setcloexec(int fd) {
+ int r=fcntl(fd, F_GETFD);
+ if (r<0) fatal_perror("fcntl(,F_GETFD) failed");
+ r=fcntl(fd, F_SETFD, r|FD_CLOEXEC);
+ if (r<0) fatal_perror("fcntl(,F_SETFD,|FD_CLOEXEC) failed");
+}
+
static const char *phases[NR_PHASES]={
"PHASE_INIT",
"PHASE_GETOPTS",
static const char *phases[NR_PHASES]={
"PHASE_INIT",
"PHASE_GETOPTS",