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
6 #include <inet_addr_list.h>
8 +#include <sys/socket.h>
9 +#include <netinet/in.h>
14 #include <own_inet_addr.h>
15 #include <mynetworks.h>
18 +char ntop_buf[INET6_ADDRSTRLEN];
21 /* mynetworks - return patterns that match my own networks */
23 const char *mynetworks(void)
29 + struct sockaddr_storage *sa;
32 result = vstring_alloc(20);
33 my_addr_list = own_inet_addr_list();
35 for (i = 0; i < my_addr_list->used; i++) {
37 + if (my_addr_list->addrs[i].__ss_family!=AF_INET) {
38 + vstring_sprintf_append(result, "XAATODOmynetworks ");
41 + sa = my_addr_list->addrs+i;
42 + addr = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
44 addr = ntohl(my_addr_list->addrs[i].s_addr);
46 if (IN_CLASSA(addr)) {
48 shift = IN_CLASSA_NSHIFT;
51 shift = IN_CLASSD_NSHIFT;
54 + if (inet_ntop(sa->__ss_family, sa, ntop_buf, sizeof(ntop_buf)))
55 + msg_fatal("%s: bad address class: %s", myname, ntop_buf);
57 + msg_fatal("%s: bad address class: ???", myname);
59 msg_fatal("%s: bad address class: %s",
60 myname, inet_ntoa(my_addr_list->addrs[i]));
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
69 /* own_inet_addr - is this my own internet address */
72 +int own_inet_addr(struct sockaddr_storage * addr)
76 + if (addr_list.used == 0)
77 + own_inet_addr_init(&addr_list);
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,
88 int own_inet_addr(struct in_addr * addr)
97 /* own_inet_addr_list - return list of addresses */
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
104 #include <netinet/in.h>
106 +#include <sys/socket.h>
110 * External interface.
113 +extern int own_inet_addr(struct sockaddr_storage *);
115 extern int own_inet_addr(struct in_addr *);
117 extern struct INET_ADDR_LIST *own_inet_addr_list(void);
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
123 #include <sys/param.h>
124 #include <sys/socket.h>
125 #include <netinet/in.h>
127 +#if (! __GLIBC__ >= 2 && __GLIBC_MINOR__ >=1 )
128 +#include <netinet6/in6.h>
131 #include <arpa/inet.h>
135 PEER_NAME *peer_name(int sock)
137 static PEER_NAME peer;
138 - struct sockaddr_in sin;
139 - SOCKADDR_SIZE len = sizeof(sin);
146 + struct sockaddr peer_un;
147 + struct sockaddr_in peer_un4;
149 + struct sockaddr_in6 peer_un6;
152 +#define sin p_un.peer_un
153 +#define sin4 p_un.peer_un4
155 +#define sin6 p_un.peer_un6
156 + char ntop_buf[INET6_ADDRSTRLEN];
158 + SOCKADDR_SIZE len = sizeof(p_un);
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) {
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);
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)));
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
191 #define PEER_TYPE_UNKNOWN 0
192 #define PEER_TYPE_INET 1
193 #define PEER_TYPE_LOCAL 2
195 +#define PEER_TYPE_INET6 3
198 extern PEER_NAME *peer_name(int);
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
203 msg_info("%s: %s", myname, name);
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,
212 if (dns_status != DNS_OK)
213 return (smtpd_check_reject(state, MAIL_ERROR_POLICY,
214 "%d <%s>: %s rejected: Host not found",
216 msg_info("%s: %s", myname, name);
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,
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
231 #include <netinet/in.h>
232 #include <arpa/inet.h>
235 +#include <sys/socket.h>
238 /* Utility library. */
241 #include <mymalloc.h>
242 #include <inet_addr_list.h>
245 + char ntop_buf[INET6_ADDRSTRLEN];
248 /* inet_addr_list_init - initialize internet address list */
250 void inet_addr_list_init(INET_ADDR_LIST *list)
255 + list->addrs = (struct sockaddr_storage *)
257 list->addrs = (struct in_addr *)
259 mymalloc(sizeof(*list->addrs) * list->size);
262 /* inet_addr_list_append - append address to internet address list */
265 +void inet_addr_list_append(INET_ADDR_LIST *list,
266 + struct sockaddr_storage * addr)
268 + char *myname = "inet_addr_list_append";
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);
275 + msg_info("%s: ??????", myname);
278 + if (list->used >= list->size)
280 + list->addrs = (struct sockaddr_storage *)
281 + myrealloc((char *) list->addrs,
282 + sizeof(*list->addrs) * list->size);
283 + list->addrs[list->used++] = *addr;
286 void inet_addr_list_append(INET_ADDR_LIST *list, struct in_addr * addr)
288 char *myname = "inet_addr_list_append";
290 sizeof(*list->addrs) * list->size);
291 list->addrs[list->used++] = *addr;
295 /* inet_addr_list_free - destroy internet address list */
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
300 typedef struct INET_ADDR_LIST {
301 int used; /* nr of elements in use */
302 int size; /* actual list size */
304 + struct sockaddr_storage *addrs; /* payload */
306 struct in_addr *addrs; /* payload */
310 extern void inet_addr_list_init(INET_ADDR_LIST *);
311 extern void inet_addr_list_free(INET_ADDR_LIST *);
313 +extern void inet_addr_list_append(INET_ADDR_LIST *, struct sockaddr_storage *);
315 extern void inet_addr_list_append(INET_ADDR_LIST *, struct in_addr *);
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
324 INET_ADDR_LIST addr_list;
327 + char buf[INET6_ADDRSTRLEN];
330 msg_vstream_init(argv[0], VSTREAM_ERR);
333 msg_warn("found only one active network interface");
335 for (i = 0; i < addr_list.used; i++)
337 + vstream_printf("%s\n", net_ntop(AF_INET, addr_list.addrs[i]));
339 vstream_printf("%s\n", inet_ntoa(addr_list.addrs[i]));
341 vstream_fflush(VSTREAM_OUT);
342 inet_addr_list_free(&addr_list);
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
347 #include <sys_defs.h>
348 #include <sys/socket.h>
349 #include <netinet/in.h>
351 +#if (! __GLIBC__ >= 2 && __GLIBC_MINOR__ >=1 )
352 +#include <netinet6/in6.h>
355 #include <arpa/inet.h>
357 #ifndef MAXHOSTNAMELEN
360 int inet_listen(const char *addr, int backlog, int block_mode)
363 + struct sockaddr_in6 sin;
364 + struct addrinfo *ai,hints;
367 struct sockaddr_in sin;
373 * Translate address information to internal form.
375 buf = inet_parse(addr, &host, &port);
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));
385 + sin.sin6_family = AF_INET6;
386 + sin.sin6_port = find_inet_port(port, "tcp");
388 + sin.sin6_addr.s6_addr = (*host ? find_inet_addr(host) : in6addr_any);
389 + sin.sin6_addr = in6addr_any;
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);
400 * Create a listener socket.
403 + if ((sock = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
405 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
407 msg_fatal("socket: %m");
408 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &t, sizeof(t)) < 0)
409 msg_fatal("setsockopt: %m");
411 + if (bind(sock, (struct sockaddr *) ai->ai_addr, ai->ai_addrlen) < 0)
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));
417 + msg_fatal("bind %s: %m", ai->ai_flags&AI_PASSIVE ?
418 + "IN6ADDR_ANY" : ai->ai_canonname);
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));
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
432 * Interpret a numerical name as an address.
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,
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;
448 * Append the addresses for this host to the address list.
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? */
453 switch (dns_lookup(host, T_A, 0, &addr, (VSTRING *) 0, why)) {
456 for (rr = addr; rr; rr = rr->next)
459 INET_ADDR_LIST *self;
463 + struct sockaddr_storage *sa;
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++)
473 + switch(addr->type) {
475 + if (self->addrs[i].__ss_family==AF_INET) {
476 + if (!bcmp(self->addrs[i].__ss_pad1, addr->data,
477 + sizeof(struct in_addr)))
482 + if (self->addrs[i].__ss_family==AF_INET6) {
483 + if (!bcmp(self->addrs[i].__ss_pad1, addr->data,
484 + sizeof(struct in6_addr)))
490 if (INADDRP(addr->data)->s_addr == self->addrs[i].s_addr) {
492 msg_info("%s: found at pref %d", myname, addr->pref);
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
503 char *myname = "smtp_connect_addr";
504 struct sockaddr_in sin;
506 + struct sockaddr_in6 sin6;
507 + char ntop_buf[INET6_ADDRSTRLEN];
510 INET_ADDR_LIST *addr_list;
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)))) {
520 if (addr->data_len > sizeof(sin.sin_addr)) {
522 msg_warn("%s: skip address with length %d", myname, addr->data_len);
523 smtp_errno = SMTP_RETRY;
525 @@ -144,11 +153,23 @@
529 - memset((char *) &sin, 0, sizeof(sin));
530 - sin.sin_family = AF_INET;
531 + switch(addr->type) {
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);
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);
548 - if ((sock = socket(sin.sin_family, SOCK_STREAM, 0)) < 0)
549 - msg_fatal("%s: socket: %m", myname);
552 * When running as a virtual host, bind to the virtual interface so that
553 @@ -171,21 +192,52 @@
555 * Connect to the SMTP server.
557 - sin.sin_port = port;
558 - memcpy((char *) &sin.sin_addr, addr->data, sizeof(sin.sin_addr));
559 + switch(addr->type) {
561 + sin.sin_port = port;
562 + memcpy((char *) &sin.sin_addr, addr->data, sizeof(sin.sin_addr));
566 + sin6.sin6_port = port;
567 + memcpy((char *) &sin6.sin6_addr, addr->data, sizeof(sin6.sin6_addr));
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) {
581 + conn_stat = timed_connect(sock, (struct sockaddr *) & sin,
582 + sizeof(sin), var_smtp_conn_tmout);
586 + conn_stat = timed_connect(sock, (struct sockaddr *) & sin6,
587 + sizeof(sin6), var_smtp_conn_tmout);
592 non_blocking(sock, BLOCKING);
595 - conn_stat = connect(sock, (struct sockaddr *) & sin, sizeof(sin));
596 + switch (addr->type) {
598 + conn_stat = connect(sock, (struct sockaddr *) & sin,
603 + conn_stat = connect(sock, (struct sockaddr *) & sin6,
610 vstring_sprintf(why, "connect to %s: %m", addr->name);
611 @@ -227,10 +279,28 @@
615 - pfixtls_setfd(sock);
616 +switch (addr->type) {
618 + pfixtls_setfd(sock);
621 +/* FIXME no IPv6 support in TLS ? */
627 vstream_ungetc(stream, ch);
628 - return (smtp_session_alloc(dest, stream, addr->name, inet_ntoa(sin.sin_addr)));
629 + switch(addr->type) {
631 + return (smtp_session_alloc(dest, stream, addr->name,
632 + inet_ntoa(sin.sin_addr)));
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)));
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
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,
654 vstring_strcpy(fqdn, name);
655 htable_enter(cache, name, result = vstring_export(fqdn));
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
662 #define INET_ADDR_LEN 4 /* XXX */
664 +#define INET6_ADDR_LEN 16
667 /* dns_query - query name server and pre-parse the reply */
670 memcpy(temp, pos, fixed->length);
671 data_len = fixed->length;
675 + if (fixed->length != INET6_ADDR_LEN) {
676 + msg_warn("extract_answer: bad IPv6 address length: %d", fixed->length);
679 + if (fixed->length > sizeof(temp))
680 + msg_panic("dns_get_rr: length %d > DNS_NAME_LEN",
682 + memcpy(temp, pos, fixed->length);
683 + data_len = fixed->length;
687 return (dns_rr_create(rr_name, fixed, pref, temp, data_len));
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
696 +char ntop_buf[INET6_ADDRSTRLEN];
699 /* master_listen_init - enable connection requests */
701 void master_listen_init(MASTER_SERV *serv)
703 close_on_exec(serv->listen_fd[0], CLOSE_ON_EXEC);
704 } else { /* virtual */
705 for (n = 0; n < serv->listen_fd_count; n++) {
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, "?????");
712 + end_point = concatenate(ntop_buf, ":", serv->name, (char *) 0);
714 end_point = concatenate(inet_ntoa(serv->addr_list.inet->addrs[n]),
715 ":", serv->name, (char *) 0);
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
723 FreeBSD.2*) SYSTYPE=FREEBSD2
725 FreeBSD.3*) SYSTYPE=FREEBSD3
726 + SYSLIBS="-L/usr/local/v6/lib -linet6"
728 FreeBSD.4*) SYSTYPE=FREEBSD4
733 SYSLIBS = $AUXLIBS $SYSLIBS
735 +CC = $CC $CCARGS -DINET6