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>
Sun, 5 Oct 2014 20:28:16 +0000 (21:28 +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 477dea38c7efe47e97ab5f52656fc79c07953509..33a870757127992f6b958332ee099cda0e817629 100644 (file)
--- a/udp.c
+++ b/udp.c
@@ -200,22 +200,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;
@@ -228,10 +225,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",
@@ -241,7 +238,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);
        }
@@ -258,11 +255,16 @@ static void udp_phase_hook(void *sst, uint32_t new_phase)
                  st->loc.line, WEXITSTATUS(status));
        }
     } else {
-       if (bind(st->fd, &addr.sa, iaddr_socklen(&addr))!=0) {
+       if (bind(st->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");
 }