]> git.pld-linux.org Git - packages/postfix.git/blob - postfix-IPv6.patch
- allow compile with db, not db3.
[packages/postfix.git] / postfix-IPv6.patch
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.131758 seconds and 3 git commands to generate.