1 diff -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
5 /* do we have rlim_t? */
8 +/* is IPv6 enabled? */
11 +/* Define if you have ss_family in struct sockaddr_storage. */
12 +#undef HAVE_SS_FAMILY
17 diff -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
24 +dnl See whether we can use IPv6 related functions
25 +AC_DEFUN(IPv6_CHECK_FUNC, [
27 +ac_tr_lib=HAVE_`echo $1 | sed -e 's/[^a-zA-Z0-9_]/_/g' \
28 + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
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
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
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
47 + AC_MSG_RESULT($ipv6_cv_dir)
48 + if test $ipv6_cv_dir = no; then
49 + ac_cv_lib_inet6_$1=no
51 + if test x$ipv6_libinet6 = x; then
53 + SAVELDFLAGS="$LDFLAGS"
54 + LDFLAGS="$LDFLAGS -L$ipv6_cv_dir/lib"
56 + AC_CHECK_LIB(inet6, $1, [dnl
57 + AC_DEFINE_UNQUOTED($ac_tr_lib)
58 + if test $ipv6_libinet6 = no; then
60 + LIBS="$LIBS -linet6"
62 + if test $ipv6_libinet6 = no; then
63 + LDFLAGS="$SAVELDFLAGS"
67 +if test $ac_cv_func_$1 = yes -o $ac_cv_lib_socket_$1 = yes \
68 + -o $ac_cv_lib_inet6_$1 = yes
71 + ifelse([$2], , :, [$2])
74 + ifelse([$3], , :, [$3])
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])
88 + ifelse([$2], , :, [$2])
90 +AC_MSG_RESULT($ipv6_cv_ss_family)])
92 diff -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
96 /* do we have rlim_t? */
99 +/* is IPv6 enabled? */
102 +/* Define if you have ss_family in struct sockaddr_storage. */
103 +#undef HAVE_SS_FAMILY
105 /* Define if you have the ftruncate function. */
106 #undef HAVE_FTRUNCATE
108 diff -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
113 LIBS="$LIBS ${LIB_SOCKET}"
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)
120 + IPv6_CHECK_FUNC(getaddrinfo, AC_DEFINE(INET6))
121 + IPv6_CHECK_SS_FAMILY()
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.
127 diff -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
135 +int handle_request(const char *who, const char *name,
136 + struct sockaddr_storage sfrom);
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);
142 int handle_request(const char *who, const char *name,
143 struct sockaddr_in sfrom);
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);
154 int begin_handling(void)
157 + struct sockaddr_storage sfrom;
159 struct sockaddr_in sfrom;
161 socklen_t sfromsiz = sizeof(sfrom);
163 char buf[MAXLOGNAME + MAX_MAILBOX_NAME + 1];
169 +int handle_request(const char *who, const char *name,
170 + struct sockaddr_storage sfrom)
172 int handle_request(const char *who, const char *name,
173 struct sockaddr_in sfrom)
177 struct mailbox mailbox;
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)
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)
192 char buf[MAX_MAILBOX_PATH + 16 + 9];
194 diff -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
199 #endif /* HAVE_SSL */
202 +#ifndef NI_WITHSCOPEID
203 +#define NI_WITHSCOPEID 0
205 +#ifndef HAVE_SS_FAMILY
206 +#define ss_family __ss_family
215 /* per-user/session state */
216 struct protstream *imapd_out, *imapd_in;
218 +static char imapd_clienthost[NI_MAXHOST*2+1] = "[local]";
220 static char imapd_clienthost[250] = "[local]";
222 static time_t imapd_logtime;
223 static int imapd_logfd = -1;
227 sasl_security_properties_t *secprops = NULL;
228 sasl_external_properties_t extprops;
230 + struct sockaddr_storage imapd_localaddr, imapd_remoteaddr;
231 + char hbuf[NI_MAXHOST];
233 struct sockaddr_in imapd_localaddr, imapd_remoteaddr;
235 int imapd_haveaddr = 0;
240 /* Find out name of client host */
241 salen = sizeof(imapd_remoteaddr);
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));
251 + imapd_clienthost[0] = '\0';
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;
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,
273 /* create the SASL connection */
274 if (sasl_server_new("imap", config_servername,
275 diff -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
283 +#ifndef NI_WITHSCOPEID
284 +#define NI_WITHSCOPEID 0
286 +#ifndef HAVE_SS_FAMILY
287 +#define ss_family __ss_family
291 /* data per message */
299 + struct sockaddr_storage localaddr, remoteaddr;
301 struct sockaddr_in localaddr, remoteaddr;
305 sasl_conn_t *conn = NULL;
308 char *authuser = NULL;
309 struct auth_state *authstate = NULL;
311 + char hbuf[NI_MAXHOST];
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) {
323 + (remoteaddr.ss_family == AF_INET || remoteaddr.ss_family == AF_INET6)
325 + remoteaddr.sin_family == AF_INET
328 /* connected to an internet socket */
330 salen = sizeof(localaddr);
331 @@ -1006,9 +1028,16 @@
332 fatal("can't get local addr", EC_SOFTWARE);
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" : "");
341 syslog(LOG_DEBUG, "connection from [%s]%s",
342 inet_ntoa(remoteaddr.sin_addr),
343 func->preauth ? " preauth'd as postman" : "");
346 /* we're not connected to a internet socket! */
348 @@ -1139,20 +1168,37 @@
350 if (in) { free(in); in = NULL; }
351 if (out) { free(out); out = NULL; }
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);
359 + strcpy(hbuf, "[unix socket]");
361 if ((r != SASL_OK) && (r != SASL_CONTINUE)) {
363 syslog(LOG_ERR, "badlogin: %s %s %s [%s]",
367 remoteaddr.sin_family == AF_INET ?
368 inet_ntoa(remoteaddr.sin_addr) :
372 sasl_errstring(r, NULL, NULL),
375 syslog(LOG_ERR, "badlogin: %s %s %s",
379 remoteaddr.sin_family == AF_INET ?
380 inet_ntoa(remoteaddr.sin_addr) :
384 sasl_errstring(r, NULL, NULL));
386 @@ -1173,9 +1219,13 @@
387 VARIABLE_AUTH, hash_simple(mech),
389 syslog(LOG_NOTICE, "login: %s %s %s %s",
393 remoteaddr.sin_family == AF_INET ?
394 inet_ntoa(remoteaddr.sin_addr) :
397 user, mech, "User logged in");
400 @@ -1595,18 +1645,59 @@
402 host = xstrdup(config_servername);
405 + struct addrinfo hints, *res0 = NULL, *res;
409 struct sockaddr_in addr;
410 struct servent *service;
415 + if (*host == '[' && (p = strchr(host + 1, ']')) != NULL &&
416 + (*++p == '\0' || *p == ':')) {
422 + p = strchr(host, ':');
424 p = strchr(host, ':');
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);
438 + syslog(LOG_ERR, "getaddrinfo(%s, %s) failed: %s",
439 + host, p, gai_strerror(err));
442 + for (res = res0; res; res = res->ai_next) {
443 + sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
446 + if (connect(sock, res->ai_addr, res->ai_addrlen) >= 0)
451 + freeaddrinfo(res0);
453 + syslog(LOG_ERR, "connect(%s:%s) failed: %m", host, p);
457 if ((hp = gethostbyname(host)) == NULL) {
458 syslog(LOG_ERR, "gethostbyname(%s) failed", host);
460 @@ -1636,6 +1727,7 @@
461 syslog(LOG_ERR, "connect(%s:%s) failed: %m", host, p);
468 diff -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
472 #endif /* HAVE_KRB */
473 static int kflag = 0;
476 +#ifndef NI_WITHSCOPEID
477 +#define NI_WITHSCOPEID 0
479 +#ifndef HAVE_SS_FAMILY
480 +#define ss_family __ss_family
489 char *popd_userid = 0;
490 struct mailbox *popd_mailbox = 0;
492 +struct sockaddr_storage popd_localaddr, popd_remoteaddr;
494 struct sockaddr_in popd_localaddr, popd_remoteaddr;
496 int popd_haveaddr = 0;
498 +char popd_clienthost[NI_MAXHOST*2+1] = "[local]";
500 char popd_clienthost[250] = "[local]";
502 struct protstream *popd_out, *popd_in;
503 unsigned popd_exists = 0;
504 unsigned popd_highest;
508 sasl_security_properties_t *secprops=NULL;
510 + char hbuf[NI_MAXHOST];
517 /* Find out name of client host */
518 salen = sizeof(popd_remoteaddr);
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));
528 + popd_clienthost[0] = '\0';
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) {
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,
550 /* other params should be filled in */
551 if (sasl_server_new("pop", config_servername, NULL,
552 diff -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
556 #endif /* HAVE_KRB */
557 static int kflag = 0;
560 +#ifndef NI_WITHSCOPEID
561 +#define NI_WITHSCOPEID 0
563 +#ifndef HAVE_SS_FAMILY
564 +#define ss_family __ss_family
572 sasl_conn_t *popd_saslconn; /* the sasl connection context */
574 char *popd_userid = 0;
576 +struct sockaddr_storage popd_localaddr, popd_remoteaddr;
578 struct sockaddr_in popd_localaddr, popd_remoteaddr;
580 int popd_haveaddr = 0;
582 +char popd_clienthost[NI_MAXHOST*2+1] = "[local]";
584 char popd_clienthost[250] = "[local]";
586 struct protstream *popd_out, *popd_in;
587 int popd_starttls_done = 0;
588 int popd_auth_done = 0;
592 sasl_security_properties_t *secprops=NULL;
594 + char hbuf[NI_MAXHOST];
601 /* Find out name of client host */
602 salen = sizeof(popd_remoteaddr);
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));
612 + popd_clienthost[0] = '\0';
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) {
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,
634 /* other params should be filled in */
635 if (sasl_server_new("pop", config_servername, NULL,
636 @@ -1023,11 +1066,19 @@
639 sasl_security_properties_t *secprops = NULL;
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);
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);
656 @@ -1064,7 +1115,11 @@
657 r = sasl_setprop(backend_saslconn, SASL_IP_REMOTE, saddr_r);
658 if (r != SASL_OK) return r;
661 + addrsize=sizeof(struct sockaddr_storage);
663 addrsize=sizeof(struct sockaddr_in);
665 if (getsockname(backend_sock, (struct sockaddr *)saddr_l,&addrsize)!=0)
667 r = sasl_setprop(backend_saslconn, SASL_IP_LOCAL, saddr_l);
668 @@ -1136,8 +1191,12 @@
670 static void openproxy(void)
673 + struct addrinfo hints, *res0 = NULL, *res;
676 struct sockaddr_in sin;
678 char inboxname[MAX_MAILBOX_PATH];
681 @@ -1148,6 +1207,28 @@
682 r = mboxlist_lookup(inboxname, &server, NULL, NULL);
683 if (!r) fatal("couldn't find backend server", EC_CONFIG);
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,
694 + if (backend_sock < 0)
696 + if (connect(backend_sock, res->ai_addr, res->ai_addrlen) >= 0)
698 + close(backend_sock);
701 + freeaddrinfo(res0);
702 + if (backend_sock < 0) {
703 + syslog(LOG_ERR, "connect() failed: %m");
704 + fatal("connect failed", 1);
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);
716 backend_in = prot_new(backend_sock, 0);
717 backend_out = prot_new(backend_sock, 1);
718 diff -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
722 #include "pushstats.h"
723 #include "telemetry.h"
726 +#ifndef NI_WITHSCOPEID
727 +#define NI_WITHSCOPEID 0
729 +#ifndef HAVE_SS_FAMILY
730 +#define ss_family __ss_family
735 /* we want a list of our outgoing connections here and which one we're
742 + struct sockaddr_storage addr;
744 struct sockaddr_in addr;
747 struct prot_waitevent *timeout;
751 struct auth_state *proxyd_authstate = 0;
752 int proxyd_userisadmin;
754 +struct sockaddr_storage proxyd_localaddr, proxyd_remoteaddr;
756 struct sockaddr_in proxyd_localaddr, proxyd_remoteaddr;
758 int proxyd_haveaddr = 0;
760 +char proxyd_clienthost[NI_MAXHOST*2+1] = "[local]";
762 char proxyd_clienthost[250] = "[local]";
764 struct protstream *proxyd_out, *proxyd_in;
765 time_t proxyd_logtime;
766 static char shutdownfilename[1024];
767 @@ -552,11 +573,19 @@
770 sasl_security_properties_t *secprops = NULL;
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);
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);
788 r = sasl_setprop(s->saslconn, SASL_IP_REMOTE, saddr_r);
792 + addrsize=sizeof(struct sockaddr_storage);
794 addrsize=sizeof(struct sockaddr_in);
796 if (getsockname(s->sock, (struct sockaddr *)saddr_l,&addrsize)!=0)
798 r = sasl_setprop(s->saslconn, SASL_IP_LOCAL, saddr_l);
799 @@ -754,11 +787,14 @@
807 ret = xmalloc(sizeof(struct backend));
808 memset(ret, 0, sizeof(struct backend));
809 ret->hostname = xstrdup(server);
811 if ((hp = gethostbyname(server)) == NULL) {
812 syslog(LOG_ERR, "gethostbyname(%s) failed: %m", server);
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);
824 /* need to (re)establish connection to server or create one */
831 + struct addrinfo hints, *res0 = NULL, *res;
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);
838 + syslog(LOG_ERR, "getaddrinfo(%s) failed: %s",
839 + server, gai_strerror(err));
843 + for (res = res0; res; res = res->ai_next) {
844 + sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
847 + if (connect(sock, res->ai_addr, res->ai_addrlen) >= 0)
852 + freeaddrinfo(res0);
854 + syslog(LOG_ERR, "connect(%s) failed: %m", server);
859 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
860 syslog(LOG_ERR, "socket() failed: %m");
868 ret->in = prot_new(sock, 0);
869 ret->out = prot_new(sock, 1);
870 @@ -1043,6 +1110,9 @@
872 sasl_security_properties_t *secprops = NULL;
873 sasl_external_properties_t extprops;
875 + char hbuf[NI_MAXHOST];
880 @@ -1079,6 +1149,29 @@
882 /* Find out name of client host */
883 salen = sizeof(proxyd_remoteaddr);
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));
893 + proxyd_clienthost[0] = '\0';
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,
903 + proxyd_haveaddr = 1;
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 @@
916 /* create the SASL connection */
917 /* Make a SASL connection and setup some properties for it */
918 diff -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
926 +static int init_sasl(char *serverFQDN, char *port, int minssf, int maxssf)
928 static int init_sasl(char *serverFQDN, int port, int minssf, int maxssf)
932 sasl_security_properties_t *secprops=NULL;
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));
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));
943 /* attempt to start sasl */
944 saslresult=sasl_client_init(callbacks);
946 if (sasl_setprop(conn, SASL_IP_REMOTE, saddr_r)!=SASL_OK)
950 + addrsize=sizeof(struct sockaddr_storage);
952 addrsize=sizeof(struct sockaddr_in);
954 if (getsockname(sock,(struct sockaddr *)saddr_l,&addrsize)!=0)
960 /* initialize the network */
962 +int init_net(char *serverFQDN, char *port)
964 + struct addrinfo hints, *res0 = NULL, *res;
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;
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);
981 + if (connect(sock, res->ai_addr, res->ai_addrlen) >= 0)
986 + freeaddrinfo(res0);
989 + return IMTEST_FAIL;
992 int init_net(char *serverFQDN, int port)
994 struct sockaddr_in addr;
1003 @@ -1179,7 +1225,9 @@
1004 char *tls_keyfile="";
1005 char *port = "imap";
1006 struct servent *serv;
1010 int run_stress_test=0;
1012 int server_supports_tls;
1013 @@ -1243,6 +1291,15 @@
1014 /* last arg is server name */
1015 strncpy(servername, argv[optind], 1023);
1018 + if (init_net(servername, port) != IMTEST_OK) {
1019 + imtest_fatal("Network initialization");
1022 + if (init_sasl(servername, port, minssf, maxssf) != IMTEST_OK) {
1023 + imtest_fatal("SASL initialization");
1026 /* map port -> num */
1027 serv = getservbyname(port, "tcp");
1029 @@ -1258,6 +1315,7 @@
1030 if (init_sasl(servername, servport, minssf, maxssf) != IMTEST_OK) {
1031 imtest_fatal("SASL initialization");
1035 /* set up the prot layer */
1036 pin = prot_new(sock, 0);
1037 diff -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 @@
1042 sasl_callback_t *cbs)
1047 + struct addrinfo hints, *res0 = NULL, *res;
1052 struct sockaddr_in addr;
1054 static struct imclient zeroimclient;
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))
1066 + for (res = res0; res; res = res->ai_next) {
1067 + s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
1070 + if (connect(s, res->ai_addr, res->ai_addrlen) >= 0)
1078 hp = gethostbyname(host);
1081 @@ -242,13 +268,20 @@
1082 if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
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;
1093 + (*imclient)->servername = xstrdup(res0->ai_canonname ?
1094 + res0->ai_canonname : host);
1095 + freeaddrinfo(res0);
1097 (*imclient)->servername = xstrdup(hp->h_name);
1099 (*imclient)->outptr = (*imclient)->outstart = (*imclient)->outbuf;
1100 (*imclient)->outleft = (*imclient)->maxplain = sizeof((*imclient)->outbuf);
1101 imclient_addcallback(*imclient,
1102 diff -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 @@
1109 +char *parse_host(char *listen)
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) {
1125 /* set sin_port accordingly. return of 0 indicates failure. */
1126 int resolve_port(char *port, struct service *s, struct sockaddr_in *sin)
1128 @@ -265,21 +281,14 @@
1129 int resolve_host(struct service *s, struct sockaddr_in *sin)
1133 + char *listen_addr;
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) {
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);
1155 @@ -297,17 +306,146 @@
1161 void service_create(struct service *s)
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;
1170 struct sockaddr_in sin;
1171 - struct sockaddr_un sunsock;
1172 struct sockaddr *sa;
1175 + struct sockaddr_un sunsock;
1177 - int on = 1, salen;
1183 + if (s->socket > 0)
1184 + return; /* service is already activated */
1186 + if (s->listen[0] == '/') { /* unix socket */
1187 + res0 = (struct addrinfo *)malloc(sizeof(struct addrinfo));
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;
1197 + res0->ai_addrlen += sizeof(sunsock.sun_len);
1198 + sunsock.sun_len = res0->ai_addrlen;
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;
1212 + syslog(LOG_INFO, "invalid proto '%s', disabling %s",
1213 + s->proto, s->name);
1217 + if ((port = parse_listen(s->listen)) == NULL) {
1218 + /* s->listen IS the port */
1220 + listen_addr = NULL;
1222 + /* s->listen is now just the address */
1223 + listen_addr = parse_host(s->listen);
1224 + if (*listen_addr == '\0')
1225 + listen_addr = NULL;
1227 + error = getaddrinfo(listen_addr, port, &hints, &res0);
1229 + syslog(LOG_INFO, "%s, disabling %s", gai_strerror(error), s->name);
1235 + memcpy(&service0, s, sizeof(struct service));
1237 + for (res = res0; res; res = res->ai_next) {
1238 + if (s->socket > 0) {
1239 + memcpy(&service, &service0, sizeof(struct service));
1243 + s->socket = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
1244 + if (s->socket < 0)
1247 + /* allow reuse of address */
1248 + setsockopt(s->socket, SOL_SOCKET, SO_REUSEADDR,
1249 + (void *) &on, sizeof(on));
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));
1257 + oldumask = umask((mode_t) 0); /* for linux */
1258 + r = bind(s->socket, res->ai_addr, res->ai_addrlen);
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);
1272 + if (listen(s->socket, listen_queue_backlog) < 0) {
1273 + syslog(LOG_ERR, "unable to listen to %s socket: %m", s->name);
1279 + s->ready_workers = 0;
1281 + get_statsock(s->stat);
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);
1289 + memcpy(&Services[nservices++], s, sizeof(struct service));
1294 + freeaddrinfo(res0);
1295 + if (nsocket <= 0) {
1296 + syslog(LOG_ERR, "unable to create %s listener socket: %m", s->name);
1301 memset(&sin, 0, sizeof(sin));
1303 if (s->listen[0] == '/') { /* unix socket */
1305 s->ready_workers = 0;
1307 get_statsock(s->stat);
1311 void run_startup(char **cmd)
1312 diff -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
1316 static int libwrap_ask(struct request_info *r, int fd)
1320 + struct sockaddr_storage sin;
1322 struct sockaddr_in sin;
1324 socklen_t len = sizeof(sin);
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) {
1333 diff -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
1341 +#ifndef NI_WITHSCOPEID
1342 +#define NI_WITHSCOPEID 0
1344 +#ifndef HAVE_SS_FAMILY
1345 +#define ss_family __ss_family
1349 sasl_conn_t *sieved_saslconn; /* the sasl connection context */
1351 struct auth_state *sieved_authstate = 0;
1354 +struct sockaddr_storage sieved_localaddr;
1355 +struct sockaddr_storage sieved_remoteaddr;
1357 struct sockaddr_in sieved_localaddr;
1358 struct sockaddr_in sieved_remoteaddr;
1361 struct protstream *sieved_out;
1362 struct protstream *sieved_in;
1364 int sieved_haveaddr = 0;
1366 +char sieved_clienthost[NI_MAXHOST*2+1] = "[local]";
1368 char sieved_clienthost[250] = "[local]";
1371 int sieved_userisadmin;
1376 sasl_security_properties_t *secprops = NULL;
1378 + char hbuf[NI_MAXHOST];
1381 /* set up the prot streams */
1382 sieved_in = prot_new(0, 0);
1383 @@ -248,6 +268,28 @@
1385 /* Find out name of client host */
1386 salen = sizeof(sieved_remoteaddr);
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));
1396 + sieved_clienthost[0] = '\0';
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;
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,
1413 sieved_haveaddr = 1;
1418 /* set the SASL allocation functions */
1419 sasl_set_alloc((sasl_malloc_t *) &xmalloc,