X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/2632889eca3018763375f85b31212712044c395f..96c065cb7bcdfc0965fb111e1eab6e9180e9e186:/src/src/daemon.c diff --git a/src/src/daemon.c b/src/src/daemon.c index f1912c40f..15b5ab2da 100644 --- a/src/src/daemon.c +++ b/src/src/daemon.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/daemon.c,v 1.15 2006/02/22 14:46:44 ph10 Exp $ */ +/* $Cambridge: exim/src/src/daemon.c,v 1.18 2006/11/07 15:56:17 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -186,13 +186,14 @@ if (smtp_in == NULL) goto ERROR_RETURN; } -/* Get the data for the local interface address. */ +/* Get the data for the local interface address. Panic for most errors, but +"connection reset by peer" just means the connection went away. */ if (getsockname(accept_socket, (struct sockaddr *)(&interface_sockaddr), &ifsize) < 0) { - log_write(0, LOG_MAIN|LOG_PANIC, "getsockname() failed: %s", - strerror(errno)); + log_write(0, LOG_MAIN | ((errno == ECONNRESET)? 0 : LOG_PANIC), + "getsockname() failed: %s", strerror(errno)); smtp_printf("421 Local problem: getsockname() failed; please try again later\r\n"); goto ERROR_RETURN; } @@ -680,13 +681,14 @@ ERROR_RETURN: /* Close the streams associated with the socket which will also close the socket fds in this process. We can't do anything if fclose() fails, but logging brings it to someone's attention. However, "connection reset by peer" -isn't really a problem, so skip that one. If the streams don't exist, something -went wrong while setting things up. Make sure the socket descriptors are -closed, in order to drop the connection. */ +isn't really a problem, so skip that one. On Solaris, a dropped connection can +manifest itself as a broken pipe, so drop that one too. If the streams don't +exist, something went wrong while setting things up. Make sure the socket +descriptors are closed, in order to drop the connection. */ if (smtp_out != NULL) { - if (fclose(smtp_out) != 0 && errno != ECONNRESET) + if (fclose(smtp_out) != 0 && errno != ECONNRESET && errno != EPIPE) log_write(0, LOG_MAIN|LOG_PANIC, "daemon: fclose(smtp_out) failed: %s", strerror(errno)); smtp_out = NULL; @@ -695,7 +697,7 @@ else (void)close(accept_socket); if (smtp_in != NULL) { - if (fclose(smtp_in) != 0 && errno != ECONNRESET) + if (fclose(smtp_in) != 0 && errno != ECONNRESET && errno != EPIPE) log_write(0, LOG_MAIN|LOG_PANIC, "daemon: fclose(smtp_in) failed: %s", strerror(errno)); smtp_in = NULL; @@ -1627,6 +1629,8 @@ for (;;) { uschar opt[8]; uschar *p = opt; + uschar *extra[4]; + int extracount = 1; signal(SIGALRM, SIG_DFL); *p++ = '-'; @@ -1637,8 +1641,29 @@ for (;;) if (deliver_force_thaw) *p++ = 'f'; if (queue_run_local) *p++ = 'l'; *p = 0; + extra[0] = opt; + + /* If -R or -S were on the original command line, ensure they get + passed on. */ + + if (deliver_selectstring != NULL) + { + extra[extracount++] = deliver_selectstring_regex? US"-Rr" : US"-R"; + extra[extracount++] = deliver_selectstring; + } + + if (deliver_selectstring_sender != NULL) + { + extra[extracount++] = deliver_selectstring_sender_regex? + US"-Sr" : US"-S"; + extra[extracount++] = deliver_selectstring_sender; + } + + /* Overlay this process with a new execution. */ + + (void)child_exec_exim(CEE_EXEC_PANIC, FALSE, NULL, TRUE, extracount, + extra[0], extra[1], extra[2], extra[3], extra[4]); - (void)child_exec_exim(CEE_EXEC_PANIC, FALSE, NULL, TRUE, 1, opt); /* Control never returns here. */ }