]>
Commit | Line | Data |
---|---|---|
2fb91b69 | 1 | diff -ur djbdns-1.05/Makefile djbdns-1.05-multiip/Makefile |
2 | --- djbdns-1.05/Makefile Sun Feb 11 21:11:45 2001 | |
3 | +++ djbdns-1.05-multiip/Makefile Thu Feb 15 14:49:06 2001 | |
4 | @@ -626,9 +626,9 @@ | |
5 | ./compile parsetype.c | |
6 | ||
7 | pickdns: \ | |
8 | -load pickdns.o server.o response.o droproot.o qlog.o prot.o dns.a \ | |
9 | +load pickdns.o server.o iopause.o response.o droproot.o qlog.o prot.o dns.a \ | |
10 | env.a libtai.a cdb.a alloc.a buffer.a unix.a byte.a socket.lib | |
11 | - ./load pickdns server.o response.o droproot.o qlog.o \ | |
12 | + ./load pickdns server.o iopause.o response.o droproot.o qlog.o \ | |
13 | prot.o dns.a env.a libtai.a cdb.a alloc.a buffer.a unix.a \ | |
14 | byte.a `cat socket.lib` | |
15 | ||
16 | @@ -704,9 +704,9 @@ | |
17 | ./compile random-ip.c | |
18 | ||
19 | rbldns: \ | |
20 | -load rbldns.o server.o response.o dd.o droproot.o qlog.o prot.o dns.a \ | |
21 | +load rbldns.o server.o iopause.o response.o dd.o droproot.o qlog.o prot.o dns.a \ | |
22 | env.a libtai.a cdb.a alloc.a buffer.a unix.a byte.a socket.lib | |
23 | - ./load rbldns server.o response.o dd.o droproot.o qlog.o \ | |
24 | + ./load rbldns server.o iopause.o response.o dd.o droproot.o qlog.o \ | |
25 | prot.o dns.a env.a libtai.a cdb.a alloc.a buffer.a unix.a \ | |
26 | byte.a `cat socket.lib` | |
27 | ||
28 | @@ -774,7 +774,7 @@ | |
29 | compile server.c byte.h case.h env.h buffer.h strerr.h ip4.h uint16.h \ | |
30 | ndelay.h socket.h uint16.h droproot.h qlog.h uint16.h response.h \ | |
31 | uint32.h dns.h stralloc.h gen_alloc.h iopause.h taia.h tai.h uint64.h \ | |
32 | -taia.h | |
33 | +taia.h iopause.h alloc.h | |
34 | ./compile server.c | |
35 | ||
36 | setup: \ | |
37 | @@ -979,10 +979,10 @@ | |
38 | ./compile timeoutwrite.c | |
39 | ||
40 | tinydns: \ | |
41 | -load tinydns.o server.o droproot.o tdlookup.o response.o qlog.o \ | |
42 | +load tinydns.o server.o iopause.o droproot.o tdlookup.o response.o qlog.o \ | |
43 | prot.o dns.a libtai.a env.a cdb.a alloc.a buffer.a unix.a byte.a \ | |
44 | socket.lib | |
45 | - ./load tinydns server.o droproot.o tdlookup.o response.o \ | |
46 | + ./load tinydns server.o iopause.o droproot.o tdlookup.o response.o \ | |
47 | qlog.o prot.o dns.a libtai.a env.a cdb.a alloc.a buffer.a \ | |
48 | unix.a byte.a `cat socket.lib` | |
49 | ||
50 | @@ -1084,10 +1084,10 @@ | |
51 | ./compile utime.c | |
52 | ||
53 | walldns: \ | |
54 | -load walldns.o server.o response.o droproot.o qlog.o prot.o dd.o \ | |
55 | +load walldns.o server.o iopause.o response.o droproot.o qlog.o prot.o dd.o \ | |
56 | dns.a env.a cdb.a alloc.a buffer.a unix.a byte.a socket.lib | |
57 | - ./load walldns server.o response.o droproot.o qlog.o \ | |
58 | - prot.o dd.o dns.a env.a cdb.a alloc.a buffer.a unix.a \ | |
59 | + ./load walldns server.o iopause.o response.o droproot.o qlog.o \ | |
60 | + prot.o dd.o dns.a libtai.a env.a cdb.a alloc.a buffer.a unix.a \ | |
61 | byte.a `cat socket.lib` | |
62 | ||
63 | walldns-conf: \ | |
64 | diff -ur djbdns-1.05/server.c djbdns-1.05-multiip/server.c | |
65 | --- djbdns-1.05/server.c Sun Feb 11 21:11:45 2001 | |
66 | +++ djbdns-1.05-multiip/server.c Thu Feb 15 16:30:33 2001 | |
67 | @@ -11,6 +11,8 @@ | |
68 | #include "qlog.h" | |
69 | #include "response.h" | |
70 | #include "dns.h" | |
71 | +#include "alloc.h" | |
72 | +#include "iopause.h" | |
73 | ||
74 | extern char *fatal; | |
75 | extern char *starting; | |
76 | @@ -25,6 +27,11 @@ | |
77 | ||
78 | static char *q; | |
79 | ||
80 | +void nomem() | |
81 | +{ | |
82 | + strerr_die2x(111,fatal,"out of memory"); | |
83 | +} | |
84 | + | |
85 | static int doit(void) | |
86 | { | |
87 | unsigned int pos; | |
88 | @@ -82,35 +89,74 @@ | |
89 | int main() | |
90 | { | |
91 | char *x; | |
92 | - int udp53; | |
93 | + int *udp53; | |
94 | + unsigned int off; | |
95 | + unsigned int cnt; | |
96 | + iopause_fd *iop; | |
97 | ||
98 | x = env_get("IP"); | |
99 | if (!x) | |
100 | strerr_die2x(111,fatal,"$IP not set"); | |
101 | - if (!ip4_scan(x,ip)) | |
102 | - strerr_die3x(111,fatal,"unable to parse IP address ",x); | |
103 | - | |
104 | - udp53 = socket_udp(); | |
105 | - if (udp53 == -1) | |
106 | - strerr_die2sys(111,fatal,"unable to create UDP socket: "); | |
107 | - if (socket_bind4_reuse(udp53,ip,53) == -1) | |
108 | - strerr_die2sys(111,fatal,"unable to bind UDP socket: "); | |
109 | + off=0; | |
110 | + cnt=0; | |
111 | + while (x[off]) { | |
112 | + unsigned int l; | |
113 | + char dummy[4]; | |
114 | + l=ip4_scan(x+off,dummy); | |
115 | + if (!l) | |
116 | + strerr_die3x(111,fatal,"unable to parse IP address ",x+off); | |
117 | + cnt++; | |
118 | + if (!x[off+l]) break; | |
119 | + if ((x[off+l]!=',') && (x[off+l]!='/')) | |
120 | + strerr_die3x(111,fatal,"unable to parse IP address ",x+off); | |
121 | + off+=l+1; | |
122 | + } | |
123 | + udp53=(int *) alloc(sizeof(int) *cnt); | |
124 | + if (!udp53) nomem(); | |
125 | + iop=(iopause_fd *) alloc(sizeof(*iop) * cnt); | |
126 | + if (!iop) nomem(); | |
127 | + | |
128 | + off=0; | |
129 | + cnt=0; | |
130 | + while (x[off]) { | |
131 | + unsigned int l; | |
132 | + l=ip4_scan(x+off,ip); | |
133 | + udp53[cnt] = socket_udp(); | |
134 | + if (udp53[cnt] == -1) | |
135 | + strerr_die2sys(111,fatal,"unable to create UDP socket: "); | |
136 | + if (socket_bind4_reuse(udp53[cnt],ip,53) == -1) | |
137 | + strerr_die2sys(111,fatal,"unable to bind UDP socket: "); | |
138 | + ndelay_off(udp53[cnt]); | |
139 | + socket_tryreservein(udp53[cnt],65536); | |
140 | + iop[cnt].fd=udp53[cnt]; | |
141 | + iop[cnt].events=IOPAUSE_READ; | |
142 | + cnt++; | |
143 | + if (!x[off+l]) break; | |
144 | + off+=l+1; | |
145 | + } | |
146 | ||
147 | droproot(fatal); | |
148 | ||
149 | initialize(); | |
150 | - | |
151 | - ndelay_off(udp53); | |
152 | - socket_tryreservein(udp53,65536); | |
153 | ||
154 | buffer_putsflush(buffer_2,starting); | |
155 | - | |
156 | + | |
157 | for (;;) { | |
158 | - len = socket_recv4(udp53,buf,sizeof buf,ip,&port); | |
159 | - if (len < 0) continue; | |
160 | - if (!doit()) continue; | |
161 | - if (response_len > 512) response_tc(); | |
162 | - socket_send4(udp53,response,response_len,ip,port); | |
163 | - /* may block for buffer space; if it fails, too bad */ | |
164 | + struct taia stamp; | |
165 | + struct taia deadline; | |
166 | + unsigned int i; | |
167 | + taia_now(&stamp); | |
168 | + taia_uint(&deadline,300); | |
169 | + taia_add(&deadline,&deadline,&stamp); | |
170 | + iopause(iop,cnt,&deadline,&stamp); | |
171 | + for (i=0;i<cnt;i++) | |
172 | + if (iop[i].revents) { | |
173 | + len = socket_recv4(udp53[i],buf,sizeof buf,ip,&port); | |
174 | + if (len < 0) continue; | |
175 | + if (!doit()) continue; | |
176 | + if (response_len > 512) response_tc(); | |
177 | + socket_send4(udp53[i],response,response_len,ip,port); | |
178 | + /* may block for buffer space; if it fails, too bad */ | |
179 | + } | |
180 | } | |
181 | } |