]>
Commit | Line | Data |
---|---|---|
5d7ff835 AF |
1 | --- postfix-19990906-pl08/global/mynetworks.c.wiget Fri Dec 11 19:55:22 1998 |
2 | +++ postfix-19990906-pl08/global/mynetworks.c Wed Dec 1 13:01:35 1999 | |
3 | @@ -43,12 +43,20 @@ | |
4 | #include <msg.h> | |
5 | #include <vstring.h> | |
6 | #include <inet_addr_list.h> | |
7 | +#ifdef INET6 | |
8 | +#include <sys/socket.h> | |
9 | +#include <netinet/in.h> | |
10 | +#endif | |
11 | ||
12 | /* Global library. */ | |
13 | ||
14 | #include <own_inet_addr.h> | |
15 | #include <mynetworks.h> | |
16 | ||
17 | +#ifdef INET6 | |
18 | +char ntop_buf[INET6_ADDRSTRLEN]; | |
19 | +#endif | |
20 | + | |
21 | /* mynetworks - return patterns that match my own networks */ | |
22 | ||
23 | const char *mynetworks(void) | |
24 | @@ -63,12 +71,24 @@ | |
25 | struct in_addr net; | |
26 | int shift; | |
27 | int i; | |
28 | +#ifdef INET6 | |
29 | + struct sockaddr_storage *sa; | |
30 | +#endif | |
31 | ||
32 | result = vstring_alloc(20); | |
33 | my_addr_list = own_inet_addr_list(); | |
34 | ||
35 | for (i = 0; i < my_addr_list->used; i++) { | |
36 | +#ifdef INET6 | |
37 | + if (my_addr_list->addrs[i].__ss_family!=AF_INET) { | |
38 | + vstring_sprintf_append(result, "XAATODOmynetworks "); | |
39 | + continue; | |
40 | + } | |
41 | + sa = my_addr_list->addrs+i; | |
42 | + addr = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr); | |
43 | +#else | |
44 | addr = ntohl(my_addr_list->addrs[i].s_addr); | |
45 | +#endif | |
46 | if (IN_CLASSA(addr)) { | |
47 | mask = IN_CLASSA_NET; | |
48 | shift = IN_CLASSA_NSHIFT; | |
49 | @@ -82,8 +102,15 @@ | |
50 | mask = IN_CLASSD_NET; | |
51 | shift = IN_CLASSD_NSHIFT; | |
52 | } else { | |
53 | +#ifdef INET6 | |
54 | + if (inet_ntop(sa->__ss_family, sa, ntop_buf, sizeof(ntop_buf))) | |
55 | + msg_fatal("%s: bad address class: %s", myname, ntop_buf); | |
56 | + else | |
57 | + msg_fatal("%s: bad address class: ???", myname); | |
58 | +#else | |
59 | msg_fatal("%s: bad address class: %s", | |
60 | myname, inet_ntoa(my_addr_list->addrs[i])); | |
61 | +#endif | |
62 | } | |
63 | net.s_addr = htonl(addr & mask); | |
64 | vstring_sprintf_append(result, "%s/%d ", | |
65 | --- postfix-19990906-pl08/global/own_inet_addr.c.wiget Tue Dec 15 01:37:31 1998 | |
66 | +++ postfix-19990906-pl08/global/own_inet_addr.c Wed Dec 1 13:01:35 1999 | |
67 | @@ -99,6 +99,23 @@ | |
68 | ||
69 | /* own_inet_addr - is this my own internet address */ | |
70 | ||
71 | +#ifdef INET6 | |
72 | +int own_inet_addr(struct sockaddr_storage * addr) | |
73 | +{ | |
74 | + int i; | |
75 | + | |
76 | + if (addr_list.used == 0) | |
77 | + own_inet_addr_init(&addr_list); | |
78 | + | |
79 | + for (i = 0; i < addr_list.used; i++) | |
80 | + if (addr->__ss_family == addr_list.addrs[i].__ss_family) { | |
81 | + if (!bcmp(addr->__ss_pad1, addr_list.addrs[i].__ss_pad1, | |
82 | + addr->__ss_len)) | |
83 | + return (1); | |
84 | + } | |
85 | + return (0); | |
86 | +} | |
87 | +#else | |
88 | int own_inet_addr(struct in_addr * addr) | |
89 | { | |
90 | int i; | |
91 | @@ -111,6 +128,7 @@ | |
92 | return (1); | |
93 | return (0); | |
94 | } | |
95 | +#endif | |
96 | ||
97 | /* own_inet_addr_list - return list of addresses */ | |
98 | ||
99 | --- postfix-19990906-pl08/global/own_inet_addr.h.wiget Fri Dec 11 19:55:26 1998 | |
100 | +++ postfix-19990906-pl08/global/own_inet_addr.h Wed Dec 1 13:01:35 1999 | |
101 | @@ -15,11 +15,18 @@ | |
102 | * System library. | |
103 | */ | |
104 | #include <netinet/in.h> | |
105 | +#ifdef INET6 | |
106 | +#include <sys/socket.h> | |
107 | +#endif | |
108 | ||
109 | /* | |
110 | * External interface. | |
111 | */ | |
112 | +#ifdef INET6 | |
113 | +extern int own_inet_addr(struct sockaddr_storage *); | |
114 | +#else | |
115 | extern int own_inet_addr(struct in_addr *); | |
116 | +#endif | |
117 | extern struct INET_ADDR_LIST *own_inet_addr_list(void); | |
118 | ||
119 | /* LICENSE | |
120 | --- postfix-19990906-pl08/global/peer_name.c.wiget Fri Dec 11 19:55:38 1998 | |
121 | +++ postfix-19990906-pl08/global/peer_name.c Wed Dec 1 13:01:35 1999 | |
122 | @@ -54,6 +54,11 @@ | |
123 | #include <sys/param.h> | |
124 | #include <sys/socket.h> | |
125 | #include <netinet/in.h> | |
126 | +#ifdef INET6 | |
127 | +#if (! __GLIBC__ >= 2 && __GLIBC_MINOR__ >=1 ) | |
128 | +#include <netinet6/in6.h> | |
129 | +#endif | |
130 | +#endif | |
131 | #include <arpa/inet.h> | |
132 | #include <errno.h> | |
133 | #include <netdb.h> | |
134 | @@ -69,20 +74,46 @@ | |
135 | PEER_NAME *peer_name(int sock) | |
136 | { | |
137 | static PEER_NAME peer; | |
138 | - struct sockaddr_in sin; | |
139 | - SOCKADDR_SIZE len = sizeof(sin); | |
140 | + union sockunion { | |
141 | + struct { | |
142 | + u_char si_len; | |
143 | + u_char si_family; | |
144 | + u_short si_port; | |
145 | + } su_si; | |
146 | + struct sockaddr peer_un; | |
147 | + struct sockaddr_in peer_un4; | |
148 | +#ifdef INET6 | |
149 | + struct sockaddr_in6 peer_un6; | |
150 | +#endif | |
151 | + } p_un; | |
152 | +#define sin p_un.peer_un | |
153 | +#define sin4 p_un.peer_un4 | |
154 | +#ifdef INET6 | |
155 | +#define sin6 p_un.peer_un6 | |
156 | + char ntop_buf[INET6_ADDRSTRLEN]; | |
157 | +#endif | |
158 | + SOCKADDR_SIZE len = sizeof(p_un); | |
159 | struct hostent *hp; | |
160 | ||
161 | - if (getpeername(sock, (struct sockaddr *) & sin, &len) == 0) { | |
162 | - switch (sin.sin_family) { | |
163 | + if (getpeername(sock, (struct sockaddr *)& p_un, &len) == 0) { | |
164 | + switch (p_un.peer_un.sa_family) { | |
165 | case AF_INET: | |
166 | peer.type = PEER_TYPE_INET; | |
167 | - hp = gethostbyaddr((char *) &(sin.sin_addr), | |
168 | - sizeof(sin.sin_addr), AF_INET); | |
169 | + hp = gethostbyaddr((char *) &(sin4.sin_addr), | |
170 | + sizeof(sin4.sin_addr), AF_INET); | |
171 | peer.name = (hp && valid_hostname(hp->h_name) ? | |
172 | hp->h_name : "unknown"); | |
173 | - peer.addr = inet_ntoa(sin.sin_addr); | |
174 | + peer.addr = inet_ntoa(sin4.sin_addr); | |
175 | return (&peer); | |
176 | +#ifdef INET6 | |
177 | + case AF_INET6: | |
178 | + peer.type = PEER_TYPE_INET6; | |
179 | + hp = gethostbyaddr((char *) &(sin6.sin6_addr), | |
180 | + sizeof(sin6.sin6_addr), AF_INET6); | |
181 | + peer.name = (hp ? hp->h_name : "unknown"); | |
182 | + peer.addr = (char *)strdup(inet_ntop(AF_INET6, &sin6.sin6_addr, ntop_buf, sizeof(ntop_buf))); | |
183 | + return (&peer); | |
184 | +#endif | |
185 | case AF_UNSPEC: | |
186 | case AF_UNIX: | |
187 | peer.type = PEER_TYPE_LOCAL; | |
188 | --- postfix-19990906-pl08/global/peer_name.h.wiget Fri Dec 11 19:55:32 1998 | |
189 | +++ postfix-19990906-pl08/global/peer_name.h Wed Dec 1 13:01:35 1999 | |
190 | @@ -22,6 +22,9 @@ | |
191 | #define PEER_TYPE_UNKNOWN 0 | |
192 | #define PEER_TYPE_INET 1 | |
193 | #define PEER_TYPE_LOCAL 2 | |
194 | +#ifdef INET6 | |
195 | +#define PEER_TYPE_INET6 3 | |
196 | +#endif | |
197 | ||
198 | extern PEER_NAME *peer_name(int); | |
199 | ||
200 | --- postfix-19990906-pl08/smtpd/smtpd_check.c.wiget Wed Dec 1 13:01:35 1999 | |
201 | +++ postfix-19990906-pl08/smtpd/smtpd_check.c Wed Dec 1 13:01:35 1999 | |
202 | @@ -604,7 +604,11 @@ | |
203 | msg_info("%s: %s", myname, name); | |
204 | ||
205 | dns_status = dns_lookup_types(name, 0, (DNS_RR **) 0, (VSTRING *) 0, | |
206 | - (VSTRING *) 0, T_A, T_MX, 0); | |
207 | + (VSTRING *) 0, T_A, T_MX, | |
208 | +#ifdef INET6 | |
209 | + T_AAAA, | |
210 | +#endif | |
211 | + 0); | |
212 | if (dns_status != DNS_OK) | |
213 | return (smtpd_check_reject(state, MAIL_ERROR_POLICY, | |
214 | "%d <%s>: %s rejected: Host not found", | |
215 | @@ -626,7 +630,11 @@ | |
216 | msg_info("%s: %s", myname, name); | |
217 | ||
218 | dns_status = dns_lookup_types(name, 0, (DNS_RR **) 0, (VSTRING *) 0, | |
219 | - (VSTRING *) 0, T_A, T_MX, 0); | |
220 | + (VSTRING *) 0, T_A, T_MX, | |
221 | +#ifdef INET6 | |
222 | + T_AAAA, | |
223 | +#endif | |
224 | + 0); | |
225 | if (dns_status != DNS_OK) | |
226 | return (smtpd_check_reject(state, MAIL_ERROR_POLICY, | |
227 | "%d <%s>: %s rejected: Domain not found", | |
228 | --- postfix-19990906-pl08/util/inet_addr_list.c.wiget Fri Dec 11 19:55:36 1998 | |
229 | +++ postfix-19990906-pl08/util/inet_addr_list.c Wed Dec 1 13:01:35 1999 | |
230 | @@ -44,24 +44,58 @@ | |
231 | #include <netinet/in.h> | |
232 | #include <arpa/inet.h> | |
233 | ||
234 | +#ifdef INET6 | |
235 | +#include <sys/socket.h> | |
236 | +#endif | |
237 | + | |
238 | /* Utility library. */ | |
239 | ||
240 | #include <msg.h> | |
241 | #include <mymalloc.h> | |
242 | #include <inet_addr_list.h> | |
243 | ||
244 | +#ifdef INET6 | |
245 | + char ntop_buf[INET6_ADDRSTRLEN]; | |
246 | +#endif | |
247 | + | |
248 | /* inet_addr_list_init - initialize internet address list */ | |
249 | ||
250 | void inet_addr_list_init(INET_ADDR_LIST *list) | |
251 | { | |
252 | list->used = 0; | |
253 | list->size = 2; | |
254 | +#ifdef INET6 | |
255 | + list->addrs = (struct sockaddr_storage *) | |
256 | +#else | |
257 | list->addrs = (struct in_addr *) | |
258 | +#endif | |
259 | mymalloc(sizeof(*list->addrs) * list->size); | |
260 | } | |
261 | ||
262 | /* inet_addr_list_append - append address to internet address list */ | |
263 | ||
264 | +#ifdef INET6 | |
265 | +void inet_addr_list_append(INET_ADDR_LIST *list, | |
266 | + struct sockaddr_storage * addr) | |
267 | +{ | |
268 | + char *myname = "inet_addr_list_append"; | |
269 | + | |
270 | + if (msg_verbose > 1) { | |
271 | + if (inet_ntop(addr->__ss_family,(struct sockaddr *)addr, | |
272 | + ntop_buf, sizeof(ntop_buf))) | |
273 | + msg_info("%s: %s", myname, ntop_buf); | |
274 | + else | |
275 | + msg_info("%s: ??????", myname); | |
276 | + } | |
277 | + | |
278 | + if (list->used >= list->size) | |
279 | + list->size *= 2; | |
280 | + list->addrs = (struct sockaddr_storage *) | |
281 | + myrealloc((char *) list->addrs, | |
282 | + sizeof(*list->addrs) * list->size); | |
283 | + list->addrs[list->used++] = *addr; | |
284 | +} | |
285 | +#else | |
286 | void inet_addr_list_append(INET_ADDR_LIST *list, struct in_addr * addr) | |
287 | { | |
288 | char *myname = "inet_addr_list_append"; | |
289 | @@ -76,6 +110,7 @@ | |
290 | sizeof(*list->addrs) * list->size); | |
291 | list->addrs[list->used++] = *addr; | |
292 | } | |
293 | +#endif | |
294 | ||
295 | /* inet_addr_list_free - destroy internet address list */ | |
296 | ||
297 | --- postfix-19990906-pl08/util/inet_addr_list.h.wiget Fri Dec 11 19:55:35 1998 | |
298 | +++ postfix-19990906-pl08/util/inet_addr_list.h Wed Dec 1 13:01:35 1999 | |
299 | @@ -22,12 +22,20 @@ | |
300 | typedef struct INET_ADDR_LIST { | |
301 | int used; /* nr of elements in use */ | |
302 | int size; /* actual list size */ | |
303 | +#ifdef INET6 | |
304 | + struct sockaddr_storage *addrs; /* payload */ | |
305 | +#else | |
306 | struct in_addr *addrs; /* payload */ | |
307 | +#endif | |
308 | } INET_ADDR_LIST; | |
309 | ||
310 | extern void inet_addr_list_init(INET_ADDR_LIST *); | |
311 | extern void inet_addr_list_free(INET_ADDR_LIST *); | |
312 | +#ifdef INET6 | |
313 | +extern void inet_addr_list_append(INET_ADDR_LIST *, struct sockaddr_storage *); | |
314 | +#else | |
315 | extern void inet_addr_list_append(INET_ADDR_LIST *, struct in_addr *); | |
316 | +#endif | |
317 | ||
318 | /* LICENSE | |
319 | /* .ad | |
320 | --- postfix-19990906-pl08/util/inet_addr_local.c.wiget Fri Nov 5 15:05:26 1999 | |
321 | +++ postfix-19990906-pl08/util/inet_addr_local.c Wed Dec 1 13:01:35 1999 | |
322 | @@ -138,6 +138,9 @@ | |
323 | { | |
324 | INET_ADDR_LIST addr_list; | |
325 | int i; | |
326 | +#ifdef INET6 | |
327 | + char buf[INET6_ADDRSTRLEN]; | |
328 | +#endif | |
329 | ||
330 | msg_vstream_init(argv[0], VSTREAM_ERR); | |
331 | ||
332 | @@ -151,7 +154,11 @@ | |
333 | msg_warn("found only one active network interface"); | |
334 | ||
335 | for (i = 0; i < addr_list.used; i++) | |
336 | +#ifdef #INET6 | |
337 | + vstream_printf("%s\n", net_ntop(AF_INET, addr_list.addrs[i])); | |
338 | +#else | |
339 | vstream_printf("%s\n", inet_ntoa(addr_list.addrs[i])); | |
340 | +#endif | |
341 | vstream_fflush(VSTREAM_OUT); | |
342 | inet_addr_list_free(&addr_list); | |
343 | } | |
344 | --- postfix-19990906-pl08/util/inet_listen.c.wiget Mon Mar 22 02:26:26 1999 | |
345 | +++ postfix-19990906-pl08/util/inet_listen.c Wed Dec 1 13:01:35 1999 | |
346 | @@ -51,6 +51,11 @@ | |
347 | #include <sys_defs.h> | |
348 | #include <sys/socket.h> | |
349 | #include <netinet/in.h> | |
350 | +#ifdef INET6 | |
351 | +#if (! __GLIBC__ >= 2 && __GLIBC_MINOR__ >=1 ) | |
352 | +#include <netinet6/in6.h> | |
353 | +#endif | |
354 | +#endif | |
355 | #include <arpa/inet.h> | |
356 | #include <netdb.h> | |
357 | #ifndef MAXHOSTNAMELEN | |
358 | @@ -79,7 +84,13 @@ | |
359 | ||
360 | int inet_listen(const char *addr, int backlog, int block_mode) | |
361 | { | |
362 | +#ifdef INET6 | |
363 | + struct sockaddr_in6 sin; | |
364 | + struct addrinfo *ai,hints; | |
365 | + int res; | |
366 | +#else | |
367 | struct sockaddr_in sin; | |
368 | +#endif | |
369 | int sock; | |
370 | int t = 1; | |
371 | char *buf; | |
372 | @@ -90,22 +101,55 @@ | |
373 | * Translate address information to internal form. | |
374 | */ | |
375 | buf = inet_parse(addr, &host, &port); | |
376 | +#ifdef INET6 | |
377 | + bzero((void *)&hints, sizeof(hints)); | |
378 | + hints.ai_flags = AI_PASSIVE; | |
379 | + hints.ai_family = PF_INET6; | |
380 | + hints.ai_socktype = SOCK_STREAM; | |
381 | + if (res = getaddrinfo(NULL, "smtp", &hints, &ai)) { | |
382 | + msg_fatal("Error getaddrinfo: %s", gai_strerror(res)); | |
383 | + } | |
384 | +/* | |
385 | + sin.sin6_family = AF_INET6; | |
386 | + sin.sin6_port = find_inet_port(port, "tcp"); | |
387 | + XAA:not yet.... | |
388 | + sin.sin6_addr.s6_addr = (*host ? find_inet_addr(host) : in6addr_any); | |
389 | + sin.sin6_addr = in6addr_any; | |
390 | +*/ | |
391 | +#else | |
392 | memset((char *) &sin, 0, sizeof(sin)); | |
393 | sin.sin_family = AF_INET; | |
394 | sin.sin_port = find_inet_port(port, "tcp"); | |
395 | sin.sin_addr.s_addr = (*host ? find_inet_addr(host) : INADDR_ANY); | |
396 | +#endif | |
397 | myfree(buf); | |
398 | ||
399 | /* | |
400 | * Create a listener socket. | |
401 | */ | |
402 | +#ifdef INET6 | |
403 | + if ((sock = socket(AF_INET6, SOCK_STREAM, 0)) < 0) | |
404 | +#else | |
405 | if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) | |
406 | +#endif | |
407 | msg_fatal("socket: %m"); | |
408 | if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &t, sizeof(t)) < 0) | |
409 | msg_fatal("setsockopt: %m"); | |
410 | +#ifdef INET6 | |
411 | + if (bind(sock, (struct sockaddr *) ai->ai_addr, ai->ai_addrlen) < 0) | |
412 | + /* not yet XAA | |
413 | + msg_fatal("bind %s port %d: %m", ai->ai_flags&AI_PASSIVE ? | |
414 | + "IN6ADDR_ANY" : ai->ai_canonname, | |
415 | + ntohs(((struct sockaddr *)ai->ai_addr)->sin_port)); | |
416 | + */ | |
417 | + msg_fatal("bind %s: %m", ai->ai_flags&AI_PASSIVE ? | |
418 | + "IN6ADDR_ANY" : ai->ai_canonname); | |
419 | + freeaddrinfo(ai); | |
420 | +#else | |
421 | if (bind(sock, (struct sockaddr *) & sin, sizeof(sin)) < 0) | |
422 | msg_fatal("bind %s port %d: %m", sin.sin_addr.s_addr == INADDR_ANY ? | |
423 | "INADDR_ANY" : inet_ntoa(sin.sin_addr), ntohs(sin.sin_port)); | |
424 | +#endif | |
425 | non_blocking(sock, block_mode); | |
426 | if (listen(sock, backlog) < 0) | |
427 | msg_fatal("listen: %m"); | |
428 | --- postfix-19990906-pl08/smtp/smtp_addr.c.wiget Mon Sep 6 05:11:07 1999 | |
429 | +++ postfix-19990906-pl08/smtp/smtp_addr.c Wed Dec 1 13:01:35 1999 | |
430 | @@ -141,6 +141,7 @@ | |
431 | /* | |
432 | * Interpret a numerical name as an address. | |
433 | */ | |
434 | +/* XAA TODO: check for numerical ipv6 address? */ | |
435 | if (ISDIGIT(host[0]) && (inaddr.s_addr = inet_addr(host)) != INADDR_NONE) { | |
436 | memset((char *) &fixed, 0, sizeof(fixed)); | |
437 | return (dns_rr_append(addr_list, | |
438 | @@ -153,6 +154,7 @@ | |
439 | */ | |
440 | if (var_disable_dns) { | |
441 | memset((char *) &fixed, 0, sizeof(fixed)); | |
442 | +/* TODO XAA, rewrite */ | |
443 | if ((hp = gethostbyname(host)) == 0) { | |
444 | vstring_sprintf(why, "%s: host not found", host); | |
445 | smtp_errno = SMTP_FAIL; | |
446 | @@ -176,7 +178,11 @@ | |
447 | /* | |
448 | * Append the addresses for this host to the address list. | |
449 | */ | |
450 | +#ifdef INET6 | |
451 | + switch (dns_lookup_types(host, 0, &addr, (VSTRING *) 0, why, T_A, T_AAAA)) {/* XAA TODO: currently IPv6 and IPv4 are mixed in no order, ok? */ | |
452 | +#else | |
453 | switch (dns_lookup(host, T_A, 0, &addr, (VSTRING *) 0, why)) { | |
454 | +#endif | |
455 | case DNS_OK: | |
456 | for (rr = addr; rr; rr = rr->next) | |
457 | rr->pref = pref; | |
458 | @@ -297,6 +303,9 @@ | |
459 | INET_ADDR_LIST *self; | |
460 | DNS_RR *addr; | |
461 | int i; | |
462 | +#ifdef INET6 | |
463 | + struct sockaddr_storage *sa; | |
464 | +#endif | |
465 | ||
466 | /* | |
467 | * Find the first address that lists any address that this mail system is | |
468 | @@ -307,11 +316,30 @@ | |
469 | self = own_inet_addr_list(); | |
470 | for (addr = addr_list; addr; addr = addr->next) { | |
471 | for (i = 0; i < self->used; i++) | |
472 | +#ifdef INET6 | |
473 | + switch(addr->type) { | |
474 | + case T_A: | |
475 | + if (self->addrs[i].__ss_family==AF_INET) { | |
476 | + if (!bcmp(self->addrs[i].__ss_pad1, addr->data, | |
477 | + sizeof(struct in_addr))) | |
478 | + return(addr); | |
479 | + } | |
480 | + break; | |
481 | + case T_AAAA: | |
482 | + if (self->addrs[i].__ss_family==AF_INET6) { | |
483 | + if (!bcmp(self->addrs[i].__ss_pad1, addr->data, | |
484 | + sizeof(struct in6_addr))) | |
485 | + return(addr); | |
486 | + } | |
487 | + break; | |
488 | + } | |
489 | +#else | |
490 | if (INADDRP(addr->data)->s_addr == self->addrs[i].s_addr) { | |
491 | if (msg_verbose) | |
492 | msg_info("%s: found at pref %d", myname, addr->pref); | |
493 | return (addr); | |
494 | } | |
495 | +#endif | |
496 | } | |
497 | ||
498 | /* | |
499 | --- postfix-19990906-pl08/smtp/smtp_connect.c.wiget Wed Dec 1 13:01:35 1999 | |
500 | +++ postfix-19990906-pl08/smtp/smtp_connect.c Wed Dec 1 13:38:56 1999 | |
501 | @@ -124,6 +124,10 @@ | |
502 | { | |
503 | char *myname = "smtp_connect_addr"; | |
504 | struct sockaddr_in sin; | |
505 | +#ifdef INET6 | |
506 | + struct sockaddr_in6 sin6; | |
507 | + char ntop_buf[INET6_ADDRSTRLEN]; | |
508 | +#endif | |
509 | int sock; | |
510 | INET_ADDR_LIST *addr_list; | |
511 | int conn_stat; | |
512 | @@ -135,7 +139,12 @@ | |
513 | /* | |
514 | * Sanity checks. | |
515 | */ | |
516 | +#ifdef INET6 | |
517 | + if (((addr->type==T_A) && (addr->data_len > sizeof(sin.sin_addr))) || | |
518 | + ((addr->type==T_AAAA) && (addr->data_len >sizeof(sin6.sin6_addr)))) { | |
519 | +#else | |
520 | if (addr->data_len > sizeof(sin.sin_addr)) { | |
521 | +#endif | |
522 | msg_warn("%s: skip address with length %d", myname, addr->data_len); | |
523 | smtp_errno = SMTP_RETRY; | |
524 | return (0); | |
525 | @@ -144,11 +153,23 @@ | |
526 | /* | |
527 | * Initialize. | |
528 | */ | |
529 | - memset((char *) &sin, 0, sizeof(sin)); | |
530 | - sin.sin_family = AF_INET; | |
531 | + switch(addr->type) { | |
532 | + case T_A: | |
533 | + memset((char *) &sin, 0, sizeof(sin)); | |
534 | + sin.sin_family = AF_INET; | |
535 | + if ((sock = socket(sin.sin_family, SOCK_STREAM, 0)) < 0) | |
536 | + msg_fatal("%s: socket: %m", myname); | |
537 | + break; | |
538 | +#ifdef INET6 | |
539 | + case T_AAAA: | |
540 | + memset((char *) &sin6, 0, sizeof(sin6)); | |
541 | + sin6.sin6_family = AF_INET6; | |
542 | + if ((sock = socket(sin6.sin6_family, SOCK_STREAM, 0)) < 0) | |
543 | + msg_fatal("%s: socket: %m", myname); | |
544 | + break; | |
545 | +#endif | |
546 | + } | |
547 | ||
548 | - if ((sock = socket(sin.sin_family, SOCK_STREAM, 0)) < 0) | |
549 | - msg_fatal("%s: socket: %m", myname); | |
550 | ||
551 | /* | |
552 | * When running as a virtual host, bind to the virtual interface so that | |
553 | @@ -171,21 +192,52 @@ | |
554 | /* | |
555 | * Connect to the SMTP server. | |
556 | */ | |
557 | - sin.sin_port = port; | |
558 | - memcpy((char *) &sin.sin_addr, addr->data, sizeof(sin.sin_addr)); | |
559 | + switch(addr->type) { | |
560 | + case T_A: | |
561 | + sin.sin_port = port; | |
562 | + memcpy((char *) &sin.sin_addr, addr->data, sizeof(sin.sin_addr)); | |
563 | + break; | |
564 | +#ifdef INET6 | |
565 | + case T_AAAA: | |
566 | + sin6.sin6_port = port; | |
567 | + memcpy((char *) &sin6.sin6_addr, addr->data, sizeof(sin6.sin6_addr)); | |
568 | + break; | |
569 | +#endif | |
570 | + } | |
571 | ||
572 | if (msg_verbose) | |
573 | msg_info("%s: trying: %s/%s port %d...", | |
574 | myname, addr->name, inet_ntoa(sin.sin_addr), ntohs(port)); | |
575 | if (var_smtp_conn_tmout > 0) { | |
576 | non_blocking(sock, NON_BLOCKING); | |
577 | - conn_stat = timed_connect(sock, (struct sockaddr *) & sin, | |
578 | - sizeof(sin), var_smtp_conn_tmout); | |
579 | + switch(addr->type) { | |
580 | + case T_A: | |
581 | + conn_stat = timed_connect(sock, (struct sockaddr *) & sin, | |
582 | + sizeof(sin), var_smtp_conn_tmout); | |
583 | + break; | |
584 | +#ifdef INET6 | |
585 | + case T_AAAA: | |
586 | + conn_stat = timed_connect(sock, (struct sockaddr *) & sin6, | |
587 | + sizeof(sin6), var_smtp_conn_tmout); | |
588 | + break; | |
589 | +#endif | |
590 | + } | |
591 | saved_errno = errno; | |
592 | non_blocking(sock, BLOCKING); | |
593 | errno = saved_errno; | |
594 | } else { | |
595 | - conn_stat = connect(sock, (struct sockaddr *) & sin, sizeof(sin)); | |
596 | + switch (addr->type) { | |
597 | + case T_A: | |
598 | + conn_stat = connect(sock, (struct sockaddr *) & sin, | |
599 | + sizeof(sin)); | |
600 | + break; | |
601 | +#ifdef INET6 | |
602 | + case T_AAAA: | |
603 | + conn_stat = connect(sock, (struct sockaddr *) & sin6, | |
604 | + sizeof(sin6)); | |
605 | + break; | |
606 | +#endif | |
607 | + } | |
608 | } | |
609 | if (conn_stat < 0) { | |
610 | vstring_sprintf(why, "connect to %s: %m", addr->name); | |
611 | @@ -227,10 +279,28 @@ | |
612 | return (0); | |
613 | } | |
614 | #ifdef HAS_SSL | |
615 | - pfixtls_setfd(sock); | |
616 | +switch (addr->type) { | |
617 | + case T_A: | |
618 | + pfixtls_setfd(sock); | |
619 | + break; | |
620 | +#ifdef INET6 | |
621 | +/* FIXME no IPv6 support in TLS ? */ | |
622 | + case T_AAAA: | |
623 | + break; | |
624 | +#endif | |
625 | +} | |
626 | #endif | |
627 | vstream_ungetc(stream, ch); | |
628 | - return (smtp_session_alloc(dest, stream, addr->name, inet_ntoa(sin.sin_addr))); | |
629 | + switch(addr->type) { | |
630 | + case T_A: | |
631 | + return (smtp_session_alloc(dest, stream, addr->name, | |
632 | + inet_ntoa(sin.sin_addr))); | |
633 | +#ifdef INET6 | |
634 | + case T_AAAA: | |
635 | + inet_ntop(AF_INET6, &sin6.sin6_addr, ntop_buf, sizeof(ntop_buf)); | |
636 | + return (smtp_session_alloc(dest, stream, addr->name, | |
637 | + strdup(ntop_buf))); | |
638 | +#endif | |
639 | } | |
640 | ||
641 | /* smtp_connect_host - direct connection to host */ | |
642 | --- postfix-19990906-pl08/smtp/smtp_unalias.c.wiget Mon Jan 18 21:11:49 1999 | |
643 | +++ postfix-19990906-pl08/smtp/smtp_unalias.c Wed Dec 1 13:01:35 1999 | |
644 | @@ -83,7 +83,11 @@ | |
645 | if ((result = htable_find(cache, name)) == 0) { | |
646 | fqdn = vstring_alloc(10); | |
647 | if (dns_lookup_types(name, smtp_unalias_flags, (DNS_RR **) 0, | |
648 | - fqdn, (VSTRING *) 0, T_MX, T_A, 0) != DNS_OK) | |
649 | + fqdn, (VSTRING *) 0, T_MX, T_A, | |
650 | +#ifdef INET6 | |
651 | + T_AAAA, | |
652 | +#endif | |
653 | + 0) != DNS_OK) | |
654 | vstring_strcpy(fqdn, name); | |
655 | htable_enter(cache, name, result = vstring_export(fqdn)); | |
656 | } | |
657 | --- postfix-19990906-pl08/dns/dns_lookup.c.wiget Sun Dec 20 02:38:29 1998 | |
658 | +++ postfix-19990906-pl08/dns/dns_lookup.c Wed Dec 1 13:01:35 1999 | |
659 | @@ -129,6 +129,9 @@ | |
660 | } DNS_REPLY; | |
661 | ||
662 | #define INET_ADDR_LEN 4 /* XXX */ | |
663 | +#ifdef INET6 | |
664 | +#define INET6_ADDR_LEN 16 | |
665 | +#endif | |
666 | ||
667 | /* dns_query - query name server and pre-parse the reply */ | |
668 | ||
669 | @@ -285,6 +288,19 @@ | |
670 | memcpy(temp, pos, fixed->length); | |
671 | data_len = fixed->length; | |
672 | break; | |
673 | +#ifdef INET6 | |
674 | + case T_AAAA: | |
675 | + if (fixed->length != INET6_ADDR_LEN) { | |
676 | + msg_warn("extract_answer: bad IPv6 address length: %d", fixed->length); | |
677 | + return (0); | |
678 | + } | |
679 | + if (fixed->length > sizeof(temp)) | |
680 | + msg_panic("dns_get_rr: length %d > DNS_NAME_LEN", | |
681 | + fixed->length); | |
682 | + memcpy(temp, pos, fixed->length); | |
683 | + data_len = fixed->length; | |
684 | + break; | |
685 | +#endif | |
686 | } | |
687 | return (dns_rr_create(rr_name, fixed, pref, temp, data_len)); | |
688 | } | |
689 | --- postfix-19990906-pl08/master/master_listen.c.wiget Mon Mar 22 02:32:59 1999 | |
690 | +++ postfix-19990906-pl08/master/master_listen.c Wed Dec 1 13:01:35 1999 | |
691 | @@ -63,6 +63,10 @@ | |
692 | ||
693 | #include "master.h" | |
694 | ||
695 | +#ifdef INET6 | |
696 | +char ntop_buf[INET6_ADDRSTRLEN]; | |
697 | +#endif | |
698 | + | |
699 | /* master_listen_init - enable connection requests */ | |
700 | ||
701 | void master_listen_init(MASTER_SERV *serv) | |
702 | @@ -113,8 +117,17 @@ | |
703 | close_on_exec(serv->listen_fd[0], CLOSE_ON_EXEC); | |
704 | } else { /* virtual */ | |
705 | for (n = 0; n < serv->listen_fd_count; n++) { | |
706 | +#ifdef INET6 | |
707 | + if (!inet_ntop(serv->addr_list.inet->addrs[n].__ss_family, | |
708 | + serv->addr_list.inet->addrs+n, | |
709 | + ntop_buf, sizeof(ntop_buf))) { | |
710 | + sprintf(ntop_buf, "?????"); | |
711 | + } | |
712 | + end_point = concatenate(ntop_buf, ":", serv->name, (char *) 0); | |
713 | +#else | |
714 | end_point = concatenate(inet_ntoa(serv->addr_list.inet->addrs[n]), | |
715 | ":", serv->name, (char *) 0); | |
716 | +#endif | |
717 | serv->listen_fd[n] | |
718 | = inet_listen(end_point, serv->max_proc > var_proc_limit ? | |
719 | serv->max_proc : var_proc_limit, NON_BLOCKING); | |
720 | --- postfix-19990906-pl08/makedefs.wiget Tue Aug 31 22:38:12 1999 | |
721 | +++ postfix-19990906-pl08/makedefs Wed Dec 1 13:01:35 1999 | |
722 | @@ -72,6 +72,7 @@ | |
723 | FreeBSD.2*) SYSTYPE=FREEBSD2 | |
724 | ;; | |
725 | FreeBSD.3*) SYSTYPE=FREEBSD3 | |
726 | + SYSLIBS="-L/usr/local/v6/lib -linet6" | |
727 | ;; | |
728 | FreeBSD.4*) SYSTYPE=FREEBSD4 | |
729 | ;; | |
730 | @@ -240,7 +241,7 @@ | |
731 | ARFL = $ARFL | |
732 | RANLIB = $RANLIB | |
733 | SYSLIBS = $AUXLIBS $SYSLIBS | |
734 | -CC = $CC $CCARGS | |
735 | +CC = $CC $CCARGS -DINET6 | |
736 | OPT = $OPT | |
737 | DEBUG = $DEBUG | |
738 | AWK = $AWK |