chiark / gitweb /
udp: Break out udp_make_socket
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 2 Sep 2014 06:41:37 +0000 (07:41 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 2 Oct 2014 15:30:21 +0000 (16:30 +0100)
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 <ijackson@chiark.greenend.org.uk>
udp.c

diff --git a/udp.c b/udp.c
index 90f8e9a36602b7cc6ff3fb72e7d7852e4e6f14ed..b2ab85008213b06d2752667751befc3f411273a7 100644 (file)
--- 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");
 }