]> git.pld-linux.org Git - packages/postfix.git/blobdiff - postfix-ipv6.patch
- fixes against 2.0.3 (generally - 2.0) - now builds, should work
[packages/postfix.git] / postfix-ipv6.patch
index a2632f965a5931ff1f056c8be4076ef321bc4cca..2266407e4af7a8441fe90a2c5256d389c3c6e052 100644 (file)
@@ -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 <misiek@pld.org.pl>, PLD GNU/Linux
-+          Artur Frysiak <wiget@pld.org.pl>, PLD GNU/Linux
-+
-+Newest version of this patch can be found at:
-+          http://www.misiek.eu.org/ipv6/
-+
-+Thanks to:
-+- Mark Huizer <xaa@timewasters.nl>
-+      author of first IPv6 patch for postfix
-+- KAME Team <core@kame.net>
-+      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 -Nur postfix-1.1.2.orig/makedefs postfix-1.1.2/makedefs
+--- postfix-1.1.2.orig/makedefs        Fri Jan 25 15:17:18 2002
++++ postfix-1.1.2/makedefs     Mon Jan 28 12:40:04 2002
 @@ -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
+@@ -292,6 +307,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"
@@ -84,75 +46,43 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/makedefs sn
 +      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' <<EOF
+diff -Nur postfix-1.1.2.orig/src/global/Makefile.in postfix-1.1.2/src/global/Makefile.in
+--- postfix-1.1.2.orig/src/global/Makefile.in  Mon Jan 28 12:38:34 2002
++++ postfix-1.1.2/src/global/Makefile.in       Mon Jan 28 12:40:04 2002
+diff -Nur postfix-1.1.2.orig/src/global/mynetworks.c postfix-1.1.2/src/global/mynetworks.c
 @@ -19,7 +19,7 @@
        timed_ipc.c tok822_find.c tok822_node.c tok822_parse.c \
        tok822_resolve.c tok822_rewrite.c tok822_tree.c xtext.c bounce_log.c \
        flush_clnt.c mail_conf_time.c mbox_conf.c mbox_open.c abounce.c \
--      pfixtls.c
-+      pfixtls.c wildcard_inet_addr.c
+-      verp_sender.c match_parent_style.c mime_state.c header_token.c \
++      verp_sender.c match_parent_style.c mime_state.c header_token.c wildcard_inet_addr.c\
+       strip_addr.c virtual8_maps.c hold_message.c dict_proxy.c mail_dict.c \
+       pfixtls.c
  OBJS  = been_here.o bounce.o canon_addr.o cleanup_strerror.o clnt_stream.o \
-       debug_peer.o debug_process.o defer.o deliver_completed.o \
-       deliver_flock.o deliver_pass.o deliver_request.o domain_list.o \
-@@ -40,7 +40,7 @@
+@@ -42,7 +42,7 @@
        timed_ipc.o tok822_find.o tok822_node.o tok822_parse.o \
        tok822_resolve.o tok822_rewrite.o tok822_tree.o xtext.o bounce_log.o \
        flush_clnt.o mail_conf_time.o mbox_conf.o mbox_open.o abounce.o \
--      pfixtls.o
-+      pfixtls.o wildcard_inet_addr.o
+-      verp_sender.o match_parent_style.o mime_state.o header_token.o \
++      verp_sender.o match_parent_style.o mime_state.o header_token.o wildcard_inet_addr.o\
+       strip_addr.o virtual8_maps.o hold_message.o dict_proxy.o mail_dict.o \
+       pfixtls.o
  HDRS  = been_here.h bounce.h canon_addr.h cleanup_user.h clnt_stream.h \
-       config.h debug_peer.h debug_process.h defer.h deliver_completed.h \
-       deliver_flock.h deliver_pass.h deliver_request.h domain_list.h \
-@@ -56,7 +56,7 @@
-       recipient_list.h record.h resolve_clnt.h resolve_local.h \
+@@ -61,7 +61,7 @@
        rewrite_clnt.h sent.h smtp_stream.h split_addr.h string_list.h \
        sys_exits.h timed_ipc.h tok822.h xtext.h bounce_log.h flush_clnt.h \
