]> git.pld-linux.org Git - packages/djbdns.git/commitdiff
A patch to allow djbdns servers to bind to multiple IP addresses.
authorareq <areq@pld-linux.org>
Mon, 24 Sep 2001 12:08:22 +0000 (12:08 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Usage: The patch reads multiple IP addresses from the IP environment variable.
Addresses have to be separated with a / or comma.

Changed files:
    djbdns-1.05-multiip.diff -> 1.1

djbdns-1.05-multiip.diff [new file with mode: 0644]

diff --git a/djbdns-1.05-multiip.diff b/djbdns-1.05-multiip.diff
new file mode 100644 (file)
index 0000000..6dcd2e1
--- /dev/null
@@ -0,0 +1,181 @@
+diff -ur djbdns-1.05/Makefile djbdns-1.05-multiip/Makefile
+--- djbdns-1.05/Makefile       Sun Feb 11 21:11:45 2001
++++ djbdns-1.05-multiip/Makefile       Thu Feb 15 14:49:06 2001
+@@ -626,9 +626,9 @@
+       ./compile parsetype.c
+ pickdns: \
+-load pickdns.o server.o response.o droproot.o qlog.o prot.o dns.a \
++load pickdns.o server.o iopause.o response.o droproot.o qlog.o prot.o dns.a \
+ env.a libtai.a cdb.a alloc.a buffer.a unix.a byte.a socket.lib
+-      ./load pickdns server.o response.o droproot.o qlog.o \
++      ./load pickdns server.o iopause.o response.o droproot.o qlog.o \
+       prot.o dns.a env.a libtai.a cdb.a alloc.a buffer.a unix.a \
+       byte.a  `cat socket.lib`
+@@ -704,9 +704,9 @@
+       ./compile random-ip.c
+ rbldns: \
+-load rbldns.o server.o response.o dd.o droproot.o qlog.o prot.o dns.a \
++load rbldns.o server.o iopause.o response.o dd.o droproot.o qlog.o prot.o dns.a \
+ env.a libtai.a cdb.a alloc.a buffer.a unix.a byte.a socket.lib
+-      ./load rbldns server.o response.o dd.o droproot.o qlog.o \
++      ./load rbldns server.o iopause.o response.o dd.o droproot.o qlog.o \
+       prot.o dns.a env.a libtai.a cdb.a alloc.a buffer.a unix.a \
+       byte.a  `cat socket.lib`
+@@ -774,7 +774,7 @@
+ compile server.c byte.h case.h env.h buffer.h strerr.h ip4.h uint16.h \
+ ndelay.h socket.h uint16.h droproot.h qlog.h uint16.h response.h \
+ uint32.h dns.h stralloc.h gen_alloc.h iopause.h taia.h tai.h uint64.h \
+-taia.h
++taia.h iopause.h alloc.h
+       ./compile server.c
+ setup: \
+@@ -979,10 +979,10 @@
+       ./compile timeoutwrite.c
+ tinydns: \
+-load tinydns.o server.o droproot.o tdlookup.o response.o qlog.o \
++load tinydns.o server.o iopause.o droproot.o tdlookup.o response.o qlog.o \
+ prot.o dns.a libtai.a env.a cdb.a alloc.a buffer.a unix.a byte.a \
+ socket.lib
+-      ./load tinydns server.o droproot.o tdlookup.o response.o \
++      ./load tinydns server.o iopause.o droproot.o tdlookup.o response.o \
+       qlog.o prot.o dns.a libtai.a env.a cdb.a alloc.a buffer.a \
+       unix.a byte.a  `cat socket.lib`
+@@ -1084,10 +1084,10 @@
+       ./compile utime.c
+ walldns: \
+-load walldns.o server.o response.o droproot.o qlog.o prot.o dd.o \
++load walldns.o server.o iopause.o response.o droproot.o qlog.o prot.o dd.o \
+ dns.a env.a cdb.a alloc.a buffer.a unix.a byte.a socket.lib
+-      ./load walldns server.o response.o droproot.o qlog.o \
+-      prot.o dd.o dns.a env.a cdb.a alloc.a buffer.a unix.a \
++      ./load walldns server.o iopause.o response.o droproot.o qlog.o \
++      prot.o dd.o dns.a libtai.a env.a cdb.a alloc.a buffer.a unix.a \
+       byte.a  `cat socket.lib`
+ walldns-conf: \
+diff -ur djbdns-1.05/server.c djbdns-1.05-multiip/server.c
+--- djbdns-1.05/server.c       Sun Feb 11 21:11:45 2001
++++ djbdns-1.05-multiip/server.c       Thu Feb 15 16:30:33 2001
+@@ -11,6 +11,8 @@
+ #include "qlog.h"
+ #include "response.h"
+ #include "dns.h"
++#include "alloc.h"
++#include "iopause.h"
+ extern char *fatal;
+ extern char *starting;
+@@ -25,6 +27,11 @@
+ static char *q;
++void nomem()
++{
++  strerr_die2x(111,fatal,"out of memory");
++}
++
+ static int doit(void)
+ {
+   unsigned int pos;
+@@ -82,35 +89,74 @@
+ int main()
+ {
+   char *x;
+-  int udp53;
++  int *udp53;
++  unsigned int off;
++  unsigned int cnt;
++  iopause_fd *iop;
+   x = env_get("IP");
+   if (!x)
+     strerr_die2x(111,fatal,"$IP not set");
+-  if (!ip4_scan(x,ip))
+-    strerr_die3x(111,fatal,"unable to parse IP address ",x);
+-
+-  udp53 = socket_udp();
+-  if (udp53 == -1)
+-    strerr_die2sys(111,fatal,"unable to create UDP socket: ");
+-  if (socket_bind4_reuse(udp53,ip,53) == -1)
+-    strerr_die2sys(111,fatal,"unable to bind UDP socket: ");
++  off=0;
++  cnt=0;
++  while (x[off]) {
++    unsigned int l;
++    char dummy[4];
++    l=ip4_scan(x+off,dummy);
++      if (!l)
++      strerr_die3x(111,fatal,"unable to parse IP address ",x+off);
++      cnt++;
++      if (!x[off+l]) break;
++      if ((x[off+l]!=',') && (x[off+l]!='/'))
++      strerr_die3x(111,fatal,"unable to parse IP address ",x+off);
++      off+=l+1;
++  }
++  udp53=(int *) alloc(sizeof(int) *cnt);
++  if (!udp53) nomem();
++  iop=(iopause_fd *) alloc(sizeof(*iop) * cnt);
++  if (!iop) nomem();
++
++  off=0;
++  cnt=0;
++  while (x[off]) {
++    unsigned int l;
++    l=ip4_scan(x+off,ip);
++    udp53[cnt] = socket_udp();
++    if (udp53[cnt] == -1)
++      strerr_die2sys(111,fatal,"unable to create UDP socket: ");
++    if (socket_bind4_reuse(udp53[cnt],ip,53) == -1)
++      strerr_die2sys(111,fatal,"unable to bind UDP socket: ");
++      ndelay_off(udp53[cnt]);
++    socket_tryreservein(udp53[cnt],65536);
++      iop[cnt].fd=udp53[cnt];
++      iop[cnt].events=IOPAUSE_READ;
++      cnt++;
++      if (!x[off+l]) break;
++      off+=l+1;
++  }
+   droproot(fatal);
+   initialize();
+-  
+-  ndelay_off(udp53);
+-  socket_tryreservein(udp53,65536);
+   buffer_putsflush(buffer_2,starting);
+-
++  
+   for (;;) {
+-    len = socket_recv4(udp53,buf,sizeof buf,ip,&port);
+-    if (len < 0) continue;
+-    if (!doit()) continue;
+-    if (response_len > 512) response_tc();
+-    socket_send4(udp53,response,response_len,ip,port);
+-    /* may block for buffer space; if it fails, too bad */
++    struct taia stamp;
++    struct taia deadline;
++      unsigned int i;
++    taia_now(&stamp);
++    taia_uint(&deadline,300);
++    taia_add(&deadline,&deadline,&stamp);
++    iopause(iop,cnt,&deadline,&stamp);
++      for (i=0;i<cnt;i++)
++        if (iop[i].revents) {
++        len = socket_recv4(udp53[i],buf,sizeof buf,ip,&port);
++        if (len < 0) continue;
++        if (!doit()) continue;
++        if (response_len > 512) response_tc();
++        socket_send4(udp53[i],response,response_len,ip,port);
++        /* may block for buffer space; if it fails, too bad */
++        }
+   }
+ }
This page took 0.08368 seconds and 4 git commands to generate.