| 1 |
--- procmail-3.22/src/autoconf.ipv6 2006-10-24 14:46:44.000000000 +0200
|
| 2 |
+++ procmail-3.22/src/autoconf 2006-10-24 14:51:01.000000000 +0200
|
| 3 |
@@ -68,8 +68,6 @@
|
| 4 |
# #define NOfsync
|
| 5 |
#Ok #define endpwent()
|
| 6 |
#Ok #define endgrent()
|
| 7 |
-#Ok #define endhostent()
|
| 8 |
-#Ok #define endservent()
|
| 9 |
#Ok #define endprotoent()
|
| 10 |
# #define h_0addr_list h_addr
|
| 11 |
#Ok #define NOpw_passwd
|
| 12 |
@@ -896,7 +894,7 @@
|
| 13 |
{uid_t vuid_t;i+=vuid_t=1;}
|
| 14 |
{gid_t vgid_t;i+=vgid_t=1;}
|
| 15 |
#ifndef NO_COMSAT
|
| 16 |
- {struct hostent vhostent;i+=!(vhostent.h_addr_list=0);}
|
| 17 |
+ {struct addrinfo res; i+=!(res.ai_socktype=0);}
|
| 18 |
#endif
|
| 19 |
#ifndef NOuname
|
| 20 |
{struct utsname vutsname;i+=!(*vutsname.nodename='\0');}
|
| 21 |
@@ -917,8 +915,6 @@
|
| 22 |
test -z "$i3" && grepfor mode_t 'typedef int mode_t;' && i3=I
|
| 23 |
test -z "$i4" && grepfor uid_t 'typedef int uid_t;' && i4=I
|
| 24 |
test -z "$i5" && grepfor gid_t 'typedef int gid_t;' && i5=I
|
| 25 |
- test -z "$i6" && grepfor h_addr_list '#define h_0addr_list h_addr' && i6=I
|
| 26 |
- test -z "$i6" && grepfor hostent '#define h_0addr_list h_addr' && i6=I
|
| 27 |
test -z "$i6" && grepfor member '#define h_0addr_list h_addr' && i6=I
|
| 28 |
test -z "$i7" && grepfor utsname "#define NOuname \
|
| 29 |
/* <sys/utsname.h> is there, but empty */" && i7=I
|
| 30 |
@@ -1048,8 +1044,12 @@
|
| 31 |
{struct utsname b;uname(&b);}
|
| 32 |
#endif
|
| 33 |
#ifndef NO_COMSAT
|
| 34 |
- gethostbyname("0");getprotobyname(COMSATprotocol);endhostent();endservent();
|
| 35 |
- endprotoent();
|
| 36 |
+ {
|
| 37 |
+ struct addrinfo *res, hints;
|
| 38 |
+ memset(&hints, '\0', sizeof(hints));
|
| 39 |
+ if(getaddrinfo(COMSAThost,BIFF_serviceport,&hints,&res))
|
| 40 |
+ freeaddrinfo(res);
|
| 41 |
+ }
|
| 42 |
#endif
|
| 43 |
_exit(0);
|
| 44 |
return 0;}
|
| 45 |
@@ -1103,14 +1103,9 @@
|
| 46 |
/* <sys/utsname.h> defines it, the libraries don't */"
|
| 47 |
grepfor endpwent '#define endpwent()'
|
| 48 |
grepfor endgrent '#define endgrent()'
|
| 49 |
-if grepfor gethostbyname '#define NO_COMSAT'
|
| 50 |
+if grepfor getaddrinfo '#define NO_COMSAT'
|
| 51 |
then
|
| 52 |
:
|
| 53 |
-else
|
| 54 |
- grepfor getprotobyname '#define UDP_protocolno 17'
|
| 55 |
- grepfor endhostent '#define endhostent()'
|
| 56 |
- grepfor endservent '#define endservent()'
|
| 57 |
- grepfor endprotoent '#define endprotoent()'
|
| 58 |
fi
|
| 59 |
grepfor strstr '#define SLOWstrstr' ||
|
| 60 |
grepfor clock '#define SLOWstrstr'
|
| 61 |
@@ -1239,39 +1234,9 @@
|
| 62 |
printf("/* Insufficient memory to perform the benchmark! */\n");
|
| 63 |
#endif /* SLOWstrstr */
|
| 64 |
#ifndef NO_COMSAT
|
| 65 |
-#ifndef UDP_protocolno
|
| 66 |
- ;{ const struct protoent*p;
|
| 67 |
- if(p=getprotobyname(COMSATprotocol))
|
| 68 |
- { printf("#define UDP_protocolno %d\n",p->p_proto);
|
| 69 |
-#else
|
| 70 |
- ;{ if(1)
|
| 71 |
- {
|
| 72 |
-#endif
|
| 73 |
- ;{ const struct servent*serv;
|
| 74 |
- if(serv=getservbyname(COMSATservice,COMSATprotocol))
|
| 75 |
- printf("#define BIFF_serviceport \"%d\"\n",
|
| 76 |
- ntohs(serv->s_port));
|
| 77 |
- }
|
| 78 |
-#ifdef AF_INET
|
| 79 |
- ;{ const struct hostent*host;
|
| 80 |
- if(!strcmp("localhost",COMSAThost)&&
|
| 81 |
- (host=gethostbyname(COMSAThost))&&
|
| 82 |
- host->h_0addr_list&&host->h_addrtype==AF_INET&&
|
| 83 |
- host->h_length)
|
| 84 |
- { int j=host->h_length;
|
| 85 |
- const unsigned char*ad=(void*)host->h_0addr_list;
|
| 86 |
- printf("#define IP_localhost {");
|
| 87 |
- printf("%d",*ad++);
|
| 88 |
- while(--j)
|
| 89 |
- printf(",%d",*ad++);
|
| 90 |
- puts("}");
|
| 91 |
- }
|
| 92 |
- }
|
| 93 |
+#ifndef AF_INET
|
| 94 |
+ puts("#define NO_COMSAT");
|
| 95 |
#endif /* AF_INET */
|
| 96 |
- }
|
| 97 |
- else
|
| 98 |
- puts("#define NO_COMSAT");
|
| 99 |
- }
|
| 100 |
#endif /* NO_COMSAT */
|
| 101 |
;{ unsigned long s=(size_t)~0;int bits;
|
| 102 |
for(bits=1;s>>=1;bits++);
|
| 103 |
--- procmail-3.22/src/network.h.ipv6 1999-04-17 08:18:45.000000000 +0200
|
| 104 |
+++ procmail-3.22/src/network.h 2006-10-24 14:46:44.000000000 +0200
|
| 105 |
@@ -1,19 +1,13 @@
|
| 106 |
/*$Id: network.h,v 1.7 1997/04/02 03:15:41 srb Exp $*/
|
| 107 |
|
| 108 |
-#include <sys/socket.h> /* socket() sendto() AF_INET
|
| 109 |
+#include <sys/socket.h> /* socket() sendto() */
|
| 110 |
/* SOCK_DGRAM */
|
| 111 |
-#include <netdb.h> /* gethostbyname() getservbyname()
|
| 112 |
- /* getprotobyname() */
|
| 113 |
-#include <netinet/in.h> /* htons() struct sockaddr_in */
|
| 114 |
+#include <netdb.h> /* getaddrinfo() */
|
| 115 |
|
| 116 |
#ifndef BIFF_serviceport
|
| 117 |
#define BIFF_serviceport COMSATservice
|
| 118 |
#endif
|
| 119 |
|
| 120 |
-#ifndef h_0addr_list
|
| 121 |
-#define h_0addr_list h_addr_list[0] /* POSIX struct member */
|
| 122 |
-#endif
|
| 123 |
-
|
| 124 |
#ifndef NO_const /* since network.h is outside the autoconf const check */
|
| 125 |
#ifdef const /* loop, we need this backcheck for some systems */
|
| 126 |
#undef const
|
| 127 |
--- procmail-3.22/src/comsat.c.ipv6 2006-10-24 14:46:44.000000000 +0200
|
| 128 |
+++ procmail-3.22/src/comsat.c 2006-10-24 14:46:44.000000000 +0200
|
| 129 |
@@ -27,7 +27,8 @@
|
| 130 |
#include "comsat.h"
|
| 131 |
|
| 132 |
static int csvalid; /* is it turned on with a good address? */
|
| 133 |
-static struct sockaddr_in csaddr;
|
| 134 |
+static struct addrinfo cai;
|
| 135 |
+static struct sockaddr *csaddr;
|
| 136 |
static char*cslastf,*cslgname;
|
| 137 |
|
| 138 |
void setlfcs(folder)const char*folder; /* set lastfolder for comsat */
|
| 139 |
@@ -62,56 +63,32 @@
|
| 140 |
}
|
| 141 |
|
| 142 |
int setcomsat(chp)const char*chp;
|
| 143 |
-{ char*chad;int newvalid; struct sockaddr_in newaddr;
|
| 144 |
+{ char*chad;int newvalid; struct addrinfo *res, hints;
|
| 145 |
chad=strchr(chp,SERV_ADDRsep); /* @ separator? */
|
| 146 |
if(!chad&&!renvint(-1L,chp))
|
| 147 |
return csvalid=0; /* turned off comsat */
|
| 148 |
newvalid=1;
|
| 149 |
if(chad)
|
| 150 |
*chad++='\0'; /* split the specifier */
|
| 151 |
+ if(!chad||!*chp) /* no service */
|
| 152 |
+ chp=BIFF_serviceport; /* new balls please! */
|
| 153 |
if(!chad||!*chad) /* no host */
|
| 154 |
-#ifndef IP_localhost /* Is "localhost" preresolved? */
|
| 155 |
chad=COMSAThost; /* nope, use default */
|
| 156 |
-#else /* IP_localhost */
|
| 157 |
- { static const unsigned char ip_localhost[]=IP_localhost;
|
| 158 |
- newaddr.sin_family=AF_INET;
|
| 159 |
- tmemmove(&newaddr.sin_addr,ip_localhost,sizeof ip_localhost);
|
| 160 |
- }
|
| 161 |
- else
|
| 162 |
-#endif /* IP_localhost */
|
| 163 |
- { const struct hostent*host; /* what host? paranoid checks */
|
| 164 |
- if(!(host=gethostbyname(chad))||!host->h_0addr_list)
|
| 165 |
- { bbzero(&newaddr.sin_addr,sizeof newaddr.sin_addr);
|
| 166 |
- newvalid=0; /* host can't be found, too bad */
|
| 167 |
- }
|
| 168 |
- else
|
| 169 |
- { newaddr.sin_family=host->h_addrtype; /* address number found */
|
| 170 |
- tmemmove(&newaddr.sin_addr,host->h_0addr_list,host->h_length);
|
| 171 |
- }
|
| 172 |
- endhostent();
|
| 173 |
- }
|
| 174 |
- if(newvalid) /* so far, so good */
|
| 175 |
- { int s;
|
| 176 |
- if(!chad||!*chp) /* no service */
|
| 177 |
- chp=BIFF_serviceport; /* new balls please! */
|
| 178 |
- s=strtol(chp,&chad,10);
|
| 179 |
- if(chp!=chad) /* the service is not numeric */
|
| 180 |
- newaddr.sin_port=htons((short)s); /* network order */
|
| 181 |
- else
|
| 182 |
- { const struct servent*serv;
|
| 183 |
- serv=getservbyname(chp,COMSATprotocol); /* so get its no. */
|
| 184 |
- if(serv)
|
| 185 |
- newaddr.sin_port=serv->s_port;
|
| 186 |
- else
|
| 187 |
- { newaddr.sin_port=htons((short)0); /* no such service */
|
| 188 |
- newvalid=0;
|
| 189 |
- }
|
| 190 |
- endservent();
|
| 191 |
- }
|
| 192 |
- }
|
| 193 |
+ bzero(&hints,sizeof(hints));
|
| 194 |
+ hints.ai_socktype=SOCK_DGRAM;
|
| 195 |
+ hints.ai_flags=AI_ADDRCONFIG;
|
| 196 |
+ if(getaddrinfo(chad,chp,&hints,&res))
|
| 197 |
+ newvalid=0;
|
| 198 |
+
|
| 199 |
onguard(); /* update the address atomically */
|
| 200 |
if(csvalid=newvalid)
|
| 201 |
- tmemmove(&csaddr,&newaddr,sizeof(newaddr));
|
| 202 |
+ { if(csaddr)
|
| 203 |
+ free(csaddr);
|
| 204 |
+ csaddr=malloc(res->ai_addrlen);
|
| 205 |
+ tmemmove(csaddr,res->ai_addr,res->ai_addrlen);
|
| 206 |
+ tmemmove(&cai,res,sizeof(cai));
|
| 207 |
+ freeaddrinfo(res);
|
| 208 |
+ }
|
| 209 |
offguard();
|
| 210 |
return newvalid;
|
| 211 |
}
|
| 212 |
@@ -132,8 +109,8 @@
|
| 213 |
}
|
| 214 |
strlcat(buf,COMSATxtrsep,linebuf); /* custom seperator */
|
| 215 |
strlcat(buf,p,linebuf); /* where was it delivered? */
|
| 216 |
- if((s=socket(AF_INET,SOCK_DGRAM,UDP_protocolno))>=0)
|
| 217 |
- { sendto(s,buf,strlen(buf),0,(struct sockaddr*)&csaddr,sizeof(csaddr));
|
| 218 |
+ if((s=socket(cai.ai_family,cai.ai_socktype,cai.ai_protocol))>=0)
|
| 219 |
+ { sendto(s,buf,strlen(buf),0,csaddr,cai.ai_addrlen);
|
| 220 |
rclose(s);
|
| 221 |
yell("Notified comsat:",buf);
|
| 222 |
}
|