--      mbox_conf.h mbox_open.h abounce.h pfixtls.h
-+      mbox_conf.h mbox_open.h abounce.h pfixtls.h wildcard_inet_addr.h
+       mbox_conf.h mbox_open.h abounce.h qmqp_proto.h verp_sender.h \
+-      match_parent_style.h quote_flags.h mime_state.h header_token.h \
++      match_parent_style.h quote_flags.h mime_state.h header_token.h wildcard_inet_addr.h\
+       lex_822.h strip_addr.h virtual8_maps.h hold_message.h dict_proxy.h \
+       mail_dict.h pfixtls.h
  TESTSRC       = rec2stream.c stream2rec.c recdump.c
- WARN  = -W -Wformat -Wimplicit -Wmissing-prototypes \
-       -Wparentheses -Wstrict-prototypes -Wswitch -Wuninitialized \
-diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/mynetworks.c snapshot-20010525/src/global/mynetworks.c
---- snapshot-20010525.noipv6/src/global/mynetworks.c   Sun Feb 25 02:46:07 2001
-+++ snapshot-20010525/src/global/mynetworks.c  Tue May 29 18:23:16 2001
+--- postfix-1.1.2.orig/src/global/mynetworks.c Sun Feb 25 02:46:07 2001
++++ postfix-1.1.2/src/global/mynetworks.c      Mon Jan 28 12:40:04 2002
 @@ -50,6 +50,11 @@
  #include <vstring.h>
  #include <inet_addr_list.h>
@@ -185,14 +115,15 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/
  
        mask_style = name_mask("mynetworks mask style", mask_styles,
                               var_mynetworks_style);
-@@ -96,8 +107,18 @@
+@@ -96,8 +107,19 @@
        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)
++                  vstring_sprintf_append(result, "XAATODOmynetworks ");
 +              continue;
 +          }
 +          addr = ntohl(((struct sockaddr_in *)sa)->sin_addr.s_addr);
@@ -220,9 +151,9 @@ 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
+diff -Nur postfix-1.1.2.orig/src/global/own_inet_addr.c postfix-1.1.2/src/global/own_inet_addr.c
+--- postfix-1.1.2.orig/src/global/own_inet_addr.c      Tue Jul 31 20:38:29 2001
++++ postfix-1.1.2/src/global/own_inet_addr.c   Mon Jan 28 12:40:04 2002
 @@ -39,6 +39,10 @@
  #include <netinet/in.h>
  #include <arpa/inet.h>
@@ -246,8 +177,8 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/
 +      }
        myfree(hosts);
  
-       inet_addr_list_init(&local_addrs);
-@@ -113,15 +118,39 @@
+       /*
+@@ -121,15 +126,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 +219,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/
            }
        }
        inet_addr_list_free(&local_addrs);
-@@ -131,6 +160,42 @@
+@@ -139,6 +168,42 @@
  
  /* own_inet_addr - is this my own internet address */
  
@@ -331,7 +262,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 @@
+@@ -149,8 +214,8 @@
      for (i = 0; i < addr_list.used; i++)
        if (addr->s_addr == addr_list.addrs[i].s_addr)
            return (1);
@@ -341,10 +272,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 -Nur postfix-1.1.2.orig/src/global/own_inet_addr.h postfix-1.1.2/src/global/own_inet_addr.h
+--- postfix-1.1.2.orig/src/global/own_inet_addr.h      Sat Feb 24 02:25:32 2001
++++ postfix-1.1.2/src/global/own_inet_addr.h   Mon Jan 28 12:40:04 2002
+@@ -15,14 +15,25 @@
    * System library.
    */
  #include <netinet/in.h>
