From 44db09d60d8f3a3427c35c9269d6ac085812912d Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 2 Sep 2014 07:41:37 +0100 Subject: [PATCH] udp: Break out udp_make_socket Make this into a function by itself and adjust its arguments so that when we support multiple sockets (for multiple addresses so that we can have multiple AFs) we can just call it for each one. No functional change. Signed-off-by: Ian Jackson --- udp.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/udp.c b/udp.c index 90f8e9a..b2ab850 100644 --- a/udp.c +++ b/udp.c @@ -203,22 +203,19 @@ static bool_t udp_sendmsg(void *commst, struct buffer_if *buf, return True; } -static void udp_phase_hook(void *sst, uint32_t new_phase) +static void udp_make_socket(struct udp *st, struct udp *us) { - struct udp *st=sst; - union iaddr addr; - - st->fd=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (st->fd<0) { + const union iaddr *addr=&us->addr; + us->fd=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (us->fd<0) { fatal_perror("udp (%s:%d): socket",st->loc.file,st->loc.line); } - if (fcntl(st->fd, F_SETFL, fcntl(st->fd, F_GETFL)|O_NONBLOCK)==-1) { + if (fcntl(us->fd, F_SETFL, fcntl(us->fd, F_GETFL)|O_NONBLOCK)==-1) { fatal_perror("udp (%s:%d): fcntl(set O_NONBLOCK)", st->loc.file,st->loc.line); } - setcloexec(st->fd); + setcloexec(us->fd); - addr=st->addr; if (st->authbind) { pid_t c; int status; @@ -231,10 +228,10 @@ static void udp_phase_hook(void *sst, uint32_t new_phase) } if (c==0) { char *argv[4], addrstr[9], portstr[5]; - switch (addr.sa.sa_family) { + switch (addr->sa.sa_family) { case AF_INET: - sprintf(addrstr,"%08lX",(long)addr.sin.sin_addr.s_addr); - sprintf(portstr,"%04X",addr.sin.sin_port); + sprintf(addrstr,"%08lX",(long)addr->sin.sin_addr.s_addr); + sprintf(portstr,"%04X",addr->sin.sin_port); break; default: fatal("udp (%s:%d): unsupported address family for authbind", @@ -244,7 +241,7 @@ static void udp_phase_hook(void *sst, uint32_t new_phase) argv[1]=addrstr; argv[2]=portstr; argv[3]=NULL; - dup2(st->fd,0); + dup2(us->fd,0); execvp(st->authbind,argv); _exit(255); } @@ -261,11 +258,16 @@ static void udp_phase_hook(void *sst, uint32_t new_phase) st->loc.line, WEXITSTATUS(status)); } } else { - if (bind(st->fd, (struct sockaddr *)&addr, sizeof(addr))!=0) { + if (bind(us->fd, &addr->sa, iaddr_socklen(addr))!=0) { fatal_perror("udp (%s:%d): bind",st->loc.file,st->loc.line); } } +} +static void udp_phase_hook(void *sst, uint32_t new_phase) +{ + struct udp *st=sst; + udp_make_socket(st,st); register_for_poll(st,udp_beforepoll,udp_afterpoll,1,"udp"); } -- 2.30.2