$NetBSD: patch-ae,v 1.6 2006/10/09 12:46:01 obache Exp $ --- imap/backend.c.orig 2006-02-08 05:57:27.000000000 +0900 +++ imap/backend.c @@ -264,25 +264,28 @@ static void timed_out(int sig) } } -struct backend *backend_connect(struct backend *ret, const char *server, +struct backend *backend_connect(struct backend *ret_backend, const char *server, struct protocol_t *prot, const char *userid, const char **auth_status) { /* need to (re)establish connection to server or create one */ int sock = -1; int r; - int err = 0; + int err = -1; struct addrinfo hints, *res0 = NULL, *res1 = NULL, *res; struct sockaddr_un sunsock; char buf[2048], *mechlist = NULL; struct sigaction action; + struct backend *ret; - if (!ret) { + if (!ret_backend) { ret = xmalloc(sizeof(struct backend)); memset(ret, 0, sizeof(struct backend)); strlcpy(ret->hostname, server, sizeof(ret->hostname)); ret->timeout = NULL; } + else + ret = ret_backend; if (server[0] == '/') { /* unix socket */ res0 = &hints; @@ -312,7 +315,7 @@ struct backend *backend_connect(struct b if (err) { syslog(LOG_ERR, "getaddrinfo(%s) failed: %s", server, gai_strerror(err)); - free(ret); + if (!ret_backend) free(ret); return NULL; } /* Get addrinfo struct for local interface. */ @@ -363,7 +366,7 @@ struct backend *backend_connect(struct b if (res0 != &hints) freeaddrinfo(res0); syslog(LOG_ERR, "connect(%s) failed: %m", server); - free(ret); + if (!ret_backend) free(ret); return NULL; } memcpy(&ret->addr, res->ai_addr, res->ai_addrlen); @@ -381,7 +384,7 @@ struct backend *backend_connect(struct b syslog(LOG_ERR, "backend_connect(): couldn't read initial greeting: %s", ret->in->error ? ret->in->error : "(null)"); - free(ret); + if (!ret_backend) free(ret); close(sock); return NULL; } @@ -396,13 +399,15 @@ struct backend *backend_connect(struct b if ((r = backend_authenticate(ret, prot, &mechlist, userid, auth_status))) { syslog(LOG_ERR, "couldn't authenticate to backend server: %s", sasl_errstring(r, NULL, NULL)); - free(ret); + if (!ret_backend) free(ret); close(sock); ret = NULL; } } if (mechlist) free(mechlist); + + if (!ret_backend) ret_backend = ret; return ret; }