@@ -362,10 +347,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 -Nur postfix-1.1.2.orig/src/global/peer_name.c postfix-1.1.2/src/global/peer_name.c
+--- postfix-1.1.2.orig/src/global/peer_name.c  Sun Jan 28 16:23:02 2001
++++ postfix-1.1.2/src/global/peer_name.c       Mon Jan 28 12:40:04 2002
 @@ -69,12 +69,32 @@
  PEER_NAME *peer_name(int sock)
  {
@@ -428,9 +420,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 -Nur postfix-1.1.2.orig/src/global/peer_name.h postfix-1.1.2/src/global/peer_name.h
+--- postfix-1.1.2.orig/src/global/peer_name.h  Fri Dec 11 19:55:32 1998
++++ postfix-1.1.2/src/global/peer_name.h       Mon Jan 28 12:40:04 2002
 @@ -22,6 +22,9 @@
  #define PEER_TYPE_UNKNOWN     0
  #define PEER_TYPE_INET                1
@@ -441,9 +433,9 @@ 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
+diff -Nur postfix-1.1.2.orig/src/global/resolve_local.c postfix-1.1.2/src/global/resolve_local.c
+--- postfix-1.1.2.orig/src/global/resolve_local.c      Fri Jan 18 15:06:51 2002
++++ postfix-1.1.2/src/global/resolve_local.c   Mon Jan 28 12:40:04 2002
 @@ -42,6 +42,7 @@
  #include <netinet/in.h>
  #include <arpa/inet.h>
@@ -452,7 +444,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/global/
  
  #ifndef INADDR_NONE
  #define INADDR_NONE 0xffffffff
-@@ -78,7 +79,12 @@
+@@ -79,7 +80,12 @@
  {
      char   *saved_addr = mystrdup(addr);
      char   *dest;
@@ -465,7 +457,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 +477,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 -Nur postfix-1.1.2.orig/src/global/wildcard_inet_addr.c postfix-1.1.2/src/global/wildcard_inet_addr.c
+--- postfix-1.1.2.orig/src/global/wildcard_inet_addr.c Thu Jan  1 01:00:00 1970
++++ postfix-1.1.2/src/global/wildcard_inet_addr.c      Mon Jan 28 12:40:04 2002
 @@ -0,0 +1,82 @@
 +/* System library. */
 +
@@ -577,9 +569,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 -Nur postfix-1.1.2.orig/src/global/wildcard_inet_addr.h postfix-1.1.2/src/global/wildcard_inet_addr.h
+--- postfix-1.1.2.orig/src/global/wildcard_inet_addr.h Thu Jan  1 01:00:00 1970
++++ postfix-1.1.2/src/global/wildcard_inet_addr.h      Mon Jan 28 12:40:04 2002
 @@ -0,0 +1,36 @@
 +#ifndef _WILDCARD_INET_ADDR_H_INCLUDED_
 +#define _WILDCARD_INET_ADDR_H_INCLUDED_
@@ -617,9 +609,9 @@ 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
+diff -Nur postfix-1.1.2.orig/src/master/master_ent.c postfix-1.1.2/src/master/master_ent.c
+--- postfix-1.1.2.orig/src/master/master_ent.c Sun Dec 23 20:08:58 2001
++++ postfix-1.1.2/src/master/master_ent.c      Mon Jan 28 12:40:04 2002
 @@ -284,8 +284,13 @@
            inet_addr_host(MASTER_INET_ADDRLIST(serv), host);
            serv->listen_fd_count = MASTER_INET_ADDRLIST(serv)->used;
@@ -634,10 +626,10 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/master/
        } 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 @@
+diff -Nur postfix-1.1.2.orig/src/master/master_listen.c postfix-1.1.2/src/master/master_listen.c
+--- postfix-1.1.2.orig/src/master/master_listen.c      Tue May  1 00:47:57 2001
++++ postfix-1.1.2/src/master/master_listen.c   Mon Jan 28 12:40:04 2002
+@@ -64,13 +64,22 @@
  
  #include "master.h"
  
@@ -649,10 +641,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 +653,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 +673,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 -Nur postfix-1.1.2.orig/src/smtp/Makefile.in postfix-1.1.2/src/smtp/Makefile.in
+--- postfix-1.1.2.orig/src/smtp/Makefile.in    Mon Jan 28 12:38:34 2002
++++ postfix-1.1.2/src/smtp/Makefile.in Mon Jan 28 12:40:04 2002
+@@ -140,6 +140,7 @@
  smtp_connect.o: ../../include/mail_params.h
  smtp_connect.o: ../../include/own_inet_addr.h
  smtp_connect.o: ../../include/dns.h
@@ -704,10 +701,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 -Nur postfix-1.1.2.orig/src/smtp/smtp_addr.c postfix-1.1.2/src/smtp/smtp_addr.c
+--- postfix-1.1.2.orig/src/smtp/smtp_addr.c    Sun Jul  8 17:05:26 2001
++++ postfix-1.1.2/src/smtp/smtp_addr.c Mon Jan 28 12:40:04 2002
+@@ -134,18 +134,68 @@
  static void smtp_print_addr(char *what, DNS_RR *addr_list)
  {
      DNS_RR *addr;
@@ -784,7 +781,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 +806,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 +855,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 +865,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 +903,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
+@@ -400,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 -Nur postfix-1.1.2.orig/src/smtp/smtp_connect.c postfix-1.1.2/src/smtp/smtp_connect.c
+--- postfix-1.1.2.orig/src/smtp/smtp_connect.c Mon Jan 28 12:38:34 2002
++++ postfix-1.1.2/src/smtp/smtp_connect.c      Mon Jan 28 12:40:04 2002
 @@ -81,6 +81,7 @@
  /* System library. */
  
@@ -923,9 +958,9 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm
  #include <timed_connect.h>
 +#include <get_port.h>
  #include <stringops.h>
+ #include <host_port.h>
  
- /* Global library. */
-@@ -133,19 +135,45 @@
+@@ -134,19 +136,45 @@
                                               VSTRING *why)
  {
      char   *myname = "smtp_connect_addr";
@@ -975,7 +1010,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 @@
+@@ -155,17 +183,39 @@
      /*
       * Initialize.
       */
@@ -1021,7 +1056,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 @@
+@@ -174,6 +224,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 +1082,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtp/sm
      }
  
      /*
-@@ -180,8 +249,17 @@
+@@ -181,8 +250,17 @@
       * the mail appears to come from the "right" machine address.
       */
      else if ((addr_list = own_inet_addr_list())->used == 1) {
@@ -1066,7 +1101,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 @@
+@@ -190,30 +268,85 @@
            if (msg_verbose)
                msg_info("%s: bind %s", myname, inet_ntoa(sin.sin_addr));
        }
@@ -1159,7 +1194,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 @@
+@@ -223,8 +356,8 @@
       * Skip this host if it takes no action within some time limit.
       */
      if (read_wait(sock, var_smtp_helo_tmout) < 0) {
@@ -1170,18 +1205,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 @@
-      */
+@@ -369,7 +369,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 @@
+@@ -381,7 +381,7 @@
       */
      if (ch == '4' && var_smtp_skip_4xx_greeting) {
        vstring_sprintf(why, "connect to %s[%s]: server refused mail service",
@@ -1190,7 +1223,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 @@
+@@ -392,12 +392,12 @@
       */
      if (ch == '5' && var_smtp_skip_5xx_greeting) {
        vstring_sprintf(why, "connect to %s[%s]: server refused mail service",
@@ -1205,26 +1238,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 -Nur postfix-1.1.2.orig/src/smtp/smtp_unalias.c postfix-1.1.2/src/smtp/smtp_unalias.c
+--- postfix-1.1.2.orig/src/smtp/smtp_unalias.c Thu Sep 28 19:06:09 2000
++++ postfix-1.1.2/src/smtp/smtp_unalias.c      Mon Jan 28 12:40:04 2002
 @@ -86,7 +86,11 @@
      if ((result = htable_find(cache, name)) == 0) {
        fqdn = vstring_alloc(10);
@@ -1238,38 +1254,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 -Nur postfix-1.1.2.orig/src/smtpd/smtpd_check.c postfix-1.1.2/src/smtpd/smtpd_check.c
+--- postfix-1.1.2.orig/src/smtpd/smtpd_check.c Mon Jan 28 12:38:34 2002
++++ postfix-1.1.2/src/smtpd/smtpd_check.c      Mon Jan 28 12:40:04 2002
+@@ -1187,6 +1195,49 @@
+ static int has_my_addr(const char *host)
  {
 +#ifdef INET6
 +    char   *myname = "has_my_addr";
@@ -1317,32 +1307,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 @@
+@@ -1222,6 +1273,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 */
+@@ -1647,11 +1699,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,
+@@ -2402,16 +2463,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 -Nur postfix-1.1.2.orig/src/smtpd/smtpd_peer.c postfix-1.1.2/src/smtpd/smtpd_peer.c
+--- postfix-1.1.2.orig/src/smtpd/smtpd_peer.c  Thu Jul  5 22:09:47 2001
++++ postfix-1.1.2/src/smtpd/smtpd_peer.c       Mon Jan 28 12:40:04 2002
 @@ -63,6 +63,15 @@
  #include <netdb.h>
  #include <string.h>
@@ -1381,7 +1423,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 +1443,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 +1458,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 +1506,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 +1524,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s
            state->peer_code = 2;
  
            /*
-@@ -151,16 +195,31 @@
+@@ -150,16 +194,31 @@
        state->peer_code = code; \
      }
  
@@ -1502,7 +1557,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 @@
+@@ -167,12 +226,11 @@
                        REJECT_PEER_NAME(state, 5);
                        break;
                    }
@@ -1517,35 +1572,49 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/smtpd/s
        }
      }
  
+diff -Nur postfix-1.1.2.orig/src/smtpstone/smtp-sink.c postfix-1.1.2/src/smtpstone/smtp-sink.c
+--- postfix-1.1.2.orig/src/smtpstone/smtp-sink.c       Thu Nov  8 21:15:32 2001
++++ postfix-1.1.2/src/smtpstone/smtp-sink.c    Mon Jan 28 12:40:04 2002
+@@ -518,7 +518,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 -Nur postfix-1.1.2.orig/src/util/Makefile.in postfix-1.1.2/src/util/Makefile.in
+--- postfix-1.1.2.orig/src/util/Makefile.in    Mon Jan 28 12:38:34 2002
++++ postfix-1.1.2/src/util/Makefile.in Mon Jan 28 12:41:17 2002
+@@ -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 \
+@@ -36,7 +36,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 \
+@@ -60,7 +60,7 @@
+       dict_ht.h dict_ldap.h dict_mysql.h dict_ni.h dict_nis.h \
+       dict_nisplus.h dict_pcre.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 \
+@@ -726,6 +726,7 @@
  get_domainname.o: mymalloc.h
  get_domainname.o: get_hostname.h
  get_domainname.o: get_domainname.h
@@ -1553,17 +1622,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 @@
+@@ -842,6 +843,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 -Nur postfix-1.1.2.orig/src/util/get_port.c postfix-1.1.2/src/util/get_port.c
+--- postfix-1.1.2.orig/src/util/get_port.c     Thu Jan  1 01:00:00 1970
++++ postfix-1.1.2/src/util/get_port.c  Mon Jan 28 12:40:04 2002
 @@ -0,0 +1,65 @@
 +/*++
 +/* NAME
@@ -1630,9 +1699,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 -Nur postfix-1.1.2.orig/src/util/get_port.h postfix-1.1.2/src/util/get_port.h
+--- postfix-1.1.2.orig/src/util/get_port.h     Thu Jan  1 01:00:00 1970
++++ postfix-1.1.2/src/util/get_port.h  Mon Jan 28 12:40:04 2002
 @@ -0,0 +1,28 @@
 +#ifndef _GET_PORT_H_INCLUDED_
 +#define _GET_PORT_H_INCLUDED_
@@ -1662,9 +1731,9 @@ 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
+diff -Nur postfix-1.1.2.orig/src/util/inet_addr_host.c postfix-1.1.2/src/util/inet_addr_host.c
+--- postfix-1.1.2.orig/src/util/inet_addr_host.c       Fri Dec 11 19:55:35 1998
++++ postfix-1.1.2/src/util/inet_addr_host.c    Mon Jan 28 12:40:04 2002
 @@ -38,7 +38,10 @@
  #include <sys_defs.h>
  #include <netinet/in.h>
@@ -1724,7 +1793,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 +100,12 @@
                inet_addr_list_append(addr_list,
                                    (struct in_addr *) * hp->h_addr_list++);
      }
@@ -1737,7 +1806,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in
  #ifdef TEST
  
  #include <msg.h>
-@@ -78,6 +114,8 @@
+@@ -78,6 +116,8 @@
  {
      INET_ADDR_LIST addr_list;
      int     i;
@@ -1746,7 +1815,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 +129,12 @@
        if (inet_addr_host(&addr_list, *argv) == 0)
            msg_fatal("not found: %s", *argv);
  
@@ -1761,12 +1830,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 <netinet/in.h>
+diff -Nur postfix-1.1.2.orig/src/util/inet_addr_list.c postfix-1.1.2/src/util/inet_addr_list.c
+--- postfix-1.1.2.orig/src/util/inet_addr_list.c       Tue Jul 31 20:13:41 2001
++++ postfix-1.1.2/src/util/inet_addr_list.c    Mon Jan 28 12:40:04 2002
+@@ -51,6 +51,13 @@
  #include <arpa/inet.h>
+ #include <stdlib.h>
  
 +#include <netdb.h>
 +
@@ -1778,7 +1847,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in
  /* Utility library. */
  
  #include <msg.h>
-@@ -56,12 +63,39 @@
+@@ -63,12 +70,39 @@
  {
      list->used = 0;
      list->size = 2;
@@ -1818,31 +1887,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 -Nur postfix-1.1.2.orig/src/util/inet_addr_list.h postfix-1.1.2/src/util/inet_addr_list.h
+--- postfix-1.1.2.orig/src/util/inet_addr_list.h       Tue Jul 31 19:56:47 2001
++++ postfix-1.1.2/src/util/inet_addr_list.h    Mon Jan 28 12:40:04 2002
+@@ -16,19 +16,38 @@
    */
  #include <netinet/in.h>
  
 +#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 +1934,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 +1942,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 +1952,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 -Nur postfix-1.1.2.orig/src/util/inet_addr_local.c postfix-1.1.2/src/util/inet_addr_local.c
+--- postfix-1.1.2.orig/src/util/inet_addr_local.c      Sun Feb 25 19:20:19 2001
++++ postfix-1.1.2/src/util/inet_addr_local.c   Mon Jan 28 12:40:04 2002
 @@ -47,6 +47,13 @@
  #endif
  #include <errno.h>
@@ -1884,7 +1969,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 +1977,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
 +                      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 +2023,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
 +    }
 +
@@ -2093,9 +2184,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 -Nur postfix-1.1.2.orig/src/util/inet_connect.c postfix-1.1.2/src/util/inet_connect.c
+--- postfix-1.1.2.orig/src/util/inet_connect.c Mon Nov 20 19:06:31 2000
++++ postfix-1.1.2/src/util/inet_connect.c      Mon Jan 28 12:40:04 2002
 @@ -55,6 +55,9 @@
  #include <string.h>
  #include <unistd.h>
@@ -2184,10 +2275,19 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in
      }
 +#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 -Nur postfix-1.1.2.orig/src/util/inet_listen.c postfix-1.1.2/src/util/inet_listen.c
+--- postfix-1.1.2.orig/src/util/inet_listen.c  Mon Nov 20 19:06:32 2000
++++ postfix-1.1.2/src/util/inet_listen.c       Mon Jan 28 12:40:04 2002
+@@ -6,7 +6,7 @@
+ /* SYNOPSIS
+ /*    #include <listen.h>
+ /*
+-/*    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 <sys_defs.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
@@ -2199,9 +2299,18 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/in
  #include <arpa/inet.h>
  #include <netdb.h>
  #ifndef MAXHOSTNAMELEN
-@@ -79,33 +84,109 @@
+ #include <sys/param.h>
+ #endif
++#include <errno.h>
+ #include <string.h>
+ #include <unistd.h>
+@@ -77,35 +83,116 @@
  
- int     inet_listen(const char *addr, int backlog, int block_mode)
+ /* 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 addrinuse_fatal)
  {
 +#ifdef INET6
 +    struct addrinfo *res, *res0, hints;
@@ -2219,6 +2328,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 +2417,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 -Nur postfix-1.1.2.orig/src/util/listen.h postfix-1.1.2/src/util/listen.h
+--- postfix-1.1.2.orig/src/util/listen.h       Mon Mar 22 02:57:11 1999
++++ postfix-1.1.2/src/util/listen.h    Mon Jan 28 12:40:04 2002
+@@ -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 -Nur postfix-1.1.2.orig/src/util/match_list.c postfix-1.1.2/src/util/match_list.c
+--- postfix-1.1.2.orig/src/util/match_list.c   Tue Nov 20 21:07:15 2001
++++ postfix-1.1.2/src/util/match_list.c        Mon Jan 28 12:40:04 2002
+@@ -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,10 +2459,10 @@ 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 -Nur postfix-1.1.2.orig/src/util/match_ops.c postfix-1.1.2/src/util/match_ops.c
+--- postfix-1.1.2.orig/src/util/match_ops.c    Tue Nov 20 21:16:10 2001
++++ postfix-1.1.2/src/util/match_ops.c Mon Jan 28 12:40:04 2002
+@@ -81,6 +81,307 @@
  #include <match_ops.h>
  #include <stringops.h>
  
@@ -2600,7 +2726,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma
 +}
 +
 +/*
-+ * 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;
@@ -2616,7 +2742,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma
 +
 +      /* Check for NULL */
 +      if (!(net_tok && mask_tok && string))
-+              return 1;
++              return 0; /* doesn't match!!! */
 +
 +      /* If IPv6 mapped convert to native-IPv4 */
 +#ifdef INET6
@@ -2643,8 +2769,8 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma
 +
  /* 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 +478,7 @@
      return (0);
  }
  
@@ -2652,15 +2778,15 @@ 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,27 +500,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
@@ -2689,12 +2815,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.
@@ -2709,7 +2835,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma
        if (dict_lookup(pattern, addr) != 0)
            return (1);
        if (dict_errno != 0)
-@@ -210,6 +539,12 @@
+@@ -229,6 +559,12 @@
      /*
       * Try an exact match with the host address.
       */
@@ -2722,7 +2848,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma
      if (strcasecmp(addr, pattern) == 0) {
        return (1);
      }
-@@ -218,6 +553,20 @@
+@@ -237,6 +573,20 @@
       * In a net/mask pattern, the mask is specified as the number of bits of
       * the network part.
       */
@@ -2743,17 +2869,17 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/ma
      if (match_parse_mask(pattern, &net_bits, &mask_shift)) {
        addr_bits = inet_addr(addr);
        if (addr_bits == INADDR_NONE)
-@@ -225,5 +574,6 @@
+@@ -244,5 +594,6 @@
        mask_bits = htonl((0xffffffff) << (BITS_PER_ADDR - mask_shift));
        return ((addr_bits & mask_bits) == (net_bits & mask_bits));
      }
 +#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 -Nur postfix-1.1.2.orig/src/util/sys_defs.h postfix-1.1.2/src/util/sys_defs.h
+--- postfix-1.1.2.orig/src/util/sys_defs.h     Mon Jan 28 12:38:34 2002
++++ postfix-1.1.2/src/util/sys_defs.h  Mon Jan 28 12:40:04 2002
+@@ -73,6 +73,10 @@
  #define DEF_MAILBOX_LOCK "flock, dotlock"
  #endif
  
@@ -2764,9 +2890,9 @@ 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
+diff -Nur postfix-1.1.2.orig/src/util/valid_hostname.c postfix-1.1.2/src/util/valid_hostname.c
+--- postfix-1.1.2.orig/src/util/valid_hostname.c       Sun Jan 28 15:10:18 2001
++++ postfix-1.1.2/src/util/valid_hostname.c    Mon Jan 28 12:40:04 2002
 @@ -47,6 +47,13 @@
  #include <string.h>
  #include <ctype.h>
@@ -2816,11 +2942,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);
+@@ -147,6 +173,17 @@
        return (0);
      }
-+
 +#ifdef INET6
 +    memset(&hints, 0, sizeof(hints));
 +    hints.ai_family = AF_INET6;
@@ -2831,6 +2956,7 @@ diff -ruN --exclude *.wiget --exclude *.rej snapshot-20010525.noipv6/src/util/va
 +      return 1;
 +    }
 +#endif
++
      /*
       * Scary code to avoid sscanf() overflow nasties.
+      */
This page took 0.088797 seconds and 4 git commands to generate.