{
sigset_t sigmask;
sigset_t old_sigmask;
+int save_errno = errno;
if (itval->it_value.tv_usec < 50 && itval->it_value.tv_sec == 0)
return;
(void)sigdelset(&sigmask, SIGALRM); /* Remove SIGALRM */
(void)sigsuspend(&sigmask); /* Until SIGALRM */
(void)sigprocmask(SIG_SETMASK, &old_sigmask, NULL); /* Restore mask */
+errno = save_errno;
+sigalrm_seen = FALSE;
}
void
millisleep(int msec)
{
-struct itimerval itval;
-itval.it_interval.tv_sec = 0;
-itval.it_interval.tv_usec = 0;
-itval.it_value.tv_sec = msec/1000;
-itval.it_value.tv_usec = (msec % 1000) * 1000;
+struct itimerval itval = {.it_interval = {.tv_sec = 0, .tv_usec = 0},
+ .it_value = {.tv_sec = msec/1000,
+ .tv_usec = (msec % 1000) * 1000}};
milliwait(&itval);
}
void
-exim_underbar_exit(int rc)
+exim_underbar_exit(int rc, const uschar * process)
{
store_exit();
+DEBUG(D_any)
+ debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d %s%s%sterminating with rc=%d "
+ ">>>>>>>>>>>>>>>>\n", (int)getpid(),
+ process ? "(" : "", process, process ? ") " : "", rc);
_exit(rc);
}
tcp_init();
if (f.tcp_fastopen_ok) fprintf(fp, " TCP_Fast_Open");
#endif
-#ifdef EXPERIMENTAL_LMDB
- fprintf(fp, " Experimental_LMDB");
-#endif
-#ifdef EXPERIMENTAL_QUEUEFILE
- fprintf(fp, " Experimental_QUEUEFILE");
-#endif
-#if defined(EXPERIMENTAL_SRS) || defined(EXPERIMENTAL_SRS_NATIVE)
- fprintf(fp, " Experimental_SRS");
-#endif
#ifdef EXPERIMENTAL_ARC
fprintf(fp, " Experimental_ARC");
#endif
#ifdef EXPERIMENTAL_DSN_INFO
fprintf(fp, " Experimental_DSN_info");
#endif
+#ifdef EXPERIMENTAL_LMDB
+ fprintf(fp, " Experimental_LMDB");
+#endif
+#ifdef EXPERIMENTAL_QUEUE_RAMP
+ fprintf(fp, " Experimental_Queue_Ramp");
+#endif
+#ifdef EXPERIMENTAL_QUEUEFILE
+ fprintf(fp, " Experimental_QUEUEFILE");
+#endif
+#if defined(EXPERIMENTAL_SRS) || defined(EXPERIMENTAL_SRS_NATIVE)
+ fprintf(fp, " Experimental_SRS");
+#endif
#ifdef EXPERIMENTAL_TLS_RESUME
fprintf(fp, " Experimental_TLS_resume");
#endif
queue_only_set = TRUE;
}
+ /* -odd: testsuite-only: add no inter-process delays */
+
+ else if (Ustrcmp(argrest, "d") == 0)
+ f.testsuite_delays = FALSE;
+
/* -odf: foreground delivery (smail-compatible option); same effect as
-odi: interactive (synchronous) delivery (sendmail-compatible option)
*/
case 'm':
case 'o':
- if (!*argrest) {}
- else badarg = TRUE;
+ if (*argrest) badarg = TRUE;
break;
/* -oP <name>: set pid file path for daemon
case 'r':
case 's':
- if (!*argrest)
- {
- int *tp = (*argrest == 'r')?
- &arg_receive_timeout : &arg_smtp_receive_timeout;
- if (argrest[1] == 0)
- {
- if (i+1 < argc) *tp= readconf_readtime(argv[++i], 0, FALSE);
- }
- else *tp = readconf_readtime(argrest + 1, 0, FALSE);
- if (*tp < 0)
- exim_fail("exim: bad time value %s: abandoned\n", argv[i]);
- }
- else badarg = TRUE;
+ {
+ int * tp = argrest[-1] == 'r'
+ ? &arg_receive_timeout : &arg_smtp_receive_timeout;
+ if (*argrest)
+ *tp = readconf_readtime(argrest, 0, FALSE);
+ else if (i+1 < argc)
+ *tp = readconf_readtime(argv[++i], 0, FALSE);
+
+ if (*tp < 0)
+ exim_fail("exim: bad time value %s: abandoned\n", argv[i]);
+ }
break;
/* -oX <list>: Override local_interfaces and/or default daemon ports */
case 'X':
- if (!*argrest)
- override_local_interfaces = argv[++i];
- else badarg = TRUE;
+ if (*argrest) badarg = TRUE;
+ else override_local_interfaces = argv[++i];
break;
/* Unknown -o argument */
if (count_queue)
{
set_process_info("counting the queue");
- queue_count();
+ fprintf(stdout, "%u\n", queue_count());
exit(EXIT_SUCCESS);
}
pid_t pid;
if (i == argc - 1)
(void)deliver_message(argv[i], forced_delivery, deliver_give_up);
- else if ((pid = fork()) == 0)
+ else if ((pid = exim_fork(US"cmdline-delivery")) == 0)
{
(void)deliver_message(argv[i], forced_delivery, deliver_give_up);
- exim_underbar_exit(EXIT_SUCCESS);
+ exim_underbar_exit(EXIT_SUCCESS, US"cmdline-delivery");
}
else if (pid < 0)
{
if (queue_interval == 0 && !f.daemon_listen)
{
DEBUG(D_queue_run) debug_printf("Single queue run%s%s%s%s\n",
- (start_queue_run_id == NULL)? US"" : US" starting at ",
- (start_queue_run_id == NULL)? US"" : start_queue_run_id,
- (stop_queue_run_id == NULL)? US"" : US" stopping at ",
- (stop_queue_run_id == NULL)? US"" : stop_queue_run_id);
+ start_queue_run_id ? US" starting at " : US"",
+ start_queue_run_id ? start_queue_run_id: US"",
+ stop_queue_run_id ? US" stopping at " : US"",
+ stop_queue_run_id ? stop_queue_run_id : US"");
if (*queue_name)
set_process_info("running the '%s' queue (single queue run)", queue_name);
else
pid_t pid;
search_tidyup();
- if ((pid = fork()) == 0)
+ if ((pid = exim_fork(US"local-accept delivery")) == 0)
{
int rc;
close_unwanted(); /* Close unwanted file descriptors and TLS */
rc = deliver_message(message_id, FALSE, FALSE);
search_tidyup();
exim_underbar_exit(!mua_wrapper || rc == DELIVER_MUA_SUCCEEDED
- ? EXIT_SUCCESS : EXIT_FAILURE);
+ ? EXIT_SUCCESS : EXIT_FAILURE, US"cmdline-delivery");
}
if (pid < 0)