X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Froute.c;h=f80256e3e82f4128b06e973bcea1aafd3592ca1e;hb=48c7f9e2e3b50cd5548447de62c77c7ddfe21519;hp=c5594b27c6bdd4ddb8a99dc1eb79e4ced49ba8c1;hpb=d7d7b7b91dd75cec636fc144da7e27eed860f971;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/route.c b/src/src/route.c index c5594b27c..f80256e3e 100644 --- a/src/src/route.c +++ b/src/src/route.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/route.c,v 1.8 2006/02/07 11:19:00 ph10 Exp $ */ +/* $Cambridge: exim/src/src/route.c,v 1.11 2006/10/09 14:36:25 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -1077,7 +1077,12 @@ static uschar lastshell[128]; BOOL route_finduser(uschar *s, struct passwd **pw, uid_t *return_uid) { -if (Ustrcmp(lastname, s) != 0) +BOOL cache_set = (Ustrcmp(lastname, s) == 0); + +DEBUG(D_uid) debug_printf("seeking password data for user \"%s\": %s\n", s, + cache_set? "using cached result" : "cache not available"); + +if (!cache_set) { int i = 0; @@ -1104,6 +1109,7 @@ if (Ustrcmp(lastname, s) != 0) else for (;;) { + errno = 0; if ((lastpw = getpwnam(CS s)) != NULL) break; if (++i > finduser_retries) break; sleep(1); @@ -1122,14 +1128,25 @@ if (Ustrcmp(lastname, s) != 0) pwcopy.pw_shell = CS lastshell; lastpw = &pwcopy; } + + else DEBUG(D_uid) + { + if (errno != 0) debug_printf("getpwnam(%s) failed: %s\n", s, + strerror(errno)); + } + } + +if (lastpw == NULL) + { + DEBUG(D_uid) debug_printf("getpwnam() returned NULL (user not found)\n"); + return FALSE; } else { - DEBUG(D_uid) debug_printf("finduser used cached passwd data for %s\n", s); + DEBUG(D_uid) debug_printf("getpwnam() succeeded uid=%d gid=%d\n", + lastpw->pw_uid, lastpw->pw_gid); } -if (lastpw == NULL) return FALSE; - if (return_uid != NULL) *return_uid = lastpw->pw_uid; if (pw != NULL) *pw = lastpw; @@ -1867,7 +1884,7 @@ if (r->translate_ip_address != NULL) h->mx = MX_NONE; store_pool = POOL_PERM; - rc = host_find_byname(h, NULL, NULL, TRUE); + rc = host_find_byname(h, NULL, HOST_FIND_QUALIFY_SINGLE, NULL, TRUE); store_pool = old_pool; if (rc == HOST_FIND_FAILED || rc == HOST_FIND_AGAIN)