X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=postfix-ipv6.patch;h=f2bff74c4f9b6e619ed2e9414aedb25133476722;hb=88cb24db36decaad57c489345b9ec6a7448100d1;hp=a2632f965a5931ff1f056c8be4076ef321bc4cca;hpb=b5adc4885d204ec58c48752d95b0275863cc5341;p=packages%2Fpostfix.git diff --git a/postfix-ipv6.patch b/postfix-ipv6.patch index a2632f9..f2bff74 100644 --- a/postfix-ipv6.patch +++ b/postfix-ipv6.patch @@ -1,43 +1,6 @@ -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/IPV6_README snapshot-20010525/IPV6_README ---- snapshot-20010525.noipv6/IPV6_README Thu Jan 1 01:00:00 1970 -+++ snapshot-20010525/IPV6_README Tue May 29 18:23:16 2001 -@@ -0,0 +1,33 @@ -+$Id$ -+ -+ ALPHA IPv6 patch for Postfix. -+ -+ You can use IPv6 addresses in configuration file but -+you must enclose them with [] for example: [3ffe:902:12::10]. -+ -+Probably not all things work properly, yet. -+ -+ INFO: -+ - all previous versions of this patch (dated before 15 January -+ 2000) was against postfix-19991231-pl02 with pfixtls patch -+ applied (see ftp://ftp.aet.tu-cottbus.de/pub/pfixtls/ for more). -+ All newer patches are created against clean postfix version. -+ -+ BUGS && PROBLEMS: -+ - getaddrinfo call in smtp_addr_one() function doesn't always -+ return proper ai_addr structure (fixed). -+ - lmtp code isn't IPv6 ready (not fixed). -+ -+Please send all comments and patches to: -+ Arkadiusz Mi¶kiewicz , PLD GNU/Linux -+ Artur Frysiak , PLD GNU/Linux -+ -+Newest version of this patch can be found at: -+ http://www.misiek.eu.org/ipv6/ -+ -+Thanks to: -+- Mark Huizer -+ author of first IPv6 patch for postfix -+- KAME Team -+ fixes to Mark's patch -+diff -ruN --exclude *.orig --exclude *~ snapshot-20010329.noipv6/makedefs snapshot-20010329/makedefs -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/makedefs snapshot-20010525/makedefs ---- snapshot-20010525.noipv6/makedefs Tue May 1 01:16:07 2001 -+++ snapshot-20010525/makedefs Tue May 29 18:23:16 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/makedefs postfix-2.0.16/makedefs +--- postfix-2.0.16.orig/makedefs 2003-01-23 14:45:02.000000000 +0100 ++++ postfix-2.0.16/makedefs 2005-01-07 18:25:30.197331464 +0100 @@ -52,6 +52,21 @@ SYSTEM=`(uname -s) 2>/dev/null` RELEASE=`(uname -r) 2>/dev/null` @@ -60,11 +23,10 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/makedefs sn case "$VERSION" in dcosx*) SYSTEM=$VERSION;; -@@ -275,6 +290,26 @@ - esac +@@ -318,6 +333,26 @@ : ${CC='gcc $(WARN)'} ${OPT='-O'} ${DEBUG='-g'} ${AWK=awk} -+ + +case "$INET6" in +kame) + CCARGS="$CCARGS -DINET6 -D__ss_family=ss_family -D__ss_len=ss_len" @@ -77,83 +39,51 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/makedefs sn + ;; +linux) + CCARGS="$CCARGS -DINET6 -D__ss_family=ss_family" -+ if test -f /usr/include/libinet6/netinet/ip6.h -a \ -+ -f /usr/lib/libinet6.a; then ++ if test -f /usr/include/libinet6/netinet/ip6.h ++ then + CCARGS="$CCARGS -I/usr/include/libinet6 -DUSAGI_LIBINET6" + SYSLIBS="$SYSLIBS -linet6" + fi + ;; +esac - ++ export SYSTYPE AR ARFL RANLIB SYSLIBS CC OPT DEBUG AWK OPTS -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/dns/dns_lookup.c snapshot-20010525/src/dns/dns_lookup.c ---- snapshot-20010525.noipv6/src/dns/dns_lookup.c Sun Feb 4 19:16:20 2001 -+++ snapshot-20010525/src/dns/dns_lookup.c Tue May 29 18:23:16 2001 -@@ -132,6 +132,9 @@ - } DNS_REPLY; - - #define INET_ADDR_LEN 4 /* XXX */ -+#ifdef INET6 -+#define INET6_ADDR_LEN 16 -+#endif - - /* dns_query - query name server and pre-parse the reply */ - -@@ -337,6 +340,19 @@ - memcpy(temp, pos, fixed->length); - data_len = fixed->length; - break; -+#ifdef INET6 -+ case T_AAAA: -+ if (fixed->length != INET6_ADDR_LEN) { -+ msg_warn("extract_answer: bad IPv6 address length: %d", fixed->length); -+ return (0); -+ } -+ if (fixed->length > sizeof(temp)) -+ msg_panic("dns_get_rr: length %d > DNS_NAME_LEN", -+ fixed->length); -+ memcpy(temp, pos, fixed->length); -+ data_len = fixed->length; -+ break; -+#endif - case T_TXT: - data_len = MIN2(pos[0] + 1, MIN2(fixed->length + 1, sizeof(temp))); - for (src = pos + 1, dst = (unsigned char *) (temp); -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/Makefile.in snapshot-20010525/src/global/Makefile.in ---- snapshot-20010525.noipv6/src/global/Makefile.in Tue May 29 16:03:38 2001 -+++ snapshot-20010525/src/global/Makefile.in Tue May 29 18:23:16 2001 + sed 's/ / /g' < #include #include @@ -162,10 +92,11 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ +#include +#include +#endif ++#include /* Global library. */ -@@ -75,6 +80,9 @@ +@@ -75,6 +81,9 @@ const char *mynetworks(void) { static VSTRING *result; @@ -175,24 +106,55 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ if (result == 0) { char *myname = "mynetworks"; -@@ -87,6 +95,9 @@ +@@ -87,6 +96,13 @@ int junk; int i; int mask_style; +#ifdef INET6 + struct sockaddr *sa; ++ struct sockaddr_in6 *addr6; ++ struct sockaddr_in6 *mask6; ++ struct in6_addr net6; ++ int j; +#endif mask_style = name_mask("mynetworks mask style", mask_styles, var_mynetworks_style); -@@ -96,8 +107,18 @@ +@@ -96,8 +112,45 @@ my_mask_list = own_inet_mask_list(); for (i = 0; i < my_addr_list->used; i++) { +#ifdef INET6 + sa = (struct sockaddr *)&my_addr_list->addrs[i]; -+ if (sa->sa_family != AF_INET) { -+ vstring_sprintf_append(result, "XAATODOmynetworks "); ++ if (sa->sa_family == AF_INET6) { ++ addr6 = (struct sockaddr_in6 *)sa; ++ mask6 = (struct sockaddr_in6 *)&my_mask_list->addrs[i]; ++ ++ switch (mask_style) { ++ case MASK_STYLE_CLASS: ++ /* treat as subnet for IPv6 */ ++ case MASK_STYLE_SUBNET: ++ for (j=0; j<16; j++) ++ net6.s6_addr[j] = addr6->sin6_addr.s6_addr[j] & mask6->sin6_addr.s6_addr[j]; ++ for(shift=128; shift>0; shift--) ++ if ((mask6->sin6_addr.s6_addr[(shift-1) / 8]) & (0x80 >> ((shift-1) % 8))) ++ break; ++ break; ++ case MASK_STYLE_HOST: ++ memcpy (&net6, &(addr6->sin6_addr), sizeof(net6)); ++ shift=128; ++ break; ++ default: ++ msg_panic("unknown mynetworks mask style: %s", ++ var_mynetworks_style); ++ } ++ inet_ntop(AF_INET6, &net6, hbuf, sizeof(hbuf)); ++ if (!shift) ++ msg_warn("%s: skipped network with zero mask: [%s/0]", myname, hbuf); ++ else ++ vstring_sprintf_append(result, "[%s/%d] ", hbuf, shift); ++ continue; ++ } else if (sa->sa_family != AF_INET) { + continue; + } + addr = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr); @@ -204,7 +166,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ switch (mask_style) { -@@ -119,8 +140,15 @@ +@@ -119,8 +172,15 @@ mask = IN_CLASSD_NET; shift = IN_CLASSD_NSHIFT; } else { @@ -220,10 +182,29 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ } break; -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/own_inet_addr.c snapshot-20010525/src/global/own_inet_addr.c ---- snapshot-20010525.noipv6/src/global/own_inet_addr.c Sun Feb 25 02:51:39 2001 -+++ snapshot-20010525/src/global/own_inet_addr.c Tue May 29 18:23:16 2001 -@@ -39,6 +39,10 @@ +@@ -146,6 +206,18 @@ + var_mynetworks_style); + } + net.s_addr = htonl(addr & mask); ++ if (shift == BITS_PER_ADDR) { ++#ifdef INET6 ++ if (getnameinfo(sa, SA_LEN(sa), hbuf, sizeof(hbuf), NULL, 0, ++ NI_NUMERICHOST)) ++ strncpy(hbuf, "???", sizeof(hbuf)); ++ msg_warn("%s: skipped network with zero mask: %s/0", myname, hbuf); ++#else ++ msg_warn("%s: skipped network with zero mask: %s/0", ++ myname, inet_ntoa(my_addr_list->addrs[i])); ++#endif ++ continue; ++ } + vstring_sprintf_append(result, "%s/%d ", + inet_ntoa(net), BITS_PER_ADDR - shift); + } +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/global/own_inet_addr.c postfix-2.0.16/src/global/own_inet_addr.c +--- postfix-2.0.16.orig/src/global/own_inet_addr.c 2002-10-25 01:19:19.000000000 +0200 ++++ postfix-2.0.16/src/global/own_inet_addr.c 2005-01-07 18:25:30.198331312 +0100 +@@ -50,6 +50,10 @@ #include #include #include @@ -234,7 +215,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ #ifdef STRCASECMP_IN_STRINGS_H #include -@@ -101,10 +105,11 @@ +@@ -113,10 +117,11 @@ */ else { bufp = hosts = mystrdup(var_inet_interfaces); @@ -246,8 +227,8 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ + } myfree(hosts); - inet_addr_list_init(&local_addrs); -@@ -113,15 +118,39 @@ + /* +@@ -133,15 +138,39 @@ msg_fatal("could not find any active network interfaces"); for (nvirtual = 0; nvirtual < addr_list->used; nvirtual++) { for (nlocal = 0; /* see below */ ; nlocal++) { @@ -288,7 +269,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ } } inet_addr_list_free(&local_addrs); -@@ -131,6 +160,42 @@ +@@ -151,6 +180,42 @@ /* own_inet_addr - is this my own internet address */ @@ -331,7 +312,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ int own_inet_addr(struct in_addr * addr) { int i; -@@ -141,8 +206,8 @@ +@@ -161,8 +226,8 @@ for (i = 0; i < addr_list.used; i++) if (addr->s_addr == addr_list.addrs[i].s_addr) return (1); @@ -341,10 +322,64 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ /* own_inet_addr_list - return list of addresses */ -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/own_inet_addr.h snapshot-20010525/src/global/own_inet_addr.h ---- snapshot-20010525.noipv6/src/global/own_inet_addr.h Sat Feb 24 02:25:32 2001 -+++ snapshot-20010525/src/global/own_inet_addr.h Tue May 29 18:23:16 2001 -@@ -15,11 +15,18 @@ +@@ -213,6 +278,45 @@ + + /* proxy_inet_addr - is this my proxy internet address */ + ++#ifdef INET6 ++int proxy_inet_addr(struct sockaddr * addr) ++{ ++ int i; ++ char *p, *q; ++ int l; ++ struct sockaddr *sa; ++ ++ if (*var_proxy_interfaces == 0) ++ return (0); ++ ++ if (proxy_list.used == 0) ++ proxy_inet_addr_init(&proxy_list); ++ ++ for (i = 0; i < proxy_list.used; i++) { ++ sa = (struct sockaddr *)&proxy_list.addrs[i]; ++ if (addr->sa_family != sa->sa_family) ++ continue; ++ switch (addr->sa_family) { ++ case AF_INET: ++ p = (char *)&((struct sockaddr_in *)addr)->sin_addr; ++ q = (char *)&((struct sockaddr_in *)&addr_list.addrs[i])->sin_addr; ++ l = sizeof(struct in_addr); ++ break; ++ case AF_INET6: ++ /* XXX scope */ ++ p = (char *)&((struct sockaddr_in6 *)addr)->sin6_addr; ++ q = (char *)&((struct sockaddr_in6 *)&addr_list.addrs[i])->sin6_addr; ++ l = sizeof(struct in6_addr); ++ break; ++ default: ++ continue; ++ } ++ if (memcmp(p, q, l) == 0) ++ return (1); ++ } ++ return (0); ++} ++#else + int proxy_inet_addr(struct in_addr * addr) + { + int i; +@@ -228,6 +332,7 @@ + return (1); + return (0); + } ++#endif + + /* proxy_inet_addr_list - return list of addresses */ + +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/global/own_inet_addr.h postfix-2.0.16/src/global/own_inet_addr.h +--- postfix-2.0.16.orig/src/global/own_inet_addr.h 2002-10-25 01:07:05.000000000 +0200 ++++ postfix-2.0.16/src/global/own_inet_addr.h 2005-01-07 18:25:30.199331160 +0100 +@@ -15,14 +15,25 @@ * System library. */ #include @@ -362,10 +397,17 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ +#endif extern struct INET_ADDR_LIST *own_inet_addr_list(void); extern struct INET_ADDR_LIST *own_inet_mask_list(void); ++#ifdef INET6 ++extern int proxy_inet_addr(struct sockaddr *); ++#else + extern int proxy_inet_addr(struct in_addr *); ++#endif + extern struct INET_ADDR_LIST *proxy_inet_addr_list(void); -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/peer_name.c snapshot-20010525/src/global/peer_name.c ---- snapshot-20010525.noipv6/src/global/peer_name.c Sun Jan 28 16:23:02 2001 -+++ snapshot-20010525/src/global/peer_name.c Tue May 29 18:23:16 2001 + /* LICENSE +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/global/peer_name.c postfix-2.0.16/src/global/peer_name.c +--- postfix-2.0.16.orig/src/global/peer_name.c 2001-01-28 16:23:02.000000000 +0100 ++++ postfix-2.0.16/src/global/peer_name.c 2005-01-07 18:25:30.199331160 +0100 @@ -69,12 +69,32 @@ PEER_NAME *peer_name(int sock) { @@ -428,9 +470,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ case AF_UNSPEC: case AF_UNIX: peer.type = PEER_TYPE_LOCAL; -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/peer_name.h snapshot-20010525/src/global/peer_name.h ---- snapshot-20010525.noipv6/src/global/peer_name.h Fri Dec 11 19:55:32 1998 -+++ snapshot-20010525/src/global/peer_name.h Tue May 29 18:23:16 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/global/peer_name.h postfix-2.0.16/src/global/peer_name.h +--- postfix-2.0.16.orig/src/global/peer_name.h 1998-12-11 19:55:32.000000000 +0100 ++++ postfix-2.0.16/src/global/peer_name.h 2005-01-07 18:25:30.199331160 +0100 @@ -22,6 +22,9 @@ #define PEER_TYPE_UNKNOWN 0 #define PEER_TYPE_INET 1 @@ -441,10 +483,10 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ extern PEER_NAME *peer_name(int); -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/resolve_local.c snapshot-20010525/src/global/resolve_local.c ---- snapshot-20010525.noipv6/src/global/resolve_local.c Mon Apr 26 00:05:42 1999 -+++ snapshot-20010525/src/global/resolve_local.c Tue May 29 18:23:16 2001 -@@ -42,6 +42,7 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/global/resolve_local.c postfix-2.0.16/src/global/resolve_local.c +--- postfix-2.0.16.orig/src/global/resolve_local.c 2002-10-25 01:21:20.000000000 +0200 ++++ postfix-2.0.16/src/global/resolve_local.c 2005-01-07 18:25:30.199331160 +0100 +@@ -43,6 +43,7 @@ #include #include #include @@ -452,7 +494,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff -@@ -78,7 +79,12 @@ +@@ -80,7 +81,12 @@ { char *saved_addr = mystrdup(addr); char *dest; @@ -465,7 +507,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ int len; #define RETURN(x) { myfree(saved_addr); return(x); } -@@ -108,9 +114,25 @@ +@@ -118,9 +124,25 @@ if (*dest == '[' && dest[len - 1] == ']') { dest++; dest[len -= 2] = 0; @@ -485,15 +527,15 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ + } +#else if ((ipaddr.s_addr = inet_addr(dest)) != INADDR_NONE - && own_inet_addr(&ipaddr)) + && (own_inet_addr(&ipaddr) || proxy_inet_addr(&ipaddr))) RETURN(1); +#endif } /* -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/wildcard_inet_addr.c snapshot-20010525/src/global/wildcard_inet_addr.c ---- snapshot-20010525.noipv6/src/global/wildcard_inet_addr.c Thu Jan 1 01:00:00 1970 -+++ snapshot-20010525/src/global/wildcard_inet_addr.c Tue May 29 18:23:16 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/global/wildcard_inet_addr.c postfix-2.0.16/src/global/wildcard_inet_addr.c +--- postfix-2.0.16.orig/src/global/wildcard_inet_addr.c 1970-01-01 01:00:00.000000000 +0100 ++++ postfix-2.0.16/src/global/wildcard_inet_addr.c 2005-01-07 18:25:30.200331008 +0100 @@ -0,0 +1,82 @@ +/* System library. */ + @@ -577,9 +619,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ + + return (&addr_list); +} -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/wildcard_inet_addr.h snapshot-20010525/src/global/wildcard_inet_addr.h ---- snapshot-20010525.noipv6/src/global/wildcard_inet_addr.h Thu Jan 1 01:00:00 1970 -+++ snapshot-20010525/src/global/wildcard_inet_addr.h Tue May 29 18:23:16 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/global/wildcard_inet_addr.h postfix-2.0.16/src/global/wildcard_inet_addr.h +--- postfix-2.0.16.orig/src/global/wildcard_inet_addr.h 1970-01-01 01:00:00.000000000 +0100 ++++ postfix-2.0.16/src/global/wildcard_inet_addr.h 2005-01-07 18:25:30.200331008 +0100 @@ -0,0 +1,36 @@ +#ifndef _WILDCARD_INET_ADDR_H_INCLUDED_ +#define _WILDCARD_INET_ADDR_H_INCLUDED_ @@ -617,27 +659,35 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/ +/*--*/ + +#endif -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/master/master_ent.c snapshot-20010525/src/master/master_ent.c ---- snapshot-20010525.noipv6/src/master/master_ent.c Tue May 1 00:45:54 2001 -+++ snapshot-20010525/src/master/master_ent.c Tue May 29 18:30:51 2001 -@@ -284,8 +284,13 @@ - inet_addr_host(MASTER_INET_ADDRLIST(serv), host); +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/master/master_ent.c postfix-2.0.16/src/master/master_ent.c +--- postfix-2.0.16.orig/src/master/master_ent.c 2003-06-18 21:19:46.000000000 +0200 ++++ postfix-2.0.16/src/master/master_ent.c 2005-01-07 18:35:28.571364784 +0100 +@@ -92,6 +92,7 @@ + #include + #include + #include ++#include + + /* Local stuff. */ + +@@ -307,8 +308,13 @@ + inet_addr_list_uniq(MASTER_INET_ADDRLIST(serv)); serv->listen_fd_count = MASTER_INET_ADDRLIST(serv)->used; - } else if (strcasecmp(var_inet_interfaces, DEF_INET_INTERFACES) == 0) { + } else if (strcasecmp(saved_interfaces, DEF_INET_INTERFACES) == 0) { +#ifdef INET6 -+ MASTER_INET_ADDRLIST(serv) = wildcard_inet_addr_list(); -+ serv->listen_fd_count = MASTER_INET_ADDRLIST(serv)->used; ++ MASTER_INET_ADDRLIST(serv) = wildcard_inet_addr_list(); ++ serv->listen_fd_count = MASTER_INET_ADDRLIST(serv)->used; +#else MASTER_INET_ADDRLIST(serv) = 0; /* wild-card */ serv->listen_fd_count = 1; +#endif } else { MASTER_INET_ADDRLIST(serv) = own_inet_addr_list(); /* virtual */ - serv->listen_fd_count = MASTER_INET_ADDRLIST(serv)->used; -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/master/master_listen.c snapshot-20010525/src/master/master_listen.c ---- snapshot-20010525.noipv6/src/master/master_listen.c Tue May 1 00:47:57 2001 -+++ snapshot-20010525/src/master/master_listen.c Tue May 29 18:24:18 2001 -@@ -64,6 +64,11 @@ + inet_addr_list_uniq(MASTER_INET_ADDRLIST(serv)); +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/master/master_listen.c postfix-2.0.16/src/master/master_listen.c +--- postfix-2.0.16.orig/src/master/master_listen.c 2001-05-01 00:47:57.000000000 +0200 ++++ postfix-2.0.16/src/master/master_listen.c 2005-01-07 18:25:30.201330856 +0100 +@@ -64,13 +64,22 @@ #include "master.h" @@ -649,10 +699,11 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/master/ /* master_listen_init - enable connection requests */ void master_listen_init(MASTER_SERV *serv) -@@ -71,6 +76,10 @@ + { char *myname = "master_listen_init"; char *end_point; - int n; +- int n; ++ int n,m,tmpfd; +#ifdef INET6 + char hbuf[NI_MAXHOST]; + SOCKADDR_SIZE salen; @@ -660,10 +711,16 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/master/ /* * Find out what transport we should use, then create one or more -@@ -115,8 +124,17 @@ +@@ -111,18 +120,31 @@ + serv->listen_fd[0] = + inet_listen(MASTER_INET_PORT(serv), + serv->max_proc > var_proc_limit ? +- serv->max_proc : var_proc_limit, NON_BLOCKING); ++ serv->max_proc : var_proc_limit, NON_BLOCKING, 1); close_on_exec(serv->listen_fd[0], CLOSE_ON_EXEC); } else { /* virtual or host:port */ - for (n = 0; n < serv->listen_fd_count; n++) { +- for (n = 0; n < serv->listen_fd_count; n++) { ++ for (m = n = 0; n < serv->listen_fd_count; n++) { +#ifdef INET6 + if (getnameinfo((struct sockaddr *)&MASTER_INET_ADDRLIST(serv)->addrs[n], + SA_LEN((struct sockaddr *)&MASTER_INET_ADDRLIST(serv)->addrs[n]), @@ -674,29 +731,27 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/master/ +#else end_point = concatenate(inet_ntoa(MASTER_INET_ADDRLIST(serv)->addrs[n]), ":", MASTER_INET_PORT(serv), (char *) 0); +- serv->listen_fd[n] +#endif - serv->listen_fd[n] ++ tmpfd = inet_listen(end_point, serv->max_proc > var_proc_limit ? - serv->max_proc : var_proc_limit, NON_BLOCKING); -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/qmgr/qmgr_message.c snapshot-20010525/src/qmgr/qmgr_message.c ---- snapshot-20010525.noipv6/src/qmgr/qmgr_message.c Tue Feb 27 00:49:31 2001 -+++ snapshot-20010525/src/qmgr/qmgr_message.c Tue May 29 18:23:16 2001 -@@ -460,7 +460,11 @@ - * every front-ent program. - */ - if ((at = strrchr(recipient->address, '@')) != 0 -+#ifdef INET6 -+ && (at + 1)[strspn(at + 1, "[]0123456789.:abcdef")] != 0 -+#else - && (at + 1)[strspn(at + 1, "[]0123456789.")] != 0 -+#endif - && valid_hostname(at + 1, DONT_GRIPE) == 0) { - qmgr_bounce_recipient(message, recipient, - "bad host/domain syntax: \"%s\"", at + 1); -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/Makefile.in snapshot-20010525/src/smtp/Makefile.in ---- snapshot-20010525.noipv6/src/smtp/Makefile.in Tue May 29 16:03:38 2001 -+++ snapshot-20010525/src/smtp/Makefile.in Tue May 29 18:23:16 2001 -@@ -139,6 +139,7 @@ +- serv->max_proc : var_proc_limit, NON_BLOCKING); +- close_on_exec(serv->listen_fd[n], CLOSE_ON_EXEC); ++ serv->max_proc : var_proc_limit, NON_BLOCKING, 0); ++ if (tmpfd >= 0) { ++ serv->listen_fd[m] = tmpfd; ++ close_on_exec(serv->listen_fd[m++], CLOSE_ON_EXEC); ++ } + myfree(end_point); + } ++ serv->listen_fd_count=m; + } + break; + default: +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/smtp/Makefile.in postfix-2.0.16/src/smtp/Makefile.in +--- postfix-2.0.16.orig/src/smtp/Makefile.in 2005-01-07 18:22:25.253447208 +0100 ++++ postfix-2.0.16/src/smtp/Makefile.in 2005-01-07 18:25:30.201330856 +0100 +@@ -144,6 +144,7 @@ smtp_connect.o: ../../include/mail_params.h smtp_connect.o: ../../include/own_inet_addr.h smtp_connect.o: ../../include/dns.h @@ -704,10 +759,10 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/Ma smtp_connect.o: smtp.h smtp_connect.o: ../../include/argv.h smtp_connect.o: ../../include/deliver_request.h -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/smtp_addr.c snapshot-20010525/src/smtp/smtp_addr.c ---- snapshot-20010525.noipv6/src/smtp/smtp_addr.c Sat May 5 14:55:36 2001 -+++ snapshot-20010525/src/smtp/smtp_addr.c Tue May 29 18:23:16 2001 -@@ -112,18 +112,68 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/smtp/smtp_addr.c postfix-2.0.16/src/smtp/smtp_addr.c +--- postfix-2.0.16.orig/src/smtp/smtp_addr.c 2002-10-25 01:03:11.000000000 +0200 ++++ postfix-2.0.16/src/smtp/smtp_addr.c 2005-01-07 18:25:30.201330856 +0100 +@@ -134,18 +134,68 @@ static void smtp_print_addr(char *what, DNS_RR *addr_list) { DNS_RR *addr; @@ -784,7 +839,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm } msg_info("end %s address list", what); } -@@ -133,15 +183,23 @@ +@@ -155,15 +205,23 @@ static DNS_RR *smtp_addr_one(DNS_RR *addr_list, char *host, unsigned pref, VSTRING *why) { char *myname = "smtp_addr_one"; @@ -809,7 +864,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm /* * Interpret a numerical name as an address. */ -@@ -194,6 +252,48 @@ +@@ -216,6 +274,48 @@ smtp_errno = SMTP_FAIL; break; } @@ -858,7 +913,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm return (addr_list); } -@@ -229,6 +329,9 @@ +@@ -251,6 +351,9 @@ INET_ADDR_LIST *self; DNS_RR *addr; int i; @@ -868,7 +923,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm /* * Find the first address that lists any address that this mail system is -@@ -238,12 +341,36 @@ +@@ -260,12 +363,36 @@ self = own_inet_addr_list(); for (addr = addr_list; addr; addr = addr->next) { @@ -906,9 +961,47 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm } /* -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/smtp_connect.c snapshot-20010525/src/smtp/smtp_connect.c ---- snapshot-20010525.noipv6/src/smtp/smtp_connect.c Tue May 29 16:03:38 2001 -+++ snapshot-20010525/src/smtp/smtp_connect.c Tue May 29 18:23:16 2001 +@@ -273,12 +400,36 @@ + */ + self = proxy_inet_addr_list(); + for (addr = addr_list; addr; addr = addr->next) { +- for (i = 0; i < self->used; i++) ++ for (i = 0; i < self->used; i++) { ++#ifdef INET6 ++ sa = (struct sockaddr *)&self->addrs[i]; ++ switch(addr->type) { ++ case T_AAAA: ++ /* XXX scope */ ++ if (sa->sa_family != AF_INET6) ++ break; ++ if (memcmp(&((struct sockaddr_in6 *)sa)->sin6_addr, ++ addr->data, sizeof(struct in6_addr)) == 0) { ++ return(addr); ++ } ++ break; ++ case T_A: ++ if (sa->sa_family != AF_INET) ++ break; ++ if (memcmp(&((struct sockaddr_in *)sa)->sin_addr, ++ addr->data, sizeof(struct in_addr)) == 0) { ++ return(addr); ++ } ++ break; ++ } ++#else + if (INADDRP(addr->data)->s_addr == self->addrs[i].s_addr) { + if (msg_verbose) + msg_info("%s: found at pref %d", myname, addr->pref); + return (addr); + } ++#endif ++ } + } + + /* +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/smtp/smtp_connect.c postfix-2.0.16/src/smtp/smtp_connect.c +--- postfix-2.0.16.orig/src/smtp/smtp_connect.c 2005-01-07 18:22:25.254447056 +0100 ++++ postfix-2.0.16/src/smtp/smtp_connect.c 2005-01-07 18:25:30.202330704 +0100 @@ -81,6 +81,7 @@ /* System library. */ @@ -923,9 +1016,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm #include +#include #include - - /* Global library. */ -@@ -133,19 +135,45 @@ + #include + #include +@@ -135,19 +137,45 @@ VSTRING *why) { char *myname = "smtp_connect_addr"; @@ -975,7 +1068,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm msg_warn("%s: skip address with length %d", myname, addr->data_len); smtp_errno = SMTP_RETRY; return (0); -@@ -154,17 +182,39 @@ +@@ -156,17 +184,39 @@ /* * Initialize. */ @@ -1021,7 +1114,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm sin.sin_addr.s_addr = inet_addr(var_smtp_bind_addr); if (sin.sin_addr.s_addr == INADDR_NONE) msg_fatal("%s: bad %s parameter: %s", -@@ -173,6 +223,25 @@ +@@ -175,6 +225,25 @@ msg_warn("%s: bind %s: %m", myname, inet_ntoa(sin.sin_addr)); if (msg_verbose) msg_info("%s: bind %s", myname, inet_ntoa(sin.sin_addr)); @@ -1047,7 +1140,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm } /* -@@ -180,8 +249,17 @@ +@@ -182,8 +251,17 @@ * the mail appears to come from the "right" machine address. */ else if ((addr_list = own_inet_addr_list())->used == 1) { @@ -1066,7 +1159,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm if (!IN_CLASSA(inaddr) || !(((inaddr & IN_CLASSA_NET) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)) { if (bind(sock, (struct sockaddr *) & sin, sizeof(sin)) < 0) -@@ -189,30 +267,85 @@ +@@ -191,30 +269,85 @@ if (msg_verbose) msg_info("%s: bind %s", myname, inet_ntoa(sin.sin_addr)); } @@ -1095,9 +1188,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm + !(res->ai_addrlen == loopback->ai_addrlen && + memcmp(res->ai_addr, loopback->ai_addr, res->ai_addrlen) == 0)) { + if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) -+ msg_warn("%s: bind %s: %m", myname, hbufl); ++ msg_warn("%s: bind %s: %m", myname, hbufl); + if (msg_verbose) -+ msg_info("%s: bind %s", myname, hbufl); ++ msg_info("%s: bind %s", myname, hbufl); + } + if (res) + freeaddrinfo(res); @@ -1114,23 +1207,23 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm + switch (addr->type) { +#ifdef INET6 + case T_AAAA: -+ /* XXX scope unfriendly */ -+ memset(sin6, 0, sizeof(*sin6)); -+ sin6->sin6_port = port; -+ sin6->sin6_family = AF_INET6; -+ salen = sizeof(*sin6); -+ memcpy(&sin6->sin6_addr, addr->data, sizeof(sin6->sin6_addr)); -+ inet_ntop(AF_INET6, &sin6->sin6_addr, hbuf, sizeof(hbuf)); -+ break; ++ /* XXX scope unfriendly */ ++ memset(sin6, 0, sizeof(*sin6)); ++ sin6->sin6_port = port; ++ sin6->sin6_family = AF_INET6; ++ salen = sizeof(*sin6); ++ memcpy(&sin6->sin6_addr, addr->data, sizeof(sin6->sin6_addr)); ++ inet_ntop(AF_INET6, &sin6->sin6_addr, hbuf, sizeof(hbuf)); ++ break; +#endif + default: /* T_A */ -+ memset(sin, 0, sizeof(*sin)); -+ sin->sin_port = port; -+ sin->sin_family = AF_INET; -+ salen = sizeof(*sin); -+ memcpy(&sin->sin_addr, addr->data, sizeof(sin->sin_addr)); -+ inet_ntop(AF_INET, &sin->sin_addr, hbuf, sizeof(hbuf)); -+ break; ++ memset(sin, 0, sizeof(*sin)); ++ sin->sin_port = port; ++ sin->sin_family = AF_INET; ++ salen = sizeof(*sin); ++ memcpy(&sin->sin_addr, addr->data, sizeof(sin->sin_addr)); ++ inet_ntop(AF_INET, &sin->sin_addr, hbuf, sizeof(hbuf)); ++ break; + } +#ifdef HAS_SA_LEN + sa->sa_len = salen; @@ -1149,7 +1242,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm non_blocking(sock, BLOCKING); errno = saved_errno; } else { -- conn_stat = connect(sock, (struct sockaddr *) & sin, sizeof(sin)); +- conn_stat = sane_connect(sock, (struct sockaddr *) & sin, sizeof(sin)); + conn_stat = connect(sock, sa, salen); } if (conn_stat < 0) { @@ -1159,7 +1252,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm smtp_errno = SMTP_RETRY; close(sock); return (0); -@@ -222,8 +355,8 @@ +@@ -224,8 +357,8 @@ * Skip this host if it takes no action within some time limit. */ if (read_wait(sock, var_smtp_helo_tmout) < 0) { @@ -1170,18 +1263,16 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm smtp_errno = SMTP_RETRY; close(sock); return (0); -@@ -234,8 +367,8 @@ - */ +@@ -237,7 +370,7 @@ stream = vstream_fdopen(sock, O_RDWR); if ((ch = VSTREAM_GETC(stream)) == VSTREAM_EOF) { -- vstring_sprintf(why, "connect to %s[%s]: server dropped connection", + vstring_sprintf(why, "connect to %s[%s]: server dropped connection without sending the initial greeting", - addr->name, inet_ntoa(sin.sin_addr)); -+ vstring_sprintf(why, "connect to %s [%s]: server dropped connection", + addr->name, hbuf); smtp_errno = SMTP_RETRY; vstream_fclose(stream); return (0); -@@ -247,7 +380,7 @@ +@@ -249,7 +382,7 @@ */ if (ch == '4' && var_smtp_skip_4xx_greeting) { vstring_sprintf(why, "connect to %s[%s]: server refused mail service", @@ -1190,7 +1281,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm smtp_errno = SMTP_RETRY; vstream_fclose(stream); return (0); -@@ -258,12 +391,12 @@ +@@ -260,12 +393,12 @@ */ if (ch == '5' && var_smtp_skip_5xx_greeting) { vstring_sprintf(why, "connect to %s[%s]: server refused mail service", @@ -1205,26 +1296,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm } /* smtp_connect_host - direct connection to host */ -@@ -273,7 +406,7 @@ - SMTP_SESSION *session = 0; - DNS_RR *addr_list; - DNS_RR *addr; -- -+ - /* - * Try each address in the specified order until we find one that works. - * The addresses belong to the same A record, so we have no information -@@ -380,6 +513,7 @@ - msg_fatal("unknown service: %s/%s", service, protocol); - *portp = sp->s_port; - } -+ - return (buf); - } - -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/smtp_unalias.c snapshot-20010525/src/smtp/smtp_unalias.c ---- snapshot-20010525.noipv6/src/smtp/smtp_unalias.c Thu Sep 28 19:06:09 2000 -+++ snapshot-20010525/src/smtp/smtp_unalias.c Tue May 29 18:23:16 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/smtp/smtp_unalias.c postfix-2.0.16/src/smtp/smtp_unalias.c +--- postfix-2.0.16.orig/src/smtp/smtp_unalias.c 2000-09-28 19:06:09.000000000 +0200 ++++ postfix-2.0.16/src/smtp/smtp_unalias.c 2005-01-07 18:25:30.202330704 +0100 @@ -86,7 +86,11 @@ if ((result = htable_find(cache, name)) == 0) { fqdn = vstring_alloc(10); @@ -1238,38 +1312,12 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm vstring_strcpy(fqdn, name); htable_enter(cache, name, result = vstring_export(fqdn)); } -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/smtpd_check.c snapshot-20010525/src/smtpd/smtpd_check.c ---- snapshot-20010525.noipv6/src/smtpd/smtpd_check.c Tue May 29 16:03:38 2001 -+++ snapshot-20010525/src/smtpd/smtpd_check.c Tue May 29 18:23:16 2001 -@@ -812,7 +812,11 @@ - msg_info("%s: %s", myname, name); - - dns_status = dns_lookup_types(name, 0, (DNS_RR **) 0, (VSTRING *) 0, -- (VSTRING *) 0, T_A, T_MX, 0); -+ (VSTRING *) 0, T_A, T_MX, -+#ifdef INET6 -+ T_AAAA, -+#endif -+ 0); - if (dns_status != DNS_OK) - return (smtpd_check_reject(state, MAIL_ERROR_POLICY, - "%d <%s>: %s odrzucony/rejected: Host not found", -@@ -834,7 +838,11 @@ - msg_info("%s: %s", myname, name); - - dns_status = dns_lookup_types(name, 0, (DNS_RR **) 0, (VSTRING *) 0, -- (VSTRING *) 0, T_A, T_MX, 0); -+ (VSTRING *) 0, T_A, T_MX, -+#ifdef INET6 -+ T_AAAA, -+#endif -+ 0); - if (dns_status != DNS_OK) - return (smtpd_check_reject(state, MAIL_ERROR_POLICY, - "%d <%s>: %s odrzucony/rejected: Domain not found", -@@ -1003,6 +1011,49 @@ - - static int has_my_addr(char *host) +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/smtpd/smtpd_check.c postfix-2.0.16/src/smtpd/smtpd_check.c +--- postfix-2.0.16.orig/src/smtpd/smtpd_check.c 2005-01-07 18:22:25.302439760 +0100 ++++ postfix-2.0.16/src/smtpd/smtpd_check.c 2005-01-07 18:25:30.218328272 +0100 +@@ -1393,6 +1393,49 @@ + static int has_my_addr(SMTPD_STATE *state, const char *host, + const char *reply_name, const char *reply_class) { +#ifdef INET6 + char *myname = "has_my_addr"; @@ -1317,32 +1365,84 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s char *myname = "has_my_addr"; struct in_addr addr; char **cpp; -@@ -1038,6 +1089,7 @@ +@@ -1431,6 +1474,7 @@ msg_info("%s: host %s: no match", myname, host); return (NOPE); +#endif } - /* permit_mx_backup - permit use of me as MX backup for recipient domain */ -@@ -1544,9 +1596,14 @@ - int dns_status = DNS_FAIL; + /* i_am_mx - is this machine listed as MX relay */ +@@ -2015,11 +2059,28 @@ + #define CHK_ADDR_RETURN(x,y) { *found = y; return(x); } + + addr = STR(vstring_strcpy(error_text, address)); +- ++#ifdef INET6 ++ if (strncmp(addr, "::ffff:", 7) == 0 && msg_verbose) ++ msg_info("%s: %s v6 addr in v4 compat-mode, " ++ "converted to v4 for map checking compatibility (%s)", \ ++ myname, addr, addr+7); ++#endif ++ + if ((dict = dict_handle(table)) == 0) + msg_panic("%s: dictionary not found: %s", myname, table); + do { + if (flags == 0 || (flags & dict->flags) != 0) { ++#ifdef INET6 ++ if (strncmp(addr, "::ffff:", 7) == 0) { ++ /* try if ::ffff: formati is present in map, if not, try ++ traditional IPv4 format striping :ffff: part */ ++ if ((value = dict_get(dict, addr)) != 0 || \ ++ (value = dict_get(dict, addr+7)) != 0) ++ CHK_ADDR_RETURN(check_table_result(state, table, value, address, ++ reply_name, reply_class, ++ def_acl), FOUND); ++ } else ++#endif + if ((value = dict_get(dict, addr)) != 0) + CHK_ADDR_RETURN(check_table_result(state, table, value, address, + reply_name, reply_class, +@@ -2579,16 +2640,32 @@ + VSTRING *query; int i; - int result; + SMTPD_RBL_STATE *rbl; ++#ifdef INET6 + struct in_addr a; ++#else ++ struct in6_addr a; ++#endif if (msg_verbose) - msg_info("%s: %s", myname, state->addr); -+ + msg_info("%s: %s %s", myname, reply_class, addr); + +- /* +- * IPv4 only for now +- */ +-#ifdef INET6 ++#ifndef INET6 + /* IPv4 only for now */ -+ if (inet_pton(AF_INET, state->addr, &a) != 1) -+ return SMTPD_CHECK_DUNNO; + if (inet_pton(AF_INET, addr, &a) != 1) + return SMTPD_CHECK_DUNNO; ++ octets = argv_split(state->addr, "."); ++#else ++ /* IPv4 and IPv6-mapped IPv4 only for now */ ++ if (inet_pton(AF_INET, state->addr, &a) == 1) ++ octets = argv_split(state->addr, "."); ++ else { ++ struct in6_addr a6; ++ if (inet_pton(AF_INET6, state->addr, &a6) != 1) ++ return SMTPD_CHECK_DUNNO; ++ if (!IN6_IS_ADDR_V4MAPPED(&a6) || (strrchr(state->addr,':') == NULL)) ++ return SMTPD_CHECK_DUNNO; ++ octets = argv_split(strrchr(state->addr,':')+1, "."); ++ } + #endif /* - * IPv4 only for now -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/smtpd_peer.c snapshot-20010525/src/smtpd/smtpd_peer.c ---- snapshot-20010525.noipv6/src/smtpd/smtpd_peer.c Sun Jan 28 16:24:56 2001 -+++ snapshot-20010525/src/smtpd/smtpd_peer.c Tue May 29 18:40:28 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/smtpd/smtpd_peer.c postfix-2.0.16/src/smtpd/smtpd_peer.c +--- postfix-2.0.16.orig/src/smtpd/smtpd_peer.c 2002-08-22 19:50:51.000000000 +0200 ++++ postfix-2.0.16/src/smtpd/smtpd_peer.c 2005-01-07 18:25:30.205330248 +0100 @@ -63,6 +63,15 @@ #include #include @@ -1381,7 +1481,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s /* Application-specific. */ #include "smtpd.h" -@@ -102,16 +106,23 @@ +@@ -102,21 +106,28 @@ void smtpd_peer_init(SMTPD_STATE *state) { @@ -1401,6 +1501,12 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s + sa = (struct sockaddr *)&ss; + len = sizeof(ss); + /* + * Avoid suprious complaints from Purify on Solaris. + */ +- memset((char *) &sin, 0, len); ++ memset((char *) sa, 0, len); + /* * Look up the peer address information. */ @@ -1410,7 +1516,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s errno = 0; } -@@ -128,18 +139,51 @@ +@@ -132,23 +143,56 @@ /* * Look up and "verify" the client hostname. */ @@ -1458,8 +1564,15 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s + state->peer_code = (error == EAI_AGAIN ? 4 : 5); +#else state->peer_code = (h_errno == TRY_AGAIN ? 4 : 5); -- } else if (!valid_hostname(hp->h_name, DONT_GRIPE)) { +- } else if (valid_hostaddr(hp->h_name, DONT_GRIPE)) { +#endif ++ } else if (valid_hostaddr(hbuf, DONT_GRIPE)) { + msg_warn("numeric result %s in address->name lookup for %s", +- hp->h_name, state->addr); ++ hbuf, state->addr); + state->name = mystrdup("unknown"); + state->peer_code = 5; +- } else if (!valid_hostname(hp->h_name, DONT_GRIPE)) { + } else if (!valid_hostname(hbuf, DONT_GRIPE)) { state->name = mystrdup("unknown"); state->peer_code = 5; @@ -1469,7 +1582,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s state->peer_code = 2; /* -@@ -151,16 +195,31 @@ +@@ -160,16 +204,31 @@ state->peer_code = code; \ } @@ -1502,7 +1615,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s for (i = 0; /* void */ ; i++) { if (hp->h_addr_list[i] == 0) { msg_warn("%s: address not listed for hostname %s", -@@ -168,13 +227,12 @@ +@@ -177,12 +236,11 @@ REJECT_PEER_NAME(state, 5); break; } @@ -1517,35 +1630,49 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s } } +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/smtpstone/smtp-sink.c postfix-2.0.16/src/smtpstone/smtp-sink.c +--- postfix-2.0.16.orig/src/smtpstone/smtp-sink.c 2003-09-13 02:46:56.000000000 +0200 ++++ postfix-2.0.16/src/smtpstone/smtp-sink.c 2005-01-07 18:25:30.205330248 +0100 +@@ -607,7 +607,7 @@ + } else { + if (strncmp(argv[optind], "inet:", 5) == 0) + argv[optind] += 5; +- sock = inet_listen(argv[optind], backlog, BLOCKING); ++ sock = inet_listen(argv[optind], backlog, BLOCKING, 1); + } + /* -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/Makefile.in snapshot-20010525/src/util/Makefile.in ---- snapshot-20010525.noipv6/src/util/Makefile.in Tue May 29 16:03:38 2001 -+++ snapshot-20010525/src/util/Makefile.in Tue May 29 18:23:16 2001 -@@ -5,6 +5,7 @@ - dict_nisplus.c dict_open.c dir_forest.c doze.c environ.c \ - events.c exec_command.c fifo_listen.c fifo_trigger.c file_limit.c \ - find_inet.c fsspace.c fullname.c get_domainname.c get_hostname.c \ -+ get_port.c \ - htable.c inet_addr_host.c inet_addr_list.c inet_addr_local.c \ - inet_connect.c inet_listen.c inet_trigger.c inet_util.c \ - line_wrap.c lowercase.c lstat_as.c mac_parse.c make_dirs.c \ -@@ -30,6 +31,7 @@ - dict_nisplus.o dict_open.o dir_forest.o doze.o environ.o \ - events.o exec_command.o fifo_listen.o fifo_trigger.o file_limit.o \ - find_inet.o fsspace.o fullname.o get_domainname.o get_hostname.o \ -+ get_port.o \ - htable.o inet_addr_host.o inet_addr_list.o inet_addr_local.o \ - inet_connect.o inet_listen.o inet_trigger.o inet_util.o \ - line_wrap.o lowercase.o lstat_as.o mac_parse.o make_dirs.o \ -@@ -53,6 +55,7 @@ - dict_dbm.h dict_env.h dict_ht.h dict_ldap.h dict_mysql.h \ - dict_ni.h dict_nis.h dict_nisplus.h dir_forest.h events.h \ - exec_command.h find_inet.h fsspace.h fullname.h get_domainname.h \ -+ get_port.h \ - get_hostname.h htable.h inet_addr_host.h inet_addr_list.h \ - inet_addr_local.h inet_util.h iostuff.h line_wrap.h listen.h lstat_as.h \ - mac_parse.h make_dirs.h match_list.h match_ops.h msg.h msg_output.h \ -@@ -590,6 +593,7 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/Makefile.in postfix-2.0.16/src/util/Makefile.in +--- postfix-2.0.16.orig/src/util/Makefile.in 2005-01-07 18:22:25.293441128 +0100 ++++ postfix-2.0.16/src/util/Makefile.in 2005-01-07 18:25:30.209329640 +0100 +@@ -8,7 +8,7 @@ + dict_tcp.c dict_unix.c dir_forest.c doze.c duplex_pipe.c \ + environ.c events.c exec_command.c fifo_listen.c fifo_trigger.c \ + file_limit.c find_inet.c fsspace.c fullname.c get_domainname.c \ +- get_hostname.c hex_quote.c htable.c inet_addr_host.c \ ++ get_hostname.c get_port.c hex_quote.c htable.c inet_addr_host.c \ + inet_addr_list.c inet_addr_local.c inet_connect.c inet_listen.c \ + inet_trigger.c inet_util.c intv.c line_wrap.c lowercase.c \ + lstat_as.c mac_expand.c mac_parse.c make_dirs.c match_list.c \ +@@ -37,7 +37,7 @@ + dict_tcp.o dict_unix.o dir_forest.o doze.o duplex_pipe.o \ + environ.o events.o exec_command.o fifo_listen.o fifo_trigger.o \ + file_limit.o find_inet.o fsspace.o fullname.o get_domainname.o \ +- get_hostname.o hex_quote.o htable.o inet_addr_host.o \ ++ get_hostname.o get_port.o hex_quote.o htable.o inet_addr_host.o \ + inet_addr_list.o inet_addr_local.o inet_connect.o inet_listen.o \ + inet_trigger.o inet_util.o intv.o line_wrap.o lowercase.o \ + lstat_as.o mac_expand.o mac_parse.o make_dirs.o match_list.o \ +@@ -62,7 +62,7 @@ + dict_ht.h dict_ldap.h dict_mysql.h dict_ni.h dict_nis.h \ + dict_nisplus.h dict_pcre.h dict_pgsql.h dict_regexp.h dict_static.h dict_tcp.h \ + dict_unix.h dir_forest.h events.h exec_command.h find_inet.h \ +- fsspace.h fullname.h get_domainname.h get_hostname.h hex_quote.h \ ++ fsspace.h fullname.h get_domainname.h get_hostname.h get_port.h hex_quote.h \ + htable.h inet_addr_host.h inet_addr_list.h inet_addr_local.h \ + inet_util.h intv.h iostuff.h line_wrap.h listen.h lstat_as.h \ + mac_expand.h mac_parse.h make_dirs.h match_list.h match_ops.h \ +@@ -785,6 +785,7 @@ get_domainname.o: mymalloc.h get_domainname.o: get_hostname.h get_domainname.o: get_domainname.h @@ -1553,17 +1680,17 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/Ma get_hostname.o: get_hostname.c get_hostname.o: sys_defs.h get_hostname.o: mymalloc.h -@@ -701,6 +705,7 @@ +@@ -911,6 +912,7 @@ match_list.o: stringops.h match_list.o: argv.h match_list.o: dict.h +match_list.o: inet_util.h + match_list.o: match_ops.h match_list.o: match_list.h match_ops.o: match_ops.c - match_ops.o: sys_defs.h -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/get_port.c snapshot-20010525/src/util/get_port.c ---- snapshot-20010525.noipv6/src/util/get_port.c Thu Jan 1 01:00:00 1970 -+++ snapshot-20010525/src/util/get_port.c Tue May 29 18:23:16 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/get_port.c postfix-2.0.16/src/util/get_port.c +--- postfix-2.0.16.orig/src/util/get_port.c 1970-01-01 01:00:00.000000000 +0100 ++++ postfix-2.0.16/src/util/get_port.c 2005-01-07 18:25:30.206330096 +0100 @@ -0,0 +1,65 @@ +/*++ +/* NAME @@ -1630,9 +1757,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ge + /* return empty string */ + return NULL; +} -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/get_port.h snapshot-20010525/src/util/get_port.h ---- snapshot-20010525.noipv6/src/util/get_port.h Thu Jan 1 01:00:00 1970 -+++ snapshot-20010525/src/util/get_port.h Tue May 29 18:23:16 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/get_port.h postfix-2.0.16/src/util/get_port.h +--- postfix-2.0.16.orig/src/util/get_port.h 1970-01-01 01:00:00.000000000 +0100 ++++ postfix-2.0.16/src/util/get_port.h 2005-01-07 18:25:30.206330096 +0100 @@ -0,0 +1,28 @@ +#ifndef _GET_PORT_H_INCLUDED_ +#define _GET_PORT_H_INCLUDED_ @@ -1662,10 +1789,10 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ge +/*--*/ + +#endif -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/inet_addr_host.c snapshot-20010525/src/util/inet_addr_host.c ---- snapshot-20010525.noipv6/src/util/inet_addr_host.c Fri Dec 11 19:55:35 1998 -+++ snapshot-20010525/src/util/inet_addr_host.c Tue May 29 18:23:16 2001 -@@ -38,7 +38,10 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/inet_addr_host.c postfix-2.0.16/src/util/inet_addr_host.c +--- postfix-2.0.16.orig/src/util/inet_addr_host.c 1998-12-11 19:55:35.000000000 +0100 ++++ postfix-2.0.16/src/util/inet_addr_host.c 2005-01-07 18:28:55.469125408 +0100 +@@ -38,7 +38,11 @@ #include #include #include @@ -1673,10 +1800,11 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in #include +#include +#include ++#include #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff -@@ -48,15 +51,47 @@ +@@ -48,15 +52,47 @@ #include #include @@ -1724,7 +1852,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in if ((addr.s_addr = inet_addr(hostname)) != INADDR_NONE) { inet_addr_list_append(addr_list, &addr); } else { -@@ -65,9 +98,12 @@ +@@ -65,9 +101,12 @@ inet_addr_list_append(addr_list, (struct in_addr *) * hp->h_addr_list++); } @@ -1737,7 +1865,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in #ifdef TEST #include -@@ -78,6 +114,8 @@ +@@ -78,6 +117,8 @@ { INET_ADDR_LIST addr_list; int i; @@ -1746,7 +1874,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in msg_vstream_init(argv[0], VSTREAM_ERR); -@@ -89,8 +127,12 @@ +@@ -89,8 +130,12 @@ if (inet_addr_host(&addr_list, *argv) == 0) msg_fatal("not found: %s", *argv); @@ -1761,12 +1889,12 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in vstream_fflush(VSTREAM_OUT); } inet_addr_list_free(&addr_list); -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/inet_addr_list.c snapshot-20010525/src/util/inet_addr_list.c ---- snapshot-20010525.noipv6/src/util/inet_addr_list.c Mon Nov 20 19:06:30 2000 -+++ snapshot-20010525/src/util/inet_addr_list.c Tue May 29 18:23:16 2001 -@@ -44,6 +44,13 @@ - #include +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/inet_addr_list.c postfix-2.0.16/src/util/inet_addr_list.c +--- postfix-2.0.16.orig/src/util/inet_addr_list.c 2001-07-31 20:13:41.000000000 +0200 ++++ postfix-2.0.16/src/util/inet_addr_list.c 2005-01-07 18:25:30.207329944 +0100 +@@ -51,6 +51,13 @@ #include + #include +#include + @@ -1778,7 +1906,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in /* Utility library. */ #include -@@ -56,12 +63,39 @@ +@@ -63,12 +70,39 @@ { list->used = 0; list->size = 2; @@ -1818,31 +1946,46 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in void inet_addr_list_append(INET_ADDR_LIST *list, struct in_addr * addr) { char *myname = "inet_addr_list_append"; -@@ -76,6 +110,7 @@ +@@ -83,15 +117,22 @@ sizeof(*list->addrs) * list->size); list->addrs[list->used++] = *addr; } +#endif - /* inet_addr_list_free - destroy internet address list */ + /* inet_addr_list_comp - compare addresses */ -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/inet_addr_list.h snapshot-20010525/src/util/inet_addr_list.h ---- snapshot-20010525.noipv6/src/util/inet_addr_list.h Fri Dec 11 19:55:35 1998 -+++ snapshot-20010525/src/util/inet_addr_list.h Tue May 29 18:23:16 2001 -@@ -16,18 +16,37 @@ + static int inet_addr_list_comp(const void *a, const void *b) + { ++#ifdef INET6 ++ if(((struct sockaddr*)a)->sa_family != ((struct sockaddr*)b)->sa_family) ++ return ( ((struct sockaddr*)a)->sa_family - ((struct sockaddr*)b)->sa_family ); ++ return memcmp(a,b,SA_LEN((struct sockaddr*)a)); ++#else + const struct in_addr *a_addr = (const struct in_addr *) a; + const struct in_addr *b_addr = (const struct in_addr *) b; + + return (a_addr->s_addr - b_addr->s_addr); ++#endif + } + + /* inet_addr_list_uniq - weed out duplicates */ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/inet_addr_list.h postfix-2.0.16/src/util/inet_addr_list.h +--- postfix-2.0.16.orig/src/util/inet_addr_list.h 2001-07-31 19:56:47.000000000 +0200 ++++ postfix-2.0.16/src/util/inet_addr_list.h 2005-01-07 18:25:30.207329944 +0100 +@@ -16,19 +16,38 @@ */ #include +#ifndef SA_LEN +#ifndef HAS_SA_LEN -+#define SA_LEN(x) (((x)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) -+#define SS_LEN(x) (((x).ss_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) ++#define SA_LEN(x) (((x)->sa_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) ++#define SS_LEN(x) (((x).ss_family == AF_INET6) ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) +#else +#define SA_LEN(x) ((x)->sa_len) +#define SS_LEN(x) ((x).ss_len) +#endif +#endif -+ ++ /* * External interface. */ @@ -1850,7 +1993,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in int used; /* nr of elements in use */ int size; /* actual list size */ +#ifdef INET6 -+ struct sockaddr_storage *addrs; /* payload */ ++ struct sockaddr_storage *addrs; /* payload */ +#else struct in_addr *addrs; /* payload */ +#endif @@ -1858,6 +2001,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in extern void inet_addr_list_init(INET_ADDR_LIST *); extern void inet_addr_list_free(INET_ADDR_LIST *); + extern void inet_addr_list_uniq(INET_ADDR_LIST *); +#ifdef INET6 +struct sockaddr; +extern void inet_addr_list_append(INET_ADDR_LIST *, struct sockaddr *); @@ -1867,9 +2011,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in /* LICENSE /* .ad -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/inet_addr_local.c snapshot-20010525/src/util/inet_addr_local.c ---- snapshot-20010525.noipv6/src/util/inet_addr_local.c Sun Feb 25 19:20:19 2001 -+++ snapshot-20010525/src/util/inet_addr_local.c Tue May 29 18:47:06 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/inet_addr_local.c postfix-2.0.16/src/util/inet_addr_local.c +--- postfix-2.0.16.orig/src/util/inet_addr_local.c 2001-02-25 19:20:19.000000000 +0100 ++++ postfix-2.0.16/src/util/inet_addr_local.c 2005-01-07 18:25:30.207329944 +0100 @@ -47,6 +47,13 @@ #endif #include @@ -1884,7 +2028,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in /* Utility library. */ -@@ -78,18 +85,98 @@ +@@ -78,18 +85,104 @@ int inet_addr_local(INET_ADDR_LIST *addr_list, INET_ADDR_LIST *mask_list) { @@ -1892,26 +2036,28 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in + char *myname = "inet_addr_local"; + struct ifaddrs *ifap, *ifa; + int initial_count = addr_list->used; -+ struct sockaddr *sa; ++ struct sockaddr *sa, *sam; +#ifdef INET6 +#ifdef __KAME__ + struct sockaddr_in6 addr6; +#endif +#else -+ void *addr; ++ void *addr,*addrm; +#endif + + if (getifaddrs(&ifap) < 0) + msg_fatal("%s: getifaddrs: %m", myname); + + for (ifa = ifap; ifa; ifa = ifa->ifa_next) { -+ if (! (ifa->ifa_flags & IFF_RUNNING)) ++ if ((!(ifa->ifa_flags & IFF_RUNNING)) || (ifa->ifa_addr == NULL) || (ifa->ifa_netmask == NULL)) + continue; + sa = ifa->ifa_addr; ++ sam = ifa->ifa_netmask; + switch (ifa->ifa_addr->sa_family) { + case AF_INET: +#ifndef INET6 + addr = (void *)&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr; ++ addrm = (void *)&((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr; +#endif + break; +#ifdef INET6 @@ -1936,8 +2082,12 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in + +#ifdef INET6 + inet_addr_list_append(addr_list, sa); ++ if (mask_list != NULL) ++ inet_addr_list_append(mask_list, sam); +#else + inet_addr_list_append(addr_list, (struct in_addr *)addr); ++ if (mask_list != NULL) ++ inet_addr_list_append(mask_list, (struct in_addr *)addrm); +#endif + } + @@ -1985,7 +2135,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in /* * Get the network interface list. XXX The socket API appears to have no -@@ -126,10 +213,15 @@ +@@ -126,10 +219,15 @@ */ the_end = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len); for (ifr = ifc.ifc_req; ifr < the_end;) { @@ -2002,7 +2152,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in if (mask_list) { ifr_mask = (struct ifreq *) mymalloc(IFREQ_SIZE(ifr)); memcpy((char *) ifr_mask, (char *) ifr, IFREQ_SIZE(ifr)); -@@ -141,11 +233,61 @@ +@@ -141,11 +239,70 @@ } } } @@ -2020,8 +2170,13 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in + addr6.sin6_addr.s6_addr[2] = addr6.sin6_addr.s6_addr[3] = 0; + } +#endif -+ if (!(IN6_IS_ADDR_UNSPECIFIED(&addr6.sin6_addr))) ++ if (!(IN6_IS_ADDR_UNSPECIFIED(&addr6.sin6_addr))) { + inet_addr_list_append(addr_list, (struct sockaddr *)&addr6); ++ if (mask_list) { ++#error "mask_list for IPv6 without libinet6 not done yet (error to avoid open-relay)" ++ /* TODO: how to get netmask here? */ ++ } ++ } + } +#endif ifr = NEXT_INTERFACE(ifr); @@ -2052,6 +2207,10 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in + if (!gaierror) { + for (res = res0; res; res = res->ai_next) { + inet_addr_list_append(addr_list, res->ai_addr); ++ if (mask_list) { ++#error "mask_list for IPv6 without libinet6 not done yet (error to avoid open-relay)" ++ /* TODO: calculate netmask basing on plen */ ++ } + } + freeaddrinfo(res0); + } @@ -2064,7 +2223,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in } #ifdef TEST -@@ -158,6 +300,8 @@ +@@ -158,6 +315,8 @@ INET_ADDR_LIST addr_list; INET_ADDR_LIST mask_list; int i; @@ -2073,7 +2232,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in msg_vstream_init(argv[0], VSTREAM_ERR); -@@ -172,8 +316,17 @@ +@@ -172,8 +331,17 @@ msg_warn("found only one active network interface"); for (i = 0; i < addr_list.used; i++) { @@ -2093,9 +2252,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in } vstream_fflush(VSTREAM_OUT); inet_addr_list_free(&addr_list); -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/inet_connect.c snapshot-20010525/src/util/inet_connect.c ---- snapshot-20010525.noipv6/src/util/inet_connect.c Mon Nov 20 19:06:31 2000 -+++ snapshot-20010525/src/util/inet_connect.c Tue May 29 18:23:16 2001 +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/inet_connect.c postfix-2.0.16/src/util/inet_connect.c +--- postfix-2.0.16.orig/src/util/inet_connect.c 2003-09-13 03:04:12.000000000 +0200 ++++ postfix-2.0.16/src/util/inet_connect.c 2005-01-07 18:25:30.208329792 +0100 @@ -55,6 +55,9 @@ #include #include @@ -2106,7 +2265,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in /* Utility library. */ -@@ -73,7 +76,12 @@ +@@ -74,7 +77,12 @@ char *buf; char *host; char *port; @@ -2119,7 +2278,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in int sock; /* -@@ -81,14 +89,58 @@ +@@ -82,14 +90,58 @@ * the local host. */ buf = inet_parse(addr, &host, &port); @@ -2178,16 +2337,25 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in /* * Create a client socket. */ -@@ -121,4 +173,5 @@ +@@ -122,4 +174,5 @@ } return (sock); } +#endif } -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/inet_listen.c snapshot-20010525/src/util/inet_listen.c ---- snapshot-20010525.noipv6/src/util/inet_listen.c Mon Nov 20 19:06:32 2000 -+++ snapshot-20010525/src/util/inet_listen.c Tue May 29 18:23:16 2001 -@@ -51,6 +51,11 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/inet_listen.c postfix-2.0.16/src/util/inet_listen.c +--- postfix-2.0.16.orig/src/util/inet_listen.c 2003-09-13 01:50:50.000000000 +0200 ++++ postfix-2.0.16/src/util/inet_listen.c 2005-01-07 18:25:30.208329792 +0100 +@@ -6,7 +6,7 @@ + /* SYNOPSIS + /* #include + /* +-/* int inet_listen(addr, backlog, block_mode) ++/* int inet_listen(addr, backlog, block_mode, addinuse_fatal) + /* const char *addr; + /* int backlog; + /* int block_mode; +@@ -51,11 +51,17 @@ #include #include #include @@ -2199,9 +2367,18 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in #include #include #ifndef MAXHOSTNAMELEN -@@ -79,33 +84,109 @@ + #include + #endif ++#include + #include + #include + +@@ -77,35 +83,116 @@ + + /* inet_listen - create inet-domain listener */ - int inet_listen(const char *addr, int backlog, int block_mode) +-int inet_listen(const char *addr, int backlog, int block_mode) ++int inet_listen(const char *addr, int backlog, int block_mode, int addrinuse_fatal) { +#ifdef INET6 + struct addrinfo *res, *res0, hints; @@ -2219,6 +2396,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in +#endif int sock; int t = 1; ++ int addrinuse = 0; char *buf; char *host; char *port; @@ -2307,24 +2485,40 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in + + if (bind(sock, res->ai_addr, res->ai_addrlen) < 0) { + cause = "bind"; ++ if (errno == EADDRINUSE) ++ addrinuse = 1; + close(sock); + sock = -1; + continue; + } + break; + } -+ if (sock < 0) ++ if (sock < 0 && (addrinuse_fatal || !addrinuse)) + msg_fatal("%s: %m", cause); +#ifdef INET6 + freeaddrinfo(res0); +#endif ++ if (sock < 0) ++ return -1; non_blocking(sock, block_mode); if (listen(sock, backlog) < 0) msg_fatal("listen: %m"); -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/match_list.c snapshot-20010525/src/util/match_list.c ---- snapshot-20010525.noipv6/src/util/match_list.c Mon Nov 20 19:06:32 2000 -+++ snapshot-20010525/src/util/match_list.c Tue May 29 18:23:16 2001 -@@ -107,7 +107,7 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/listen.h postfix-2.0.16/src/util/listen.h +--- postfix-2.0.16.orig/src/util/listen.h 1999-03-22 02:57:11.000000000 +0100 ++++ postfix-2.0.16/src/util/listen.h 2005-01-07 18:25:30.208329792 +0100 +@@ -20,7 +20,7 @@ + * Listener external interface. + */ + extern int unix_listen(const char *, int, int); +-extern int inet_listen(const char *, int, int); ++extern int inet_listen(const char *, int, int, int); + extern int fifo_listen(const char *, int, int); + extern int stream_listen(const char *, int, int); + +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/match_list.c postfix-2.0.16/src/util/match_list.c +--- postfix-2.0.16.orig/src/util/match_list.c 2001-11-20 21:07:15.000000000 +0100 ++++ postfix-2.0.16/src/util/match_list.c 2005-01-07 18:25:30.209329640 +0100 +@@ -118,7 +118,7 @@ list = match_list_parse(list, vstring_str(buf)); if (vstream_fclose(fp)) msg_fatal("%s: read file %s: %m", myname, pattern); @@ -2333,27 +2527,27 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma for (cp = pattern; *cp == '!'; cp++) /* void */ ; if (dict_handle(pattern) == 0) -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/match_ops.c snapshot-20010525/src/util/match_ops.c ---- snapshot-20010525.noipv6/src/util/match_ops.c Mon Sep 6 03:02:14 1999 -+++ snapshot-20010525/src/util/match_ops.c Tue May 29 18:23:16 2001 -@@ -70,6 +70,307 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/match_ops.c postfix-2.0.16/src/util/match_ops.c +--- postfix-2.0.16.orig/src/util/match_ops.c 2003-04-14 16:44:19.000000000 +0200 ++++ postfix-2.0.16/src/util/match_ops.c 2005-01-07 18:25:30.210329488 +0100 +@@ -81,6 +81,308 @@ #include #include +#ifdef INET6 +/* -+ * $Id$ ++ * $Id$ ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version ++ * 2 of the License, or (at your option) any later version. + * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License -+ * as published by the Free Software Foundation; either version -+ * 2 of the License, or (at your option) any later version. ++ * Authors: Alexey Kuznetsov, + * -+ * Authors: Alexey Kuznetsov, -+ * + * Modifications: -+ * Artur Frysiak -+ * Arkadiusz Mi¶kiewicz ++ * Artur Frysiak ++ * Arkadiusz Mi¶kiewicz + */ + +#include @@ -2368,20 +2562,20 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma +#include +#include + -+#ifndef AF_DECnet -+#define AF_DECnet 12 ++#ifndef AF_DECnet ++#define AF_DECnet 12 +#endif + -+#ifndef PF_PACKET -+#define PF_PACKET 17 ++#ifndef PF_PACKET ++#define PF_PACKET 17 +#endif + +typedef struct +{ -+ unsigned char family; -+ unsigned char bytelen; -+ signed short bitlen; -+ unsigned int data[4]; ++ unsigned char family; ++ unsigned char bytelen; ++ signed short bitlen; ++ unsigned int data[4]; +} inet_prefix; + +/* prototypes */ @@ -2395,256 +2589,257 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma +int matches(char *, char *); +int inet_addr_match(inet_prefix *, inet_prefix *, int); +int mask_match(char *, char *, char *); -+ ++ +int get_integer(int *val, char *arg, int base) +{ -+ long res; -+ char *ptr; -+ -+ if (!arg || !*arg) -+ return -1; -+ res = strtol(arg, &ptr, base); -+ if (!ptr || ptr == arg || *ptr || res > INT_MAX || res < INT_MIN) -+ return -1; -+ *val = res; -+ return 0; ++ long res; ++ char *ptr; ++ ++ if (!arg || !*arg) ++ return -1; ++ res = strtol(arg, &ptr, base); ++ if (!ptr || ptr == arg || *ptr || res > INT_MAX || res < INT_MIN) ++ return -1; ++ *val = res; ++ return 0; +} + +int get_addr_1(inet_prefix *addr, char *name, int family) +{ -+ char *cp; -+ unsigned char *ap = (unsigned char*)addr->data; -+ int i; -+ -+ memset(addr, 0, sizeof(*addr)); -+ -+ if (strcmp(name, "default") == 0 || strcmp(name, "any") == 0) { -+ if (family == AF_DECnet) -+ return -1; -+ addr->family = family; -+ addr->bytelen = (family == AF_INET6 ? 16 : 4); -+ addr->bitlen = -1; -+ return 0; -+ } -+ -+ if (strchr(name, ':')) { -+ addr->family = AF_INET6; -+ if (family != AF_UNSPEC && family != AF_INET6) -+ return -1; -+ if (inet_pton(AF_INET6, name, addr->data) <= 0) -+ return -1; -+ addr->bytelen = 16; -+ addr->bitlen = -1; -+ return 0; -+ } -+ addr->family = AF_INET; -+ if (family != AF_UNSPEC && family != AF_INET) -+ return -1; -+ addr->bytelen = 4; -+ addr->bitlen = -1; -+ for (cp = name, i = 0; *cp; cp++) { -+ if (*cp <= '9' && *cp >= '0') { -+ ap[i] = 10*ap[i] + (*cp-'0'); -+ continue; -+ } -+ if (*cp == '.' && ++i <= 3) -+ continue; -+ return -1; -+ } -+ return 0; ++ char *cp; ++ unsigned char *ap = (unsigned char*)addr->data; ++ int i; ++ ++ memset(addr, 0, sizeof(*addr)); ++ ++ if (strcmp(name, "default") == 0 || strcmp(name, "any") == 0) { ++ if (family == AF_DECnet) ++ return -1; ++ addr->family = family; ++ addr->bytelen = (family == AF_INET6 ? 16 : 4); ++ addr->bitlen = -1; ++ return 0; ++ } ++ ++ if (strchr(name, ':')) { ++ addr->family = AF_INET6; ++ if (family != AF_UNSPEC && family != AF_INET6) ++ return -1; ++ if (inet_pton(AF_INET6, name, addr->data) <= 0) ++ return -1; ++ addr->bytelen = 16; ++ addr->bitlen = -1; ++ return 0; ++ } ++ addr->family = AF_INET; ++ if (family != AF_UNSPEC && family != AF_INET) ++ return -1; ++ addr->bytelen = 4; ++ addr->bitlen = -1; ++ for (cp = name, i = 0; *cp; cp++) { ++ if (*cp <= '9' && *cp >= '0') { ++ ap[i] = 10*ap[i] + (*cp-'0'); ++ continue; ++ } ++ if (*cp == '.' && ++i <= 3) ++ continue; ++ return -1; ++ } ++ return 0; +} + +int get_prefix_1(inet_prefix *dst, char *arg, int family) +{ -+ int err; -+ unsigned plen; -+ char *slash; -+ -+ memset(dst, 0, sizeof(*dst)); -+ -+ if (strcmp(arg, "default") == 0 || strcmp(arg, "any") == 0) { -+ if (family == AF_DECnet) -+ return -1; -+ dst->family = family; -+ dst->bytelen = 0; -+ dst->bitlen = 0; -+ return 0; -+ } -+ -+ slash = strchr(arg, '/'); -+ if (slash) -+ *slash = 0; -+ err = get_addr_1(dst, arg, family); -+ if (err == 0) { -+ switch(dst->family) { -+ case AF_INET6: -+ dst->bitlen = 128; -+ break; -+ case AF_DECnet: -+ dst->bitlen = 16; -+ break; -+ default: -+ case AF_INET: -+ dst->bitlen = 32; -+ } -+ if (slash) { -+ if (get_integer(&plen, slash+1, 0) || plen > dst->bitlen) { -+ err = -1; -+ goto done; -+ } -+ dst->bitlen = plen; -+ } -+ } ++ int err; ++ unsigned plen; ++ char *slash; ++ ++ memset(dst, 0, sizeof(*dst)); ++ ++ if (strcmp(arg, "default") == 0 || strcmp(arg, "any") == 0) { ++ if (family == AF_DECnet) ++ return -1; ++ dst->family = family; ++ dst->bytelen = 0; ++ dst->bitlen = 0; ++ return 0; ++ } ++ ++ slash = strchr(arg, '/'); ++ if (slash) ++ *slash = 0; ++ err = get_addr_1(dst, arg, family); ++ if (err == 0) { ++ switch(dst->family) { ++ case AF_INET6: ++ dst->bitlen = 128; ++ break; ++ case AF_DECnet: ++ dst->bitlen = 16; ++ break; ++ default: ++ case AF_INET: ++ dst->bitlen = 32; ++ } ++ if (slash) { ++ if (get_integer(&plen, slash+1, 0) || plen > dst->bitlen) { ++ err = -1; ++ goto done; ++ } ++ dst->bitlen = plen; ++ } ++ } +done: -+ if (slash) -+ *slash = '/'; -+ return err; ++ if (slash) ++ *slash = '/'; ++ return err; +} + +int get_addr(inet_prefix *dst, char *arg, int family) +{ +#ifdef AF_PACKET -+ if (family == AF_PACKET) -+ return -1; ++ if (family == AF_PACKET) ++ return -1; +#endif -+ if (get_addr_1(dst, arg, family)) -+ return -1; -+ return 0; ++ if (get_addr_1(dst, arg, family)) ++ return -1; ++ return 0; +} + +int get_prefix(inet_prefix *dst, char *arg, int family) +{ +#ifdef AF_PACKET -+ if (family == AF_PACKET) -+ return -1; ++ if (family == AF_PACKET) ++ return -1; +#endif -+ if (get_prefix_1(dst, arg, family)) -+ return -1; -+ return 0; ++ if (get_prefix_1(dst, arg, family)) ++ return -1; ++ return 0; +} + +unsigned int get_addr32(char *name) +{ -+ inet_prefix addr; -+ if (get_addr_1(&addr, name, AF_INET)) -+ return -1; -+ return addr.data[0]; ++ inet_prefix addr; ++ if (get_addr_1(&addr, name, AF_INET)) ++ return -1; ++ return addr.data[0]; +} + +int matches(char *cmd, char *pattern) +{ -+ int len = strlen(cmd); -+ if (len > strlen(pattern)) -+ return -1; -+ return memcmp(pattern, cmd, len); ++ int len = strlen(cmd); ++ if (len > strlen(pattern)) ++ return -1; ++ return memcmp(pattern, cmd, len); +} + +int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits) +{ -+ unsigned int *a1 = a->data; -+ unsigned int *a2 = b->data; -+ int words = bits >> 0x05; ++ unsigned int *a1 = a->data; ++ unsigned int *a2 = b->data; ++ int words = bits >> 0x05; + -+ bits &= 0x1f; ++ bits &= 0x1f; + -+ if (words) -+ if (memcmp(a1, a2, words << 2)) -+ return -1; ++ if (words) ++ if (memcmp(a1, a2, words << 2)) ++ return -1; + -+ if (bits) { -+ unsigned int w1, w2; -+ unsigned int mask; ++ if (bits) { ++ unsigned int w1, w2; ++ unsigned int mask; + -+ w1 = a1[words]; -+ w2 = a2[words]; ++ w1 = a1[words]; ++ w2 = a2[words]; + -+ mask = htonl((0xffffffff) << (0x20 - bits)); ++ mask = htonl((0xffffffff) << (0x20 - bits)); + -+ if ((w1 ^ w2) & mask) -+ return 1; -+ } ++ if ((w1 ^ w2) & mask) ++ return 1; ++ } + -+ return 0; ++ return 0; +} + +/* zero if matches */ +int mask_match(char *network, char *cprefix, char *address) +{ -+ inet_prefix *inetwork; -+ inet_prefix *iaddress; -+ int ret, prefix; -+ -+ if (!(network && address && cprefix)) -+ return -1; -+ prefix = strtol(cprefix, (char **)NULL, 10); -+ if ((prefix < 0) || (prefix > 128)) -+ return -1; -+ if ((strlen(network) == 0) || (strlen(address) == 0)) -+ return -1; -+ -+ inetwork = malloc(sizeof(inet_prefix)); -+ iaddress = malloc(sizeof(inet_prefix)); -+ -+ if ((get_addr(iaddress, address, AF_UNSPEC) >= 0) -+ && (get_addr(inetwork, network, AF_UNSPEC) >= 0)) -+ ret = inet_addr_match(inetwork, iaddress, prefix); -+ else -+ ret = -1; -+ free(inetwork); -+ free(iaddress); -+ -+ /* 1 if matches */ -+ /* return (!ret); */ -+ /* 0 if matches */ -+ return ret; ++ inet_prefix *inetwork; ++ inet_prefix *iaddress; ++ int ret, prefix; ++ ++ if (!(network && address && cprefix)) ++ return -1; ++ prefix = strtol(cprefix, (char **)NULL, 10); ++ if ((prefix < 0) || (prefix > 128)) ++ return -1; ++ if ((strlen(network) == 0) || (strlen(address) == 0)) ++ return -1; ++ ++ inetwork = malloc(sizeof(inet_prefix)); ++ iaddress = malloc(sizeof(inet_prefix)); ++ ++ if ((get_addr(iaddress, address, AF_UNSPEC) >= 0) ++ && (get_addr(inetwork, network, AF_UNSPEC) >= 0)) ++ ret = inet_addr_match(inetwork, iaddress, prefix); ++ else ++ ret = -1; ++ free(inetwork); ++ free(iaddress); ++ ++ /* 1 if matches */ ++ /* return (!ret); */ ++ /* 0 if matches */ ++ return ret; +} + +/* -+ * masked_match() - universal for IPv4 and IPv6 ++ * masked_match() - universal for IPv4 and IPv6 - 1 if matches + */ +int masked_match(net_tok, mask_tok, string) -+char *net_tok; -+char *mask_tok; -+char *string; ++char *net_tok; ++char *mask_tok; ++char *string; +{ +#ifdef INET6 -+ struct in6_addr in6[2]; -+ char v4addr[2][INET_ADDRSTRLEN]; -+ char newmask[6]; -+ int plen; ++ struct in6_addr in6[2]; ++ char v4addr[2][INET_ADDRSTRLEN]; ++ char newmask[6]; ++ int plen; +#endif + -+ /* Check for NULL */ -+ if (!(net_tok && mask_tok && string)) -+ return 1; ++ /* Check for NULL */ ++ if (!(net_tok && mask_tok && string)) ++ return 0; /* doesn't match!!! */ + -+ /* If IPv6 mapped convert to native-IPv4 */ ++ /* If IPv6 mapped convert to native-IPv4 */ +#ifdef INET6 -+ if (inet_pton(AF_INET6, net_tok, &in6[0]) == 1 && -+ inet_pton(AF_INET6, string, &in6[1]) == 1 && -+ IN6_IS_ADDR_V4MAPPED(&in6[0]) && IN6_IS_ADDR_V4MAPPED(&in6[1])) { -+ plen = atoi(mask_tok); -+ if (32 < plen && plen < 129) { -+ sprintf(newmask, "%d", plen - 96); -+ mask_tok = newmask; -+ } ++ if (inet_pton(AF_INET6, net_tok, &in6[0]) == 1 && ++ inet_pton(AF_INET6, string, &in6[1]) == 1 && ++ IN6_IS_ADDR_V4MAPPED(&in6[0]) && IN6_IS_ADDR_V4MAPPED(&in6[1])) { ++ plen = atoi(mask_tok); ++ if (32 < plen && plen < 129) { ++ sprintf(newmask, "%d", plen - 96); ++ mask_tok = newmask; ++ } + -+ (void)inet_ntop(AF_INET, &in6[0].s6_addr[12], v4addr[0], -+ sizeof(v4addr[0])); -+ net_tok = v4addr[0]; -+ (void)inet_ntop(AF_INET, &in6[1].s6_addr[12], v4addr[1], -+ sizeof(v4addr[1])); -+ string = v4addr[1]; -+ } ++ (void)inet_ntop(AF_INET, &in6[0].s6_addr[12], v4addr[0], ++ sizeof(v4addr[0])); ++ net_tok = v4addr[0]; ++ (void)inet_ntop(AF_INET, &in6[1].s6_addr[12], v4addr[1], ++ sizeof(v4addr[1])); ++ string = v4addr[1]; ++ } +#endif -+ return (!mask_match(net_tok, mask_tok, string)); ++ return (!mask_match(net_tok, mask_tok, string)); +} +#endif ++ + /* match_string - match a string literal */ - int match_string(const char *string, const char *pattern) -@@ -158,6 +459,7 @@ + int match_string(int unused_flags, const char *string, const char *pattern) +@@ -177,6 +479,7 @@ return (0); } @@ -2652,15 +2847,14 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma /* match_parse_mask - parse net/mask pattern */ static int match_parse_mask(const char *pattern, unsigned long *net_bits, -@@ -178,28 +480,55 @@ - myfree(saved_pattern); +@@ -198,28 +501,55 @@ return (mask != 0); } -+#endif ++#endif /* match_hostaddr - match host by address */ - int match_hostaddr(const char *addr, const char *pattern) + int match_hostaddr(int unused_flags, const char *addr, const char *pattern) { char *myname = "match_hostaddr"; +#ifdef INET6 @@ -2672,6 +2866,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma unsigned long mask_bits; unsigned long net_bits; unsigned long addr_bits; + struct in_addr net_addr; +#endif if (msg_verbose) @@ -2689,12 +2884,12 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma + escl = strchr(patternx,'['); + escr = strrchr(patternx,']'); + if (escl && escr) { -+ *escr = 0; -+ sprintf(patternx, "%s%s", escl + 1, escr + 1); -+ pattern = patternx; ++ *escr = 0; ++ sprintf(patternx, "%s%s", escl + 1, escr + 1); ++ pattern = patternx; + } +#endif -+ ++ /* * Try dictionary lookup. This can be case insensitive. XXX Probably * should also try again after stripping least significant octets. @@ -2705,24 +2900,24 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma +#else + if (strchr(pattern, ':') != 0) +#endif -+ { ++ { if (dict_lookup(pattern, addr) != 0) return (1); if (dict_errno != 0) -@@ -210,6 +539,12 @@ +@@ -230,6 +560,12 @@ /* * Try an exact match with the host address. */ +#ifdef INET6 + if (inet_pton(AF_INET6, addr, &in6) == 1 && IN6_IS_ADDR_V4MAPPED(&in6)) { -+ (void)inet_ntop(AF_INET, &in6.s6_addr[12], v4addr, sizeof(v4addr)); -+ addr = v4addr; ++ (void)inet_ntop(AF_INET, &in6.s6_addr[12], v4addr, sizeof(v4addr)); ++ addr = v4addr; + } +#endif if (strcasecmp(addr, pattern) == 0) { return (1); } -@@ -218,6 +553,20 @@ +@@ -238,6 +574,20 @@ * In a net/mask pattern, the mask is specified as the number of bits of * the network part. */ @@ -2731,29 +2926,29 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma + mask = split_at(network, '/'); + + if (masked_match(network, mask, (char *)addr)) { -+ myfree(network); -+ myfree(patternx); -+ return (1); ++ myfree(network); ++ myfree(patternx); ++ return (1); + } else { -+ myfree(network); -+ myfree(patternx); ++ myfree(network); ++ myfree(patternx); + } +#else -+ ++ if (match_parse_mask(pattern, &net_bits, &mask_shift)) { addr_bits = inet_addr(addr); if (addr_bits == INADDR_NONE) -@@ -225,5 +574,6 @@ - mask_bits = htonl((0xffffffff) << (BITS_PER_ADDR - mask_shift)); - return ((addr_bits & mask_bits) == (net_bits & mask_bits)); +@@ -252,5 +602,6 @@ + pattern, inet_ntoa(net_addr), mask_shift); + } } +#endif return (0); } -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/sys_defs.h snapshot-20010525/src/util/sys_defs.h ---- snapshot-20010525.noipv6/src/util/sys_defs.h Tue May 29 16:03:38 2001 -+++ snapshot-20010525/src/util/sys_defs.h Tue May 29 18:23:16 2001 -@@ -67,6 +67,10 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/sys_defs.h postfix-2.0.16/src/util/sys_defs.h +--- postfix-2.0.16.orig/src/util/sys_defs.h 2005-01-07 18:22:25.289441736 +0100 ++++ postfix-2.0.16/src/util/sys_defs.h 2005-01-07 18:25:30.211329336 +0100 +@@ -73,6 +73,10 @@ #define DEF_MAILBOX_LOCK "flock, dotlock" #endif @@ -2764,10 +2959,10 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/sy /* * UNIX on MAC. */ -diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/valid_hostname.c snapshot-20010525/src/util/valid_hostname.c ---- snapshot-20010525.noipv6/src/util/valid_hostname.c Sun Jan 28 15:10:18 2001 -+++ snapshot-20010525/src/util/valid_hostname.c Tue May 29 18:23:16 2001 -@@ -47,6 +47,13 @@ +diff -durN -x '*~' -x '*.orig' postfix-2.0.16.orig/src/util/valid_hostname.c postfix-2.0.16/src/util/valid_hostname.c +--- postfix-2.0.16.orig/src/util/valid_hostname.c 2002-12-20 02:33:41.000000000 +0100 ++++ postfix-2.0.16/src/util/valid_hostname.c 2005-01-07 18:25:30.211329336 +0100 +@@ -53,6 +53,13 @@ #include #include @@ -2781,7 +2976,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/va /* Utility library. */ #include "msg.h" -@@ -103,7 +110,23 @@ +@@ -109,7 +116,23 @@ msg_warn("%s: misplaced hyphen: %.100s", myname, name); return (0); } @@ -2806,7 +3001,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/va if (gripe) msg_warn("%s: invalid character %d(decimal): %.100s", myname, ch, name); -@@ -135,6 +158,9 @@ +@@ -141,6 +164,9 @@ int byte_count = 0; int byte_val = 0; int ch; @@ -2816,11 +3011,10 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/va #define BYTES_NEEDED 4 -@@ -146,6 +172,17 @@ - msg_warn("%s: empty address", myname); - return (0); +@@ -166,6 +192,17 @@ + return (1); } -+ + +#ifdef INET6 + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_INET6; @@ -2831,6 +3025,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/va + return 1; + } +#endif - ++ /* * Scary code to avoid sscanf() overflow nasties. + */