]> git.pld-linux.org Git - packages/postfix.git/blame - postfix-IPv6.patch
- allow compile with db, not db3.
[packages/postfix.git] / postfix-IPv6.patch
CommitLineData
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
This page took 0.122294 seconds and 4 git commands to generate.