]> git.pld-linux.org Git - packages/cyrus-imapd.git/blame - cyrus-imapd-ipv6.patch
- rel 5
[packages/cyrus-imapd.git] / cyrus-imapd-ipv6.patch
CommitLineData
6c357dee
AF
1diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/acconfig.h cyrus-imapd-2.0.12/acconfig.h
2--- cyrus-imapd-2.0.12.orig/acconfig.h Thu Apr 26 17:10:59 2001
3+++ cyrus-imapd-2.0.12/acconfig.h Thu Apr 26 17:11:37 2001
4@@ -111,6 +111,12 @@
5 /* do we have rlim_t? */
6 #undef HAVE_RLIM_T
7
8+/* is IPv6 enabled? */
9+#undef INET6
10+
11+/* Define if you have ss_family in struct sockaddr_storage. */
12+#undef HAVE_SS_FAMILY
13+
14 @BOTTOM@
15
16 #ifndef __GNUC__
17diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/aclocal.m4 cyrus-imapd-2.0.12/aclocal.m4
18--- cyrus-imapd-2.0.12.orig/aclocal.m4 Mon Feb 19 20:57:39 2001
19+++ cyrus-imapd-2.0.12/aclocal.m4 Thu Apr 26 17:11:37 2001
20@@ -264,3 +264,71 @@
21 AC_SUBST(LIB_UCDSNMP)
22 ])
23
24+dnl See whether we can use IPv6 related functions
25+AC_DEFUN(IPv6_CHECK_FUNC, [
26+changequote(, )dnl
27+ac_tr_lib=HAVE_`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \
28+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
29+changequote([, ])dnl
30+AC_CHECK_FUNC($1, [dnl
31+ AC_DEFINE_UNQUOTED($ac_tr_lib)
32+ ac_cv_lib_socket_$1=no
33+ ac_cv_lib_inet6_$1=no
34+], [dnl
35+ AC_CHECK_LIB(socket, $1, [dnl
36+ AC_DEFINE_UNQUOTED($ac_tr_lib)
37+ LIBS="$LIBS -lsocket"
38+ ac_cv_lib_inet6_$1=no
39+ ], [dnl
40+ AC_MSG_CHECKING([whether your system has IPv6 directory])
41+ AC_CACHE_VAL(ipv6_cv_dir, [dnl
42+ for ipv6_cv_dir in /usr/local/v6 /usr/inet6 no; do
43+ if test $ipv6_cv_dir = no -o -d $ipv6_cv_dir; then
44+ break
45+ fi
46+ done])dnl
47+ AC_MSG_RESULT($ipv6_cv_dir)
48+ if test $ipv6_cv_dir = no; then
49+ ac_cv_lib_inet6_$1=no
50+ else
51+ if test x$ipv6_libinet6 = x; then
52+ ipv6_libinet6=no
53+ SAVELDFLAGS="$LDFLAGS"
54+ LDFLAGS="$LDFLAGS -L$ipv6_cv_dir/lib"
55+ fi
56+ AC_CHECK_LIB(inet6, $1, [dnl
57+ AC_DEFINE_UNQUOTED($ac_tr_lib)
58+ if test $ipv6_libinet6 = no; then
59+ ipv6_libinet6=yes
60+ LIBS="$LIBS -linet6"
61+ fi],)dnl
62+ if test $ipv6_libinet6 = no; then
63+ LDFLAGS="$SAVELDFLAGS"
64+ fi
65+ fi])dnl
66+])dnl
67+if test $ac_cv_func_$1 = yes -o $ac_cv_lib_socket_$1 = yes \
68+ -o $ac_cv_lib_inet6_$1 = yes
69+then
70+ ipv6_cv_$1=yes
71+ ifelse([$2], , :, [$2])
72+else
73+ ipv6_cv_$1=no
74+ ifelse([$3], , :, [$3])
75+fi])
76+
77+dnl See whether we have ss_family in sockaddr_storage
78+AC_DEFUN(IPv6_CHECK_SS_FAMILY, [
79+AC_MSG_CHECKING([whether you have ss_family in struct sockaddr_storage])
80+AC_CACHE_VAL(ipv6_cv_ss_family, [dnl
81+AC_TRY_COMPILE([#include <sys/types.h>
82+#include <sys/socket.h>],
83+ [struct sockaddr_storage ss; int i = ss.ss_family;],
84+ [ipv6_cv_ss_family=yes], [ipv6_cv_ss_family=no])])dnl
85+if test $ipv6_cv_ss_family = yes; then
86+ ifelse([$1], , AC_DEFINE(HAVE_SS_FAMILY), [$1])
87+else
88+ ifelse([$2], , :, [$2])
89+fi
90+AC_MSG_RESULT($ipv6_cv_ss_family)])
91+
92diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/config.h.in cyrus-imapd-2.0.12/config.h.in
93--- cyrus-imapd-2.0.12.orig/config.h.in Mon Feb 19 20:57:39 2001
94+++ cyrus-imapd-2.0.12/config.h.in Thu Apr 26 17:11:37 2001
95@@ -128,6 +128,12 @@
96 /* do we have rlim_t? */
97 #undef HAVE_RLIM_T
98
99+/* is IPv6 enabled? */
100+#undef INET6
101+
102+/* Define if you have ss_family in struct sockaddr_storage. */
103+#undef HAVE_SS_FAMILY
104+
105 /* Define if you have the ftruncate function. */
106 #undef HAVE_FTRUNCATE
107
108diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/configure.in cyrus-imapd-2.0.12/configure.in
109--- cyrus-imapd-2.0.12.orig/configure.in Thu Apr 26 17:10:59 2001
110+++ cyrus-imapd-2.0.12/configure.in Thu Apr 26 17:11:37 2001
111@@ -725,6 +725,15 @@
112
113 LIBS="$LIBS ${LIB_SOCKET}"
114
115+AC_ARG_ENABLE(ipv6, [ --disable-ipv6 Don't compile in IPv6 support],
116+ ipv6="$enableval", ipv6="yes")
117+if test "$ipv6" != "yes"; then
118+ AC_MSG_RESULT(IPv6 support is disabled)
119+else
120+ IPv6_CHECK_FUNC(getaddrinfo, AC_DEFINE(INET6))
121+ IPv6_CHECK_SS_FAMILY()
122+fi
123+
124 # Figure out what directories we're linking against.
125 # Lots of fun for the whole family.
126 # This probably chokes on anything with spaces in it.
127diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/imap/fud.c cyrus-imapd-2.0.12/imap/fud.c
128--- cyrus-imapd-2.0.12.orig/imap/fud.c Thu Apr 26 17:10:59 2001
129+++ cyrus-imapd-2.0.12/imap/fud.c Thu Apr 26 17:11:37 2001
130@@ -83,12 +83,21 @@
131 extern char *optarg;
132
133 /* forward decls */
134+#ifdef INET6
135+int handle_request(const char *who, const char *name,
136+ struct sockaddr_storage sfrom);
137+
138+void send_reply(struct sockaddr_storage sfrom, int status,
139+ const char *user, const char *mbox,
140+ int numrecent, time_t lastread, time_t lastarrived);
141+#else
142 int handle_request(const char *who, const char *name,
143 struct sockaddr_in sfrom);
144
145 void send_reply(struct sockaddr_in sfrom, int status,
146 const char *user, const char *mbox,
147 int numrecent, time_t lastread, time_t lastarrived);
148+#endif
149
150 int soc;
151
152@@ -104,7 +113,11 @@
153
154 int begin_handling(void)
155 {
156+#ifdef INET6
157+ struct sockaddr_storage sfrom;
158+#else
159 struct sockaddr_in sfrom;
160+#endif
161 socklen_t sfromsiz = sizeof(sfrom);
162 int r;
163 char buf[MAXLOGNAME + MAX_MAILBOX_NAME + 1];
164@@ -190,8 +203,13 @@
165 shut_down(0);
166 }
167
168+#ifdef INET6
169+int handle_request(const char *who, const char *name,
170+ struct sockaddr_storage sfrom)
171+#else
172 int handle_request(const char *who, const char *name,
173 struct sockaddr_in sfrom)
174+#endif
175 {
176 int r;
177 struct mailbox mailbox;
178@@ -277,9 +295,15 @@
179 }
180
181 void
182+#ifdef INET6
183+send_reply(struct sockaddr_storage sfrom, int status,
184+ const char *user, const char *mbox,
185+ int numrecent, time_t lastread, time_t lastarrived)
186+#else
187 send_reply(struct sockaddr_in sfrom, int status,
188 const char *user, const char *mbox,
189 int numrecent, time_t lastread, time_t lastarrived)
190+#endif
191 {
192 char buf[MAX_MAILBOX_PATH + 16 + 9];
193 int siz;
194diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/imap/imapd.c cyrus-imapd-2.0.12/imap/imapd.c
195--- cyrus-imapd-2.0.12.orig/imap/imapd.c Thu Apr 26 17:10:59 2001
196+++ cyrus-imapd-2.0.12/imap/imapd.c Thu Apr 26 17:18:32 2001
197@@ -93,6 +93,15 @@
198 #include "tls.h"
199 #endif /* HAVE_SSL */
200
201+#ifdef INET6
202+#ifndef NI_WITHSCOPEID
203+#define NI_WITHSCOPEID 0
204+#endif
205+#ifndef HAVE_SS_FAMILY
206+#define ss_family __ss_family
207+#endif
208+#endif
209+
210 extern int optind;
211 extern char *optarg;
212 extern int errno;
213@@ -102,7 +111,11 @@
214
215 /* per-user/session state */
216 struct protstream *imapd_out, *imapd_in;
217+#ifdef INET6
218+static char imapd_clienthost[NI_MAXHOST*2+1] = "[local]";
219+#else
220 static char imapd_clienthost[250] = "[local]";
221+#endif
222 static time_t imapd_logtime;
223 static int imapd_logfd = -1;
224 char *imapd_userid;
225@@ -457,7 +470,12 @@
226 int timeout;
227 sasl_security_properties_t *secprops = NULL;
228 sasl_external_properties_t extprops;
229+#ifdef INET6
230+ struct sockaddr_storage imapd_localaddr, imapd_remoteaddr;
231+ char hbuf[NI_MAXHOST];
232+#else
233 struct sockaddr_in imapd_localaddr, imapd_remoteaddr;
234+#endif
235 int imapd_haveaddr = 0;
236
237 signals_poll();
238@@ -493,6 +511,28 @@
239
240 /* Find out name of client host */
241 salen = sizeof(imapd_remoteaddr);
242+#ifdef INET6
243+ if (getpeername(0, (struct sockaddr *)&imapd_remoteaddr, &salen) == 0 &&
244+ (imapd_remoteaddr.ss_family == AF_INET ||
245+ imapd_remoteaddr.ss_family == AF_INET6)) {
246+ if (getnameinfo((struct sockaddr *)&imapd_remoteaddr, salen,
247+ hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0) {
248+ strncpy(imapd_clienthost, hbuf, sizeof(hbuf));
249+ }
250+ else {
251+ imapd_clienthost[0] = '\0';
252+ }
253+ getnameinfo((struct sockaddr *)&imapd_remoteaddr, salen, hbuf,
254+ sizeof(hbuf), NULL, 0, NI_NUMERICHOST | NI_WITHSCOPEID);
255+ strcat(imapd_clienthost, "[");
256+ strcat(imapd_clienthost, hbuf);
257+ strcat(imapd_clienthost, "]");
258+ salen = sizeof(imapd_localaddr);
259+ if (getsockname(0, (struct sockaddr *)&imapd_localaddr, &salen) == 0) {
260+ imapd_haveaddr = 1;
261+ }
262+ }
263+#else
264 if (getpeername(0, (struct sockaddr *)&imapd_remoteaddr, &salen) == 0 &&
265 imapd_remoteaddr.sin_family == AF_INET) {
266 hp = gethostbyaddr((char *)&imapd_remoteaddr.sin_addr,
267@@ -511,6 +551,7 @@
268 imapd_haveaddr = 1;
269 }
270 }
271+#endif
272
273 /* create the SASL connection */
274 if (sasl_server_new("imap", config_servername,
275diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/imap/lmtpengine.c cyrus-imapd-2.0.12/imap/lmtpengine.c
276--- cyrus-imapd-2.0.12.orig/imap/lmtpengine.c Thu Apr 26 17:10:59 2001
277+++ cyrus-imapd-2.0.12/imap/lmtpengine.c Thu Apr 26 17:11:38 2001
278@@ -85,6 +85,15 @@
279
280 #define RCPT_GROW 30
281
282+#ifdef INET6
283+#ifndef NI_WITHSCOPEID
284+#define NI_WITHSCOPEID 0
285+#endif
286+#ifndef HAVE_SS_FAMILY
287+#define ss_family __ss_family
288+#endif
289+#endif
290+
291 /* data per message */
292 struct Header {
293 char *name;
294@@ -965,7 +974,11 @@
295 int r;
296 char *err;
297
298+#ifdef INET6
299+ struct sockaddr_storage localaddr, remoteaddr;
300+#else
301 struct sockaddr_in localaddr, remoteaddr;
302+#endif
303 socklen_t salen;
304
305 sasl_conn_t *conn = NULL;
306@@ -977,6 +990,9 @@
307 1: did AUTH */
308 char *authuser = NULL;
309 struct auth_state *authstate = NULL;
310+#ifdef INET6
311+ char hbuf[NI_MAXHOST];
312+#endif
313
314 msg_new(&msg);
315 if (sasl_server_new("lmtp", NULL, NULL, NULL, 0, &conn) != SASL_OK) {
316@@ -994,7 +1010,13 @@
317 /* determine who we're talking to */
318 salen = sizeof(remoteaddr);
319 r = getpeername(fd, (struct sockaddr *)&remoteaddr, &salen);
320- if (!r && remoteaddr.sin_family == AF_INET) {
321+ if (!r &&
322+#ifdef INET6
323+ (remoteaddr.ss_family == AF_INET || remoteaddr.ss_family == AF_INET6)
324+#else
325+ remoteaddr.sin_family == AF_INET
326+#endif
327+ ) {
328 /* connected to an internet socket */
329
330 salen = sizeof(localaddr);
331@@ -1006,9 +1028,16 @@
332 fatal("can't get local addr", EC_SOFTWARE);
333 }
334
335+#ifdef INET6
336+ getnameinfo((struct sockaddr *)&remoteaddr, salen, hbuf, sizeof(hbuf),
337+ NULL, 0, NI_NUMERICHOST | NI_WITHSCOPEID);
338+ syslog(LOG_DEBUG, "connection from [%s]%s", hbuf,
339+ func->preauth ? " preauth'd as postman" : "");
340+#else
341 syslog(LOG_DEBUG, "connection from [%s]%s",
342 inet_ntoa(remoteaddr.sin_addr),
343 func->preauth ? " preauth'd as postman" : "");
344+#endif
345 } else {
346 /* we're not connected to a internet socket! */
347 func->preauth = 1;
348@@ -1139,20 +1168,37 @@
349
350 if (in) { free(in); in = NULL; }
351 if (out) { free(out); out = NULL; }
352+#ifdef INET6
353+ if (remoteaddr.ss_family == AF_INET ||
354+ remoteaddr.ss_family == AF_INET6)
355+ getnameinfo((struct sockaddr *)&remoteaddr, salen,
356+ hbuf, sizeof(hbuf), NULL, 0,
357+ NI_NUMERICHOST | NI_WITHSCOPEID);
358+ else
359+ strcpy(hbuf, "[unix socket]");
360+#endif
361 if ((r != SASL_OK) && (r != SASL_CONTINUE)) {
362 if (errstr) {
363 syslog(LOG_ERR, "badlogin: %s %s %s [%s]",
364+#ifdef INET6
365+ hbuf,
366+#else
367 remoteaddr.sin_family == AF_INET ?
368 inet_ntoa(remoteaddr.sin_addr) :
369 "[unix socket]",
370+#endif
371 mech,
372 sasl_errstring(r, NULL, NULL),
373 errstr);
374 } else {
375 syslog(LOG_ERR, "badlogin: %s %s %s",
376+#ifdef INET6
377+ hbuf,
378+#else
379 remoteaddr.sin_family == AF_INET ?
380 inet_ntoa(remoteaddr.sin_addr) :
381 "[unix socket]",
382+#endif
383 mech,
384 sasl_errstring(r, NULL, NULL));
385 }
386@@ -1173,9 +1219,13 @@
387 VARIABLE_AUTH, hash_simple(mech),
388 VARIABLE_LISTEND);
389 syslog(LOG_NOTICE, "login: %s %s %s %s",
390+#ifdef INET6
391+ hbuf,
392+#else
393 remoteaddr.sin_family == AF_INET ?
394 inet_ntoa(remoteaddr.sin_addr) :
395 "[unix socket]",
396+#endif
397 user, mech, "User logged in");
398
399 authenticated += 2;
400@@ -1595,18 +1645,59 @@
401 free(host);
402 host = xstrdup(config_servername);
403 } else {
404+#ifdef INET6
405+ struct addrinfo hints, *res0 = NULL, *res;
406+ int err;
407+#else
408 struct hostent *hp;
409 struct sockaddr_in addr;
410 struct servent *service;
411+#endif
412 char *p;
413
414+#ifdef INET6
415+ if (*host == '[' && (p = strchr(host + 1, ']')) != NULL &&
416+ (*++p == '\0' || *p == ':')) {
417+ host++;
418+ *(p - 1) = '\0';
419+ if (*p != ':')
420+ p = NULL;
421+ } else
422+ p = strchr(host, ':');
423+#else
424 p = strchr(host, ':');
425+#endif
426 if (p) {
427 *p++ = '\0';
428 } else {
429 p = "lmtp";
430 }
431
432+#ifdef INET6
433+ memset(&hints, 0, sizeof(hints));
434+ hints.ai_family = PF_UNSPEC;
435+ hints.ai_socktype = SOCK_STREAM;
436+ err = getaddrinfo(host, p, &hints, &res0);
437+ if (err) {
438+ syslog(LOG_ERR, "getaddrinfo(%s, %s) failed: %s",
439+ host, p, gai_strerror(err));
440+ goto donesock;
441+ }
442+ for (res = res0; res; res = res->ai_next) {
443+ sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
444+ if (sock < 0)
445+ continue;
446+ if (connect(sock, res->ai_addr, res->ai_addrlen) >= 0)
447+ break;
448+ close(sock);
449+ sock = -1;
450+ }
451+ freeaddrinfo(res0);
452+ if (sock < 0) {
453+ syslog(LOG_ERR, "connect(%s:%s) failed: %m", host, p);
454+ goto donesock;
455+ }
456+#else
457 if ((hp = gethostbyname(host)) == NULL) {
458 syslog(LOG_ERR, "gethostbyname(%s) failed", host);
459 goto donesock;
460@@ -1636,6 +1727,7 @@
461 syslog(LOG_ERR, "connect(%s:%s) failed: %m", host, p);
462 goto donesock;
463 }
464+#endif
465 }
466
467 donesock:
468diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/imap/pop3d.c cyrus-imapd-2.0.12/imap/pop3d.c
469--- cyrus-imapd-2.0.12.orig/imap/pop3d.c Thu Apr 26 17:10:59 2001
470+++ cyrus-imapd-2.0.12/imap/pop3d.c Thu Apr 26 17:11:38 2001
471@@ -93,6 +93,15 @@
472 #endif /* HAVE_KRB */
473 static int kflag = 0;
474
475+#ifdef INET6
476+#ifndef NI_WITHSCOPEID
477+#define NI_WITHSCOPEID 0
478+#endif
479+#ifndef HAVE_SS_FAMILY
480+#define ss_family __ss_family
481+#endif
482+#endif
483+
484 extern int optind;
485 extern char *optarg;
486 extern int opterr;
487@@ -109,9 +118,17 @@
488
489 char *popd_userid = 0;
490 struct mailbox *popd_mailbox = 0;
491+#ifdef INET6
492+struct sockaddr_storage popd_localaddr, popd_remoteaddr;
493+#else
494 struct sockaddr_in popd_localaddr, popd_remoteaddr;
495+#endif
496 int popd_haveaddr = 0;
497+#ifdef INET6
498+char popd_clienthost[NI_MAXHOST*2+1] = "[local]";
499+#else
500 char popd_clienthost[250] = "[local]";
501+#endif
502 struct protstream *popd_out, *popd_in;
503 unsigned popd_exists = 0;
504 unsigned popd_highest;
505@@ -209,6 +226,9 @@
506 struct hostent *hp;
507 int timeout;
508 sasl_security_properties_t *secprops=NULL;
509+#ifdef INET6
510+ char hbuf[NI_MAXHOST];
511+#endif
512
513 signals_poll();
514
515@@ -239,6 +259,28 @@
516
517 /* Find out name of client host */
518 salen = sizeof(popd_remoteaddr);
519+#ifdef INET6
520+ if (getpeername(0, (struct sockaddr *)&popd_remoteaddr, &salen) == 0 &&
521+ (popd_remoteaddr.ss_family == AF_INET ||
522+ popd_remoteaddr.ss_family == AF_INET6)) {
523+ if (getnameinfo((struct sockaddr *)&popd_remoteaddr, salen,
524+ hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0) {
525+ strncpy(popd_clienthost, hbuf, sizeof(hbuf));
526+ }
527+ else {
528+ popd_clienthost[0] = '\0';
529+ }
530+ getnameinfo((struct sockaddr *)&popd_remoteaddr, salen, hbuf,
531+ sizeof(hbuf), NULL, 0, NI_NUMERICHOST | NI_WITHSCOPEID);
532+ strcat(popd_clienthost, "[");
533+ strcat(popd_clienthost, hbuf);
534+ strcat(popd_clienthost, "]");
535+ salen = sizeof(popd_localaddr);
536+ if (getsockname(0, (struct sockaddr *)&popd_localaddr, &salen) == 0) {
537+ popd_haveaddr = 1;
538+ }
539+ }
540+#else
541 if (getpeername(0, (struct sockaddr *)&popd_remoteaddr, &salen) == 0 &&
542 popd_remoteaddr.sin_family == AF_INET) {
543 hp = gethostbyaddr((char *)&popd_remoteaddr.sin_addr,
544@@ -257,6 +299,7 @@
545 popd_haveaddr = 1;
546 }
547 }
548+#endif
549
550 /* other params should be filled in */
551 if (sasl_server_new("pop", config_servername, NULL,
552diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/imap/pop3proxyd.c cyrus-imapd-2.0.12/imap/pop3proxyd.c
553--- cyrus-imapd-2.0.12.orig/imap/pop3proxyd.c Thu Apr 26 17:10:59 2001
554+++ cyrus-imapd-2.0.12/imap/pop3proxyd.c Thu Apr 26 17:11:38 2001
555@@ -91,6 +91,15 @@
556 #endif /* HAVE_KRB */
557 static int kflag = 0;
558
559+#ifdef INET6
560+#ifndef NI_WITHSCOPEID
561+#define NI_WITHSCOPEID 0
562+#endif
563+#ifndef HAVE_SS_FAMILY
564+#define ss_family __ss_family
565+#endif
566+#endif
567+
568 extern int optind;
569 extern char *optarg;
570 extern int opterr;
571@@ -106,9 +115,17 @@
572 sasl_conn_t *popd_saslconn; /* the sasl connection context */
573
574 char *popd_userid = 0;
575+#ifdef INET6
576+struct sockaddr_storage popd_localaddr, popd_remoteaddr;
577+#else
578 struct sockaddr_in popd_localaddr, popd_remoteaddr;
579+#endif
580 int popd_haveaddr = 0;
581+#ifdef INET6
582+char popd_clienthost[NI_MAXHOST*2+1] = "[local]";
583+#else
584 char popd_clienthost[250] = "[local]";
585+#endif
586 struct protstream *popd_out, *popd_in;
587 int popd_starttls_done = 0;
588 int popd_auth_done = 0;
589@@ -193,6 +210,9 @@
590 struct hostent *hp;
591 int timeout;
592 sasl_security_properties_t *secprops=NULL;
593+#ifdef INET6
594+ char hbuf[NI_MAXHOST];
595+#endif
596
597 signals_poll();
598
599@@ -221,6 +241,28 @@
600
601 /* Find out name of client host */
602 salen = sizeof(popd_remoteaddr);
603+#ifdef INET6
604+ if (getpeername(0, (struct sockaddr *)&popd_remoteaddr, &salen) == 0 &&
605+ (popd_remoteaddr.ss_family == AF_INET ||
606+ popd_remoteaddr.ss_family == AF_INET6)) {
607+ if (getnameinfo((struct sockaddr *)&popd_remoteaddr, salen,
608+ hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0) {
609+ strncpy(popd_clienthost, hbuf, sizeof(hbuf));
610+ }
611+ else {
612+ popd_clienthost[0] = '\0';
613+ }
614+ getnameinfo((struct sockaddr *)&popd_remoteaddr, salen, hbuf,
615+ sizeof(hbuf), NULL, 0, NI_NUMERICHOST | NI_WITHSCOPEID);
616+ strcat(popd_clienthost, "[");
617+ strcat(popd_clienthost, hbuf);
618+ strcat(popd_clienthost, "]");
619+ salen = sizeof(popd_localaddr);
620+ if (getsockname(0, (struct sockaddr *)&popd_localaddr, &salen) == 0) {
621+ popd_haveaddr = 1;
622+ }
623+ }
624+#else
625 if (getpeername(0, (struct sockaddr *)&popd_remoteaddr, &salen) == 0 &&
626 popd_remoteaddr.sin_family == AF_INET) {
627 hp = gethostbyaddr((char *)&popd_remoteaddr.sin_addr,
628@@ -239,6 +281,7 @@
629 popd_haveaddr = 1;
630 }
631 }
632+#endif
633
634 /* other params should be filled in */
635 if (sasl_server_new("pop", config_servername, NULL,
636@@ -1023,11 +1066,19 @@
637 {
638 int r;
639 sasl_security_properties_t *secprops = NULL;
640+#ifdef INET6
641+ struct sockaddr *saddr_l =
642+ (struct sockaddr *) malloc(sizeof(struct sockaddr_storage));
643+ struct sockaddr *saddr_r =
644+ (struct sockaddr *) malloc(sizeof(struct sockaddr_storage));
645+ socklen_t addrsize = sizeof(struct sockaddr_storage);
646+#else
647 struct sockaddr_in *saddr_l =
648 (struct sockaddr_in *) malloc(sizeof(struct sockaddr_in));
649 struct sockaddr_in *saddr_r =
650 (struct sockaddr_in *) malloc(sizeof(struct sockaddr_in));
651 socklen_t addrsize = sizeof(struct sockaddr_in);
652+#endif
653 sasl_callback_t *cb;
654 char buf[2048];
655 char optstr[128];
656@@ -1064,7 +1115,11 @@
657 r = sasl_setprop(backend_saslconn, SASL_IP_REMOTE, saddr_r);
658 if (r != SASL_OK) return r;
659
660+#ifdef INET6
661+ addrsize=sizeof(struct sockaddr_storage);
662+#else
663 addrsize=sizeof(struct sockaddr_in);
664+#endif
665 if (getsockname(backend_sock, (struct sockaddr *)saddr_l,&addrsize)!=0)
666 return SASL_FAIL;
667 r = sasl_setprop(backend_saslconn, SASL_IP_LOCAL, saddr_l);
668@@ -1136,8 +1191,12 @@
669
670 static void openproxy(void)
671 {
672+#ifdef INET6
673+ struct addrinfo hints, *res0 = NULL, *res;
674+#else
675 struct hostent *hp;
676 struct sockaddr_in sin;
677+#endif
678 char inboxname[MAX_MAILBOX_PATH];
679 int r;
680 char *server;
681@@ -1148,6 +1207,28 @@
682 r = mboxlist_lookup(inboxname, &server, NULL, NULL);
683 if (!r) fatal("couldn't find backend server", EC_CONFIG);
684
685+#ifdef INET6
686+ memset(&hints, 0, sizeof(hints));
687+ hints.ai_family = PF_UNSPEC;
688+ hints.ai_socktype = SOCK_STREAM;
689+ if (getaddrinfo(server, "110", &hints, &res0))
690+ fatal("getaddrinfo failed", EC_CONFIG);
691+ for (res = res0; res; res = res->ai_next) {
692+ backend_sock = socket(res->ai_family, res->ai_socktype,
693+ res->ai_protocol);
694+ if (backend_sock < 0)
695+ continue;
696+ if (connect(backend_sock, res->ai_addr, res->ai_addrlen) >= 0)
697+ break;
698+ close(backend_sock);
699+ backend_sock = -1;
700+ }
701+ freeaddrinfo(res0);
702+ if (backend_sock < 0) {
703+ syslog(LOG_ERR, "connect() failed: %m");
704+ fatal("connect failed", 1);
705+ }
706+#else
707 hp = gethostbyname(server);
708 if (!hp) fatal("gethostbyname failed", EC_CONFIG);
709 sin.sin_family = AF_INET;
710@@ -1162,6 +1243,7 @@
711 syslog(LOG_ERR, "connect() failed: %m");
712 fatal("connect failed", 1);
713 }
714+#endif
715
716 backend_in = prot_new(backend_sock, 0);
717 backend_out = prot_new(backend_sock, 1);
718diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/imap/proxyd.c cyrus-imapd-2.0.12/imap/proxyd.c
719--- cyrus-imapd-2.0.12.orig/imap/proxyd.c Thu Apr 26 17:10:59 2001
720+++ cyrus-imapd-2.0.12/imap/proxyd.c Thu Apr 26 17:11:38 2001
721@@ -93,6 +93,15 @@
722 #include "pushstats.h"
723 #include "telemetry.h"
724
725+#ifdef INET6
726+#ifndef NI_WITHSCOPEID
727+#define NI_WITHSCOPEID 0
728+#endif
729+#ifndef HAVE_SS_FAMILY
730+#define ss_family __ss_family
731+#endif
732+#endif
733+
734 /* PROXY STUFF */
735 /* we want a list of our outgoing connections here and which one we're
736 currently piping */
737@@ -103,7 +112,11 @@
738
739 struct backend {
740 char *hostname;
741+#ifdef INET6
742+ struct sockaddr_storage addr;
743+#else
744 struct sockaddr_in addr;
745+#endif
746 int sock;
747 struct prot_waitevent *timeout;
748
749@@ -155,9 +168,17 @@
750 char *proxyd_userid;
751 struct auth_state *proxyd_authstate = 0;
752 int proxyd_userisadmin;
753+#ifdef INET6
754+struct sockaddr_storage proxyd_localaddr, proxyd_remoteaddr;
755+#else
756 struct sockaddr_in proxyd_localaddr, proxyd_remoteaddr;
757+#endif
758 int proxyd_haveaddr = 0;
759+#ifdef INET6
760+char proxyd_clienthost[NI_MAXHOST*2+1] = "[local]";
761+#else
762 char proxyd_clienthost[250] = "[local]";
763+#endif
764 struct protstream *proxyd_out, *proxyd_in;
765 time_t proxyd_logtime;
766 static char shutdownfilename[1024];
767@@ -552,11 +573,19 @@
768 {
769 int r;
770 sasl_security_properties_t *secprops = NULL;
771+#ifdef INET6
772+ struct sockaddr *saddr_l =
773+ (struct sockaddr *) malloc(sizeof(struct sockaddr_storage));
774+ struct sockaddr *saddr_r =
775+ (struct sockaddr *) malloc(sizeof(struct sockaddr_storage));
776+ socklen_t addrsize = sizeof(struct sockaddr_storage);
777+#else
778 struct sockaddr_in *saddr_l =
779 (struct sockaddr_in *) malloc(sizeof(struct sockaddr_in));
780 struct sockaddr_in *saddr_r =
781 (struct sockaddr_in *) malloc(sizeof(struct sockaddr_in));
782 socklen_t addrsize = sizeof(struct sockaddr_in);
783+#endif
784 sasl_callback_t *cb;
785 char mytag[128];
786 char buf[2048];
787@@ -594,7 +623,11 @@
788 r = sasl_setprop(s->saslconn, SASL_IP_REMOTE, saddr_r);
789
790 if (r == SASL_OK) {
791+#ifdef INET6
792+ addrsize=sizeof(struct sockaddr_storage);
793+#else
794 addrsize=sizeof(struct sockaddr_in);
795+#endif
796 if (getsockname(s->sock, (struct sockaddr *)saddr_l,&addrsize)!=0)
797 return SASL_FAIL;
798 r = sasl_setprop(s->saslconn, SASL_IP_LOCAL, saddr_l);
799@@ -754,11 +787,14 @@
800 }
801
802 if (!ret) {
803+#ifndef INET6
804 struct hostent *hp;
805+#endif
806
807 ret = xmalloc(sizeof(struct backend));
808 memset(ret, 0, sizeof(struct backend));
809 ret->hostname = xstrdup(server);
810+#ifndef INET6
811 if ((hp = gethostbyname(server)) == NULL) {
812 syslog(LOG_ERR, "gethostbyname(%s) failed: %m", server);
813 free(ret);
814@@ -767,15 +803,45 @@
815 ret->addr.sin_family = AF_INET;
816 memcpy(&ret->addr.sin_addr, hp->h_addr, hp->h_length);
817 ret->addr.sin_port = htons(143);
818+#endif
819
820 ret->timeout = NULL;
821 }
822
823 if (!ret->timeout) {
824 /* need to (re)establish connection to server or create one */
825- int sock;
826+ int sock = -1;
827 int r;
828-
829+#ifdef INET6
830+ int err;
831+ struct addrinfo hints, *res0 = NULL, *res;
832+
833+ memset(&hints, 0, sizeof(hints));
834+ hints.ai_family = PF_UNSPEC;
835+ hints.ai_socktype = SOCK_STREAM;
836+ err = getaddrinfo(server, "143", &hints, &res0);
837+ if (err) {
838+ syslog(LOG_ERR, "getaddrinfo(%s) failed: %s",
839+ server, gai_strerror(err));
840+ free(ret);
841+ return NULL;
842+ }
843+ for (res = res0; res; res = res->ai_next) {
844+ sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
845+ if (sock < 0)
846+ continue;
847+ if (connect(sock, res->ai_addr, res->ai_addrlen) >= 0)
848+ break;
849+ close(sock);
850+ sock = -1;
851+ }
852+ freeaddrinfo(res0);
853+ if (sock < 0) {
854+ syslog(LOG_ERR, "connect(%s) failed: %m", server);
855+ free(ret);
856+ return NULL;
857+ }
858+#else
859 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
860 syslog(LOG_ERR, "socket() failed: %m");
861 free(ret);
862@@ -787,6 +853,7 @@
863 free(ret);
864 return NULL;
865 }
866+#endif
867
868 ret->in = prot_new(sock, 0);
869 ret->out = prot_new(sock, 1);
870@@ -1043,6 +1110,9 @@
871 int timeout;
872 sasl_security_properties_t *secprops = NULL;
873 sasl_external_properties_t extprops;
874+#ifdef INET6
875+ char hbuf[NI_MAXHOST];
876+#endif
877
878 signals_poll();
879
880@@ -1079,6 +1149,29 @@
881
882 /* Find out name of client host */
883 salen = sizeof(proxyd_remoteaddr);
884+#ifdef INET6
885+ if (getpeername(0, (struct sockaddr *)&proxyd_remoteaddr, &salen) == 0 &&
886+ (proxyd_remoteaddr.ss_family == AF_INET ||
887+ proxyd_remoteaddr.ss_family == AF_INET6)) {
888+ if (getnameinfo((struct sockaddr *)&proxyd_remoteaddr, salen,
889+ hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0) {
890+ strncpy(proxyd_clienthost, hbuf, sizeof(hbuf));
891+ }
892+ else {
893+ proxyd_clienthost[0] = '\0';
894+ }
895+ getnameinfo((struct sockaddr *)&proxyd_remoteaddr, salen, hbuf,
896+ sizeof(hbuf), NULL, 0, NI_NUMERICHOST | NI_WITHSCOPEID);
897+ strcat(proxyd_clienthost, "[");
898+ strcat(proxyd_clienthost, hbuf);
899+ strcat(proxyd_clienthost, "]");
900+ salen = sizeof(proxyd_localaddr);
901+ if (getsockname(0, (struct sockaddr *)&proxyd_localaddr,
902+ &salen) == 0) {
903+ proxyd_haveaddr = 1;
904+ }
905+ }
906+#else
907 if (getpeername(0, (struct sockaddr *)&proxyd_remoteaddr, &salen) == 0 &&
908 proxyd_remoteaddr.sin_family == AF_INET) {
909 hp = gethostbyaddr((char *)&proxyd_remoteaddr.sin_addr,
910@@ -1098,6 +1191,7 @@
911 proxyd_haveaddr = 1;
912 }
913 }
914+#endif
915
916 /* create the SASL connection */
917 /* Make a SASL connection and setup some properties for it */
918diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/imtest/imtest.c cyrus-imapd-2.0.12/imtest/imtest.c
919--- cyrus-imapd-2.0.12.orig/imtest/imtest.c Thu Apr 26 17:10:59 2001
920+++ cyrus-imapd-2.0.12/imtest/imtest.c Thu Apr 26 17:11:38 2001
921@@ -571,13 +571,23 @@
922 * Initialize SASL and set necessary options
923 */
924
925+#ifdef INET6
926+static int init_sasl(char *serverFQDN, char *port, int minssf, int maxssf)
927+#else
928 static int init_sasl(char *serverFQDN, int port, int minssf, int maxssf)
929+#endif
930 {
931 int saslresult;
932 sasl_security_properties_t *secprops=NULL;
933+#ifdef INET6
934+ socklen_t addrsize=sizeof(struct sockaddr_storage);
935+ struct sockaddr *saddr_l=malloc(sizeof(struct sockaddr_storage));
936+ struct sockaddr *saddr_r=malloc(sizeof(struct sockaddr_storage));
937+#else
938 socklen_t addrsize=sizeof(struct sockaddr_in);
939 struct sockaddr_in *saddr_l=malloc(sizeof(struct sockaddr_in));
940 struct sockaddr_in *saddr_r=malloc(sizeof(struct sockaddr_in));
941+#endif
942
943 /* attempt to start sasl */
944 saslresult=sasl_client_init(callbacks);
945@@ -607,7 +617,11 @@
946 if (sasl_setprop(conn, SASL_IP_REMOTE, saddr_r)!=SASL_OK)
947 return IMTEST_FAIL;
948
949+#ifdef INET6
950+ addrsize=sizeof(struct sockaddr_storage);
951+#else
952 addrsize=sizeof(struct sockaddr_in);
953+#endif
954 if (getsockname(sock,(struct sockaddr *)saddr_l,&addrsize)!=0)
955 return IMTEST_FAIL;
956
957@@ -852,6 +866,37 @@
958 }
959
960 /* initialize the network */
961+#ifdef INET6
962+int init_net(char *serverFQDN, char *port)
963+{
964+ struct addrinfo hints, *res0 = NULL, *res;
965+ int err;
966+
967+ memset(&hints, 0, sizeof(hints));
968+ hints.ai_family = PF_UNSPEC;
969+ hints.ai_socktype = SOCK_STREAM;
970+ hints.ai_flags = AI_CANONNAME;
971+ if ((err = getaddrinfo(serverFQDN, port, &hints, &res0)) != 0) {
972+ fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
973+ return IMTEST_FAIL;
974+ }
975+ if (res0->ai_canonname)
976+ strncpy(serverFQDN, res0->ai_canonname, 1023);
977+ for (res = res0; res; res = res->ai_next) {
978+ sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
979+ if (sock < 0)
980+ continue;
981+ if (connect(sock, res->ai_addr, res->ai_addrlen) >= 0)
982+ break;
983+ close(sock);
984+ sock = -1;
985+ }
986+ freeaddrinfo(res0);
987+ if (sock < 0) {
988+ perror("connect");
989+ return IMTEST_FAIL;
990+ }
991+#else
992 int init_net(char *serverFQDN, int port)
993 {
994 struct sockaddr_in addr;
995@@ -876,6 +921,7 @@
996 perror("connect");
997 return IMTEST_FAIL;
998 }
999+#endif
1000
1001 return IMTEST_OK;
1002 }
1003@@ -1179,7 +1225,9 @@
1004 char *tls_keyfile="";
1005 char *port = "imap";
1006 struct servent *serv;
1007+#ifndef INET6
1008 int servport;
1009+#endif
1010 int run_stress_test=0;
1011 int dotls=0;
1012 int server_supports_tls;
1013@@ -1243,6 +1291,15 @@
1014 /* last arg is server name */
1015 strncpy(servername, argv[optind], 1023);
1016
1017+#ifdef INET6
1018+ if (init_net(servername, port) != IMTEST_OK) {
1019+ imtest_fatal("Network initialization");
1020+ }
1021+
1022+ if (init_sasl(servername, port, minssf, maxssf) != IMTEST_OK) {
1023+ imtest_fatal("SASL initialization");
1024+ }
1025+#else
1026 /* map port -> num */
1027 serv = getservbyname(port, "tcp");
1028 if (serv == NULL) {
1029@@ -1258,6 +1315,7 @@
1030 if (init_sasl(servername, servport, minssf, maxssf) != IMTEST_OK) {
1031 imtest_fatal("SASL initialization");
1032 }
1033+#endif
1034
1035 /* set up the prot layer */
1036 pin = prot_new(sock, 0);
1037diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/lib/imclient.c cyrus-imapd-2.0.12/lib/imclient.c
1038--- cyrus-imapd-2.0.12.orig/lib/imclient.c Sat Feb 17 21:19:40 2001
1039+++ cyrus-imapd-2.0.12/lib/imclient.c Thu Apr 26 17:11:38 2001
1040@@ -213,13 +213,39 @@
1041 const char *port,
1042 sasl_callback_t *cbs)
1043 {
1044- int s;
1045+ int s = -1;
1046+#ifdef INET6
1047+ struct addrinfo hints, *res0 = NULL, *res;
1048+ int err;
1049+#else
1050 struct hostent *hp;
1051 struct servent *sp;
1052 struct sockaddr_in addr;
1053+#endif
1054 static struct imclient zeroimclient;
1055 int saslresult;
1056
1057+#ifdef INET6
1058+ if (!port)
1059+ port = "143";
1060+ memset(&hints, 0, sizeof(hints));
1061+ hints.ai_family = PF_UNSPEC;
1062+ hints.ai_socktype = SOCK_STREAM;
1063+ hints.ai_flags = AI_CANONNAME;
1064+ if (getaddrinfo(host, port, &hints, &res0))
1065+ return -1;
1066+ for (res = res0; res; res = res->ai_next) {
1067+ s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
1068+ if (s < 0)
1069+ continue;
1070+ if (connect(s, res->ai_addr, res->ai_addrlen) >= 0)
1071+ break;
1072+ close(s);
1073+ s = -1;
1074+ }
1075+ if (s < 0)
1076+ return errno;
1077+#else
1078 hp = gethostbyname(host);
1079 if (!hp) return -1;
1080
1081@@ -242,13 +268,20 @@
1082 if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
1083 return errno;
1084 }
1085+#endif
1086 /* nonblock(s, 1); */
1087 *imclient = (struct imclient *)xmalloc(sizeof(struct imclient));
1088 **imclient = zeroimclient;
1089 (*imclient)->fd = s;
1090 (*imclient)->saslconn = NULL;
1091 (*imclient)->saslcompleted = 0;
1092+#ifdef INET6
1093+ (*imclient)->servername = xstrdup(res0->ai_canonname ?
1094+ res0->ai_canonname : host);
1095+ freeaddrinfo(res0);
1096+#else
1097 (*imclient)->servername = xstrdup(hp->h_name);
1098+#endif
1099 (*imclient)->outptr = (*imclient)->outstart = (*imclient)->outbuf;
1100 (*imclient)->outleft = (*imclient)->maxplain = sizeof((*imclient)->outbuf);
1101 imclient_addcallback(*imclient,
1102diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/master/master.c cyrus-imapd-2.0.12/master/master.c
1103--- cyrus-imapd-2.0.12.orig/master/master.c Thu Apr 26 17:10:59 2001
1104+++ cyrus-imapd-2.0.12/master/master.c Thu Apr 26 17:11:38 2001
1105@@ -241,6 +241,22 @@
1106 return port;
1107 }
1108
1109+char *parse_host(char *listen)
1110+{
1111+ char *cp;
1112+
1113+ /* do we have a hostname, or IP number? */
1114+ /* XXX are brackets necessary, like for IPv6 later? */
1115+ if (*listen == '[') {
1116+ listen++; /* skip first bracket */
1117+ if ((cp = strrchr(listen,']')) != NULL) {
1118+ *cp = '\0';
1119+ }
1120+ }
1121+ return listen;
1122+}
1123+
1124+#ifndef INET6
1125 /* set sin_port accordingly. return of 0 indicates failure. */
1126 int resolve_port(char *port, struct service *s, struct sockaddr_in *sin)
1127 {
1128@@ -265,21 +281,14 @@
1129 int resolve_host(struct service *s, struct sockaddr_in *sin)
1130 {
1131 struct hostent *hp;
1132- char *cp;
1133+ char *listen_addr;
1134
1135- /* do we have a hostname, or IP number? */
1136- /* XXX are brackets necessary, like for IPv6 later? */
1137- if (*s->listen == '[') {
1138- s->listen++; /* skip first bracket */
1139- if ((cp = strrchr(s->listen,']')) != NULL) {
1140- *cp = '\0';
1141- }
1142- }
1143- sin->sin_addr.s_addr = inet_addr(s->listen);
1144+ listen_addr = parse_host(s->listen);
1145+ sin->sin_addr.s_addr = inet_addr(listen_addr);
1146 if ((sin->sin_addr.s_addr == INADDR_NONE) || (sin->sin_addr.s_addr == 0)) {
1147 /* looks like it isn't an IP address, so look up the host */
1148- if ((hp = gethostbyname(s->listen)) == 0) {
1149- syslog(LOG_INFO, "host not found: %s", s->listen);
1150+ if ((hp = gethostbyname(listen_addr)) == 0) {
1151+ syslog(LOG_INFO, "host not found: %s", listen_addr);
1152 s->exec = NULL;
1153 return 0;
1154 }
1155@@ -297,17 +306,146 @@
1156 }
1157 return 1;
1158 }
1159+#endif
1160
1161 void service_create(struct service *s)
1162 {
1163+#ifdef INET6
1164+ struct service service0, service;
1165+ struct addrinfo hints, *res0, *res;
1166+ struct sockaddr_storage sin;
1167+ int error, nsocket = 0;
1168+ char *listen_addr;
1169+#else
1170 struct sockaddr_in sin;
1171- struct sockaddr_un sunsock;
1172 struct sockaddr *sa;
1173+ int salen;
1174+#endif
1175+ struct sockaddr_un sunsock;
1176 mode_t oldumask;
1177- int on = 1, salen;
1178+ int on = 1;
1179 int r;
1180 char *port;
1181
1182+#ifdef INET6
1183+ if (s->socket > 0)
1184+ return; /* service is already activated */
1185+
1186+ if (s->listen[0] == '/') { /* unix socket */
1187+ res0 = (struct addrinfo *)malloc(sizeof(struct addrinfo));
1188+ if (!res0)
1189+ fatal("out of memory", EX_UNAVAILABLE);
1190+ memset(res0, 0, sizeof(struct addrinfo));
1191+ res0->ai_flags = AI_PASSIVE;
1192+ res0->ai_family = PF_UNIX;
1193+ res0->ai_socktype = SOCK_STREAM;
1194+ res0->ai_addr = (struct sockaddr *)&sunsock;
1195+ res0->ai_addrlen = sizeof(sunsock.sun_family) + strlen(s->listen) + 1;
1196+#ifdef SIN6_LEN
1197+ res0->ai_addrlen += sizeof(sunsock.sun_len);
1198+ sunsock.sun_len = res0->ai_addrlen;
1199+#endif
1200+ sunsock.sun_family = AF_UNIX;
1201+ strcpy(sunsock.sun_path, s->listen);
1202+ unlink(s->listen);
1203+ } else { /* inet socket */
1204+ memset(&hints, 0, sizeof(hints));
1205+ hints.ai_flags = AI_PASSIVE;
1206+ hints.ai_family = PF_UNSPEC;
1207+ if (!strcmp(s->proto, "tcp"))
1208+ hints.ai_socktype = SOCK_STREAM;
1209+ else if (!strcmp(s->proto, "udp"))
1210+ hints.ai_socktype = SOCK_DGRAM;
1211+ else {
1212+ syslog(LOG_INFO, "invalid proto '%s', disabling %s",
1213+ s->proto, s->name);
1214+ s->exec = NULL;
1215+ return;
1216+ }
1217+ if ((port = parse_listen(s->listen)) == NULL) {
1218+ /* s->listen IS the port */
1219+ port = s->listen;
1220+ listen_addr = NULL;
1221+ } else {
1222+ /* s->listen is now just the address */
1223+ listen_addr = parse_host(s->listen);
1224+ if (*listen_addr == '\0')
1225+ listen_addr = NULL;
1226+ }
1227+ error = getaddrinfo(listen_addr, port, &hints, &res0);
1228+ if (error) {
1229+ syslog(LOG_INFO, "%s, disabling %s", gai_strerror(error), s->name);
1230+ s->exec = NULL;
1231+ return;
1232+ }
1233+ }
1234+
1235+ memcpy(&service0, s, sizeof(struct service));
1236+
1237+ for (res = res0; res; res = res->ai_next) {
1238+ if (s->socket > 0) {
1239+ memcpy(&service, &service0, sizeof(struct service));
1240+ s = &service;
1241+ }
1242+
1243+ s->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
1244+ if (s->socket < 0)
1245+ continue;
1246+
1247+ /* allow reuse of address */
1248+ setsockopt(s->socket, SOL_SOCKET, SO_REUSEADDR,
1249+ (void *) &on, sizeof(on));
1250+
1251+#if defined(IPV6_BINDV6ONLY) && !(defined(__FreeBSD__) && __FreeBSD__ < 3)
1252+ if (res->ai_family == AF_INET6)
1253+ setsockopt(s->socket, IPPROTO_IPV6, IPV6_BINDV6ONLY,
1254+ (void *) &on, sizeof(on));
1255+#endif
1256+
1257+ oldumask = umask((mode_t) 0); /* for linux */
1258+ r = bind(s->socket, res->ai_addr, res->ai_addrlen);
1259+ umask(oldumask);
1260+ if (r < 0) {
1261+ close(s->socket);
1262+ s->socket = -1;
1263+ continue;
1264+ }
1265+
1266+ if (s->listen[0] == '/') { /* unix socket */
1267+ /* for DUX, where this isn't the default.
1268+ (harmlessly fails on some systems) */
1269+ chmod(s->listen, (mode_t) 0777);
1270+ }
1271+
1272+ if (listen(s->socket, listen_queue_backlog) < 0) {
1273+ syslog(LOG_ERR, "unable to listen to %s socket: %m", s->name);
1274+ close(s->socket);
1275+ s->socket = -1;
1276+ continue;
1277+ }
1278+
1279+ s->ready_workers = 0;
1280+
1281+ get_statsock(s->stat);
1282+
1283+ if (s == &service) {
1284+ if (nservices == allocservices) {
1285+ Services = realloc(Services,
1286+ (allocservices+=5) * sizeof(struct service));
1287+ if (!Services) fatal("out of memory", EX_UNAVAILABLE);
1288+ }
1289+ memcpy(&Services[nservices++], s, sizeof(struct service));
1290+ }
1291+ nsocket++;
1292+ }
1293+ if (res0)
1294+ freeaddrinfo(res0);
1295+ if (nsocket <= 0) {
1296+ syslog(LOG_ERR, "unable to create %s listener socket: %m", s->name);
1297+ s->exec = NULL;
1298+ return;
1299+ }
1300+#else
1301 memset(&sin, 0, sizeof(sin));
1302
1303 if (s->listen[0] == '/') { /* unix socket */
1304@@ -379,6 +517,7 @@
1305 s->ready_workers = 0;
1306
1307 get_statsock(s->stat);
1308+#endif
1309 }
1310
1311 void run_startup(char **cmd)
1312diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/master/service.c cyrus-imapd-2.0.12/master/service.c
1313--- cyrus-imapd-2.0.12.orig/master/service.c Thu Apr 26 17:10:59 2001
1314+++ cyrus-imapd-2.0.12/master/service.c Thu Apr 26 17:11:38 2001
1315@@ -95,12 +95,16 @@
1316 static int libwrap_ask(struct request_info *r, int fd)
1317 {
1318 int a;
1319+#ifdef INET6
1320+ struct sockaddr_storage sin;
1321+#else
1322 struct sockaddr_in sin;
1323+#endif
1324 socklen_t len = sizeof(sin);
1325
1326 /* is this a connection from the local host? */
1327 if (getpeername(fd, (struct sockaddr *) &sin, &len) == 0) {
1328- if (sin.sin_family == AF_UNIX) {
1329+ if (((struct sockaddr *)&sin)->sa_family == AF_UNIX) {
1330 return 1;
1331 }
1332 }
1333diff -ruN --exclude *.orig --exclude configure cyrus-imapd-2.0.12.orig/timsieved/timsieved.c cyrus-imapd-2.0.12/timsieved/timsieved.c
1334--- cyrus-imapd-2.0.12.orig/timsieved/timsieved.c Mon Feb 19 19:05:22 2001
1335+++ cyrus-imapd-2.0.12/timsieved/timsieved.c Thu Apr 26 17:11:38 2001
1336@@ -81,19 +81,36 @@
1337
1338 #include "auth.h"
1339
1340+#ifdef INET6
1341+#ifndef NI_WITHSCOPEID
1342+#define NI_WITHSCOPEID 0
1343+#endif
1344+#ifndef HAVE_SS_FAMILY
1345+#define ss_family __ss_family
1346+#endif
1347+#endif
1348
1349 sasl_conn_t *sieved_saslconn; /* the sasl connection context */
1350
1351 struct auth_state *sieved_authstate = 0;
1352
1353+#ifdef INET6
1354+struct sockaddr_storage sieved_localaddr;
1355+struct sockaddr_storage sieved_remoteaddr;
1356+#else
1357 struct sockaddr_in sieved_localaddr;
1358 struct sockaddr_in sieved_remoteaddr;
1359+#endif
1360
1361 struct protstream *sieved_out;
1362 struct protstream *sieved_in;
1363
1364 int sieved_haveaddr = 0;
1365+#ifdef INET6
1366+char sieved_clienthost[NI_MAXHOST*2+1] = "[local]";
1367+#else
1368 char sieved_clienthost[250] = "[local]";
1369+#endif
1370
1371 int sieved_userisadmin;
1372
1373@@ -231,6 +248,9 @@
1374 int timeout;
1375 int secflags = 0;
1376 sasl_security_properties_t *secprops = NULL;
1377+#ifdef INET6
1378+ char hbuf[NI_MAXHOST];
1379+#endif
1380
1381 /* set up the prot streams */
1382 sieved_in = prot_new(0, 0);
1383@@ -248,6 +268,28 @@
1384
1385 /* Find out name of client host */
1386 salen = sizeof(sieved_remoteaddr);
1387+#ifdef INET6
1388+ if (getpeername(0, (struct sockaddr *)&sieved_remoteaddr, &salen) == 0 &&
1389+ (sieved_remoteaddr.ss_family == AF_INET ||
1390+ sieved_remoteaddr.ss_family == AF_INET6)) {
1391+ if (getnameinfo((struct sockaddr *)&sieved_remoteaddr, salen,
1392+ hbuf, sizeof(hbuf), NULL, 0, NI_NAMEREQD) == 0) {
1393+ strncpy(sieved_clienthost, hbuf, sizeof(hbuf));
1394+ }
1395+ else {
1396+ sieved_clienthost[0] = '\0';
1397+ }
1398+ getnameinfo((struct sockaddr *)&sieved_remoteaddr, salen, hbuf,
1399+ sizeof(hbuf), NULL, 0, NI_NUMERICHOST | NI_WITHSCOPEID);
1400+ strcat(sieved_clienthost, "[");
1401+ strcat(sieved_clienthost, hbuf);
1402+ strcat(sieved_clienthost, "]");
1403+ salen = sizeof(sieved_localaddr);
1404+ if (getsockname(0, (struct sockaddr *)&sieved_localaddr, &salen) == 0) {
1405+ sieved_haveaddr = 1;
1406+ }
1407+ }
1408+#else
1409 if (getpeername(0, (struct sockaddr *)&sieved_remoteaddr, &salen) == 0 &&
1410 sieved_remoteaddr.sin_family == AF_INET) {
1411 if ((hp = gethostbyaddr((char *)&sieved_remoteaddr.sin_addr,
1412@@ -266,6 +308,7 @@
1413 sieved_haveaddr = 1;
1414 }
1415 }
1416+#endif
1417
1418 /* set the SASL allocation functions */
1419 sasl_set_alloc((sasl_malloc_t *) &xmalloc,
This page took 0.391756 seconds and 4 git commands to generate.