diff options
author | Jeremy Harris <jgh146exb@wizmail.org> | 2020-03-22 18:30:18 +0000 |
---|---|---|
committer | Jeremy Harris <jgh146exb@wizmail.org> | 2020-03-22 20:14:24 +0000 |
commit | 8102279385f5f70c959aa219feca37031c0a1828 (patch) | |
tree | ed8b7548710e2fbafeee4aebdcd74e5f891cb279 /src | |
parent | 4b01271fa595a08e68ba8c58d6404e83623aa9c8 (diff) |
exit-time debug
Diffstat (limited to 'src')
-rw-r--r-- | src/src/daemon.c | 20 | ||||
-rw-r--r-- | src/src/exim.c | 70 | ||||
-rw-r--r-- | src/src/functions.h | 4 | ||||
-rw-r--r-- | src/src/log.c | 6 | ||||
-rw-r--r-- | src/src/moan.c | 2 | ||||
-rw-r--r-- | src/src/queue.c | 9 | ||||
-rw-r--r-- | src/src/rda.c | 2 | ||||
-rw-r--r-- | src/src/readconf.c | 6 | ||||
-rw-r--r-- | src/src/receive.c | 8 | ||||
-rw-r--r-- | src/src/route.c | 4 | ||||
-rw-r--r-- | src/src/smtp_in.c | 8 | ||||
-rw-r--r-- | src/src/tls.c | 2 | ||||
-rw-r--r-- | src/src/transport.c | 2 | ||||
-rw-r--r-- | src/src/transports/smtp.c | 2 |
14 files changed, 74 insertions, 71 deletions
diff --git a/src/src/daemon.c b/src/src/daemon.c index fa74ddb0e..1a747af79 100644 --- a/src/src/daemon.c +++ b/src/src/daemon.c @@ -367,7 +367,7 @@ if (LOGGING(smtp_connection)) expansion above did a lookup. */ search_tidyup(); -pid = exim_fork(US"daemon accept"); +pid = exim_fork(US"daemon-accept"); /* Handle the child process */ @@ -418,7 +418,7 @@ if (pid == 0) "please try again later.\r\n", FALSE); mac_smtp_fflush(); search_tidyup(); - exim_underbar_exit(EXIT_FAILURE, US"conn-accept"); + exim_underbar_exit(EXIT_FAILURE); } } else if (*nah) smtp_active_hostname = nah; @@ -505,7 +505,7 @@ if (pid == 0) { mac_smtp_fflush(); search_tidyup(); - exim_underbar_exit(EXIT_SUCCESS, US"conn-smtp"); + exim_underbar_exit(EXIT_SUCCESS); } for (;;) @@ -533,7 +533,7 @@ if (pid == 0) cancel_cutthrough_connection(TRUE, US"receive dropped"); mac_smtp_fflush(); smtp_log_no_mail(); /* Log no mail if configured */ - exim_underbar_exit(EXIT_SUCCESS, US"conn-receive"); + exim_underbar_exit(EXIT_SUCCESS); } if (message_id[0] == 0) continue; /* No message was accepted */ } @@ -556,7 +556,7 @@ if (pid == 0) /*XXX should we pause briefly, hoping that the client will be the active TCP closer hence get the TCP_WAIT endpoint? */ DEBUG(D_receive) debug_printf("SMTP>>(close on process exit)\n"); - exim_underbar_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS, US"conn-setup"); + exim_underbar_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS); } /* Show the recipients when debugging */ @@ -692,7 +692,7 @@ if (pid == 0) (void) deliver_message(message_id, FALSE, FALSE); search_tidyup(); - exim_underbar_exit(EXIT_SUCCESS, US"deliver_msg"); + exim_underbar_exit(EXIT_SUCCESS); } if (dpid > 0) @@ -954,7 +954,7 @@ else DEBUG(D_any) debug_printf("%s\n", string_open_failed(errno, "pid file %s", pid_file_path)); -exim_exit(EXIT_SUCCESS, US"pid file remover"); +exim_exit(EXIT_SUCCESS); } @@ -994,7 +994,7 @@ if (f.running_in_test_harness || write_pid) if (pid > 0) child_close(pid, 1); } -exim_exit(EXIT_SUCCESS, US"daemon"); +exim_exit(EXIT_SUCCESS); } @@ -1200,6 +1200,8 @@ ip_address_item *addresses = NULL; time_t last_connection_time = (time_t)0; int local_queue_run_max = atoi(CS expand_string(queue_run_max)); +process_purpose = US"daemon"; + /* If any debugging options are set, turn on the D_pid bit so that all debugging lines get the pid added. */ @@ -2218,7 +2220,7 @@ for (;;) else #endif queue_run(NULL, NULL, FALSE); - exim_underbar_exit(EXIT_SUCCESS, US"queue-runner"); + exim_underbar_exit(EXIT_SUCCESS); } if (pid < 0) diff --git a/src/src/exim.c b/src/src/exim.c index 1c0ea6b6e..7b1c8ead9 100644 --- a/src/src/exim.c +++ b/src/src/exim.c @@ -715,26 +715,26 @@ Returns: does not return */ void -exim_exit(int rc, const uschar * process) +exim_exit(int rc) { search_tidyup(); store_exit(); DEBUG(D_any) - debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d %s%s%sterminating with rc=%d " - ">>>>>>>>>>>>>>>>\n", (int)getpid(), - process ? "(" : "", process, process ? ") " : "", rc); + debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d (%s) terminating with rc=%d " + ">>>>>>>>>>>>>>>>\n", + (int)getpid(), process_purpose, rc); exit(rc); } void -exim_underbar_exit(int rc, const uschar * process) +exim_underbar_exit(int rc) { store_exit(); DEBUG(D_any) - debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d %s%s%sterminating with rc=%d " - ">>>>>>>>>>>>>>>>\n", (int)getpid(), - process ? "(" : "", process, process ? ") " : "", rc); + debug_printf(">>>>>>>>>>>>>>>> Exim pid=%d (%s) terminating with rc=%d " + ">>>>>>>>>>>>>>>>\n", + (int)getpid(), process_purpose, rc); _exit(rc); } @@ -4441,7 +4441,7 @@ if (test_retry_arg >= 0) if (test_retry_arg >= argc) { printf("-brt needs a domain or address argument\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } s1 = argv[test_retry_arg++]; s2 = NULL; @@ -4546,7 +4546,7 @@ if (test_retry_arg >= 0) printf("\n"); } - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } /* Handle a request to list one or more configuration options */ @@ -4573,14 +4573,14 @@ if (list_options) else fail = !readconf_print(argv[i], NULL, flag_n); } - exim_exit(fail ? EXIT_FAILURE : EXIT_SUCCESS, US"main"); + exim_exit(fail ? EXIT_FAILURE : EXIT_SUCCESS); } if (list_config) { set_process_info("listing config"); exim_exit(readconf_print(US"config", NULL, flag_n) - ? EXIT_SUCCESS : EXIT_FAILURE, US"main"); + ? EXIT_SUCCESS : EXIT_FAILURE); } @@ -4606,7 +4606,7 @@ if (msg_action_arg > 0 && msg_action != MSG_LOAD) if (prod_requires_admin && !f.admin_user) { fprintf(stderr, "exim: Permission denied\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } set_process_info("delivering specified messages"); if (deliver_give_up) forced_delivery = f.deliver_force_thaw = TRUE; @@ -4619,17 +4619,17 @@ if (msg_action_arg > 0 && msg_action != MSG_LOAD) else if ((pid = exim_fork(US"cmdline-delivery")) == 0) { (void)deliver_message(argv[i], forced_delivery, deliver_give_up); - exim_underbar_exit(EXIT_SUCCESS, US"cmdline-delivery"); + exim_underbar_exit(EXIT_SUCCESS); } else if (pid < 0) { fprintf(stderr, "failed to fork delivery process for %s: %s\n", argv[i], strerror(errno)); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } else wait(&status); } - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } @@ -4648,7 +4648,7 @@ if (queue_interval == 0 && !f.daemon_listen) else set_process_info("running the queue (single queue run)"); queue_run(start_queue_run_id, stop_queue_run_id, FALSE); - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } @@ -4818,10 +4818,10 @@ if (test_rewrite_arg >= 0) if (test_rewrite_arg >= argc) { printf("-brw needs an address argument\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } rewrite_test(argv[test_rewrite_arg]); - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } /* A locally-supplied message is considered to be coming from a local user @@ -4936,7 +4936,7 @@ if (verify_address_mode || f.address_test_mode) } route_tidyup(); - exim_exit(exit_value, US"main"); + exim_exit(exit_value); } /* Handle expansion checking. Either expand items on the command line, or read @@ -5022,7 +5022,7 @@ if (expansion_test) deliver_datafile = -1; } - exim_exit(EXIT_SUCCESS, US"main: expansion test"); + exim_exit(EXIT_SUCCESS); } @@ -5116,7 +5116,7 @@ if (host_checking) } smtp_log_no_mail(); } - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } @@ -5279,7 +5279,7 @@ if (smtp_input) if (!smtp_start_session()) { mac_smtp_fflush(); - exim_exit(EXIT_SUCCESS, US"smtp_start toplevel"); + exim_exit(EXIT_SUCCESS); } } @@ -5394,14 +5394,14 @@ while (more) cancel_cutthrough_connection(TRUE, US"receive dropped"); if (more) goto moreloop; smtp_log_no_mail(); /* Log no mail if configured */ - exim_exit(EXIT_FAILURE, US"receive toplevel"); + exim_exit(EXIT_FAILURE); } } else { cancel_cutthrough_connection(TRUE, US"message setup dropped"); smtp_log_no_mail(); /* Log no mail if configured */ - exim_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS, US"msg setup toplevel"); + exim_exit(rc ? EXIT_FAILURE : EXIT_SUCCESS); } } @@ -5451,7 +5451,7 @@ while (more) if (error_handling == ERRORS_STDERR) { fprintf(stderr, "exim: too many recipients\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } else return @@ -5485,7 +5485,7 @@ while (more) { fprintf(stderr, "exim: bad recipient address \"%s\": %s\n", string_printing(list[i]), errmess); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } else { @@ -5557,7 +5557,7 @@ while (more) for real; when reading the headers of a message for filter testing, it is TRUE if the headers were terminated by '.' and FALSE otherwise. */ - if (message_id[0] == 0) exim_exit(EXIT_FAILURE, US"main"); + if (message_id[0] == 0) exim_exit(EXIT_FAILURE); } /* Non-SMTP message reception */ /* If this is a filter testing run, there are headers in store, but @@ -5602,7 +5602,7 @@ while (more) if (chdir("/")) /* Get away from wherever the user is running this from */ { DEBUG(D_receive) debug_printf("chdir(\"/\") failed\n"); - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); } /* Now we run either a system filter test, or a user filter test, or both. @@ -5612,15 +5612,15 @@ while (more) if ((filter_test & FTEST_SYSTEM) != 0) if (!filter_runtest(filter_sfd, filter_test_sfile, TRUE, more)) - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); memcpy(filter_sn, filter_n, sizeof(filter_sn)); if ((filter_test & FTEST_USER) != 0) if (!filter_runtest(filter_ufd, filter_test_ufile, FALSE, more)) - exim_exit(EXIT_FAILURE, US"main"); + exim_exit(EXIT_FAILURE); - exim_exit(EXIT_SUCCESS, US"main"); + exim_exit(EXIT_SUCCESS); } /* Else act on the result of message reception. We should not get here unless @@ -5722,7 +5722,7 @@ while (more) rc = deliver_message(message_id, FALSE, FALSE); search_tidyup(); exim_underbar_exit(!mua_wrapper || rc == DELIVER_MUA_SUCCEEDED - ? EXIT_SUCCESS : EXIT_FAILURE, US"cmdline-delivery"); + ? EXIT_SUCCESS : EXIT_FAILURE); } if (pid < 0) @@ -5746,7 +5746,7 @@ while (more) log_write(0, LOG_MAIN|LOG_PANIC, "process %d crashed with signal %d while delivering %s", (int)pid, status & 0x00ff, message_id); - if (mua_wrapper && (status & 0xffff) != 0) exim_exit(EXIT_FAILURE, US"main"); + if (mua_wrapper && (status & 0xffff) != 0) exim_exit(EXIT_FAILURE); } } } @@ -5778,7 +5778,7 @@ moreloop: store_reset(reset_point); } -exim_exit(EXIT_SUCCESS, US"main"); /* Never returns */ +exim_exit(EXIT_SUCCESS); /* Never returns */ return 0; /* To stop compiler warning */ } diff --git a/src/src/functions.h b/src/src/functions.h index 9e5bba9bd..b8bf2a490 100644 --- a/src/src/functions.h +++ b/src/src/functions.h @@ -228,10 +228,10 @@ extern void msg_event_raise(const uschar *, const address_item *); extern int exim_chown_failure(int, const uschar*, uid_t, gid_t); extern const uschar * exim_errstr(int); -extern void exim_exit(int, const uschar *) NORETURN; +extern void exim_exit(int) NORETURN; extern void exim_nullstd(void); extern void exim_setugid(uid_t, gid_t, BOOL, uschar *); -extern void exim_underbar_exit(int, const uschar *); +extern void exim_underbar_exit(int) NORETURN; extern void exim_wait_tick(struct timeval *, int); extern int exp_bool(address_item *addr, uschar *mtype, uschar *mname, unsigned dgb_opt, uschar *oname, BOOL bvalue, diff --git a/src/src/log.c b/src/src/log.c index 2dd85c484..d9cf23a40 100644 --- a/src/src/log.c +++ b/src/src/log.c @@ -242,7 +242,7 @@ if (s1) } if (f.receive_call_bombout) receive_bomb_out(NULL, s2); /* does not return */ if (smtp_input) smtp_closedown(s2); -exim_exit(EXIT_FAILURE, NULL); +exim_exit(EXIT_FAILURE); } @@ -767,7 +767,7 @@ if (!log_buffer) if (!(log_buffer = US malloc(LOG_BUFFER_SIZE))) { fprintf(stderr, "exim: failed to get store for log buffer\n"); - exim_exit(EXIT_FAILURE, NULL); + exim_exit(EXIT_FAILURE); } /* If we haven't already done so, inspect the setting of log_file_path to @@ -983,7 +983,7 @@ if (!f.really_exim || f.log_testing_mode) else fprintf(log_stderr, "%s", CS log_buffer); - if ((flags & LOG_PANIC_DIE) == LOG_PANIC_DIE) exim_exit(EXIT_FAILURE, US""); + if ((flags & LOG_PANIC_DIE) == LOG_PANIC_DIE) exim_exit(EXIT_FAILURE); return; } diff --git a/src/src/moan.c b/src/src/moan.c index 51f5da58a..48d4f905e 100644 --- a/src/src/moan.c +++ b/src/src/moan.c @@ -692,7 +692,7 @@ fprintf(stderr, "%d previous message%s successfully processed.\n", fprintf(stderr, "The rest of the batch was abandoned.\n"); -exim_exit(yield, US"batch"); +exim_exit(yield); } diff --git a/src/src/queue.c b/src/src/queue.c index 9dbf3e717..3235a41ba 100644 --- a/src/src/queue.c +++ b/src/src/queue.c @@ -649,12 +649,13 @@ for (int i = queue_run_in_order ? -1 : 0; #endif single_item_retry: - if ((pid = exim_fork(US"qrun delivery")) == 0) + if ((pid = exim_fork(US"qrun-delivery")) == 0) { int rc; (void)close(pfd[pipe_read]); rc = deliver_message(fq->text, force_delivery, FALSE); - exim_underbar_exit(rc == DELIVER_NOT_ATTEMPTED, US"qrun-delivery"); + exim_underbar_exit(rc == DELIVER_NOT_ATTEMPTED + ? EXIT_FAILURE : EXIT_SUCCESS); } if (pid < 0) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "fork of delivery process from " @@ -706,7 +707,7 @@ single_item_retry: /* If initial of a 2-phase run, we are a child - so just exit */ if (f.queue_2stage && !queue_run_in_order) - exim_exit(EXIT_SUCCESS, US"2-phase child"); + exim_exit(EXIT_SUCCESS); /* If we are in the test harness, and this is not the first of a 2-stage queue run, update fudged queue times. */ @@ -723,7 +724,7 @@ single_item_retry: go_around: /* If initial of a 2-phase run, we are a child - so just exit */ if (f.queue_2stage && !queue_run_in_order) - exim_exit(EXIT_SUCCESS, US"2-phase child"); + exim_exit(EXIT_SUCCESS); } /* End loop for list of messages */ tree_nonrecipients = NULL; diff --git a/src/src/rda.c b/src/src/rda.c index 498a06168..0dc859107 100644 --- a/src/src/rda.c +++ b/src/src/rda.c @@ -768,7 +768,7 @@ if ((pid = exim_fork(US"router-interpret")) == 0) out: (void)close(fd); search_tidyup(); - exim_underbar_exit(0, US"rda"); + exim_underbar_exit(EXIT_SUCCESS); bad: DEBUG(D_rewrite) debug_printf("rda_interpret: failed write to pipe\n"); diff --git a/src/src/readconf.c b/src/src/readconf.c index a506d9f1d..1243e9082 100644 --- a/src/src/readconf.c +++ b/src/src/readconf.c @@ -3283,7 +3283,7 @@ while ((s = get_config_line())) if (isupper(*s)) { - if (!macro_read_assignment(s)) exim_exit(EXIT_FAILURE, US""); + if (!macro_read_assignment(s)) exim_exit(EXIT_FAILURE); continue; } @@ -3719,7 +3719,7 @@ while ((buffer = get_config_line())) (d->info->init)(d); d = NULL; } - if (!macro_read_assignment(buffer)) exim_exit(EXIT_FAILURE, US""); + if (!macro_read_assignment(buffer)) exim_exit(EXIT_FAILURE); continue; } @@ -4232,7 +4232,7 @@ while(acl_line) p = readconf_readname(name, sizeof(name), acl_line); if (isupper(*name) && *p == '=') { - if (!macro_read_assignment(acl_line)) exim_exit(EXIT_FAILURE, US""); + if (!macro_read_assignment(acl_line)) exim_exit(EXIT_FAILURE); acl_line = get_config_line(); continue; } diff --git a/src/src/receive.c b/src/src/receive.c index 5e8b6fbba..398250ebb 100644 --- a/src/src/receive.c +++ b/src/src/receive.c @@ -216,7 +216,7 @@ if (STATVFS(CS path, &statbuf) != 0) log_write(0, LOG_MAIN|LOG_PANIC, "cannot accept message: failed to stat " "%s directory %s: %s", name, path, strerror(errno)); smtp_closedown(US"spool or log directory problem"); - exim_exit(EXIT_FAILURE, NULL); + exim_exit(EXIT_FAILURE); } *inodeptr = (statbuf.F_FILES > 0)? statbuf.F_FAVAIL : -1; @@ -372,7 +372,7 @@ if (!already_bombing_out) /* Exit from the program (non-BSMTP cases) */ -exim_exit(EXIT_FAILURE, NULL); +exim_exit(EXIT_FAILURE); } @@ -1172,7 +1172,7 @@ if (error_handling == ERRORS_SENDER) else fprintf(stderr, "exim: %s%s\n", text2, text1); /* Sic */ (void)fclose(f); -exim_exit(error_rc, US""); +exim_exit(error_rc); } @@ -3340,7 +3340,7 @@ if (extract_recip && (bad_addresses || recipients_count == 0)) { Uunlink(spool_name); (void)fclose(spool_data_file); - exim_exit(error_rc, US"receiving"); + exim_exit(error_rc); } } diff --git a/src/src/route.c b/src/src/route.c index 6226b0685..c7833ebb4 100644 --- a/src/src/route.c +++ b/src/src/route.c @@ -759,9 +759,9 @@ while ((check = string_nextinlist(&listptr, &sep, buffer, sizeof(buffer)))) exim_setugid(uid, gid, TRUE, string_sprintf("require_files check, file=%s", ss)); if (route_check_access(ss, uid, gid, 4)) - exim_underbar_exit(0, US"route-check-access"); + exim_underbar_exit(EXIT_SUCCESS); DEBUG(D_route) debug_printf("route_check_access() failed\n"); - exim_underbar_exit(1, US"route-check-access"); + exim_underbar_exit(EXIT_FAILURE); } /* In the parent, wait for the child to finish */ diff --git a/src/src/smtp_in.c b/src/src/smtp_in.c index 268fd6956..9055020e1 100644 --- a/src/src/smtp_in.c +++ b/src/src/smtp_in.c @@ -457,7 +457,7 @@ if (smtp_batched_input) smtp_notquit_exit(US"command-timeout", US"421", US"%s: SMTP command timeout - closing connection", smtp_active_hostname); -exim_exit(EXIT_FAILURE, US"receiving"); +exim_exit(EXIT_FAILURE); } void @@ -468,7 +468,7 @@ if (smtp_batched_input) moan_smtp_batch(NULL, "421 SIGTERM received"); /* Does not return */ smtp_notquit_exit(US"signal-exit", US"421", US"%s: Service not available - closing connection", smtp_active_hostname); -exim_exit(EXIT_FAILURE, US"receiving"); +exim_exit(EXIT_FAILURE); } void @@ -931,7 +931,7 @@ if (!yield) { log_write(0, LOG_MAIN|LOG_PANIC, "string too large in smtp_printf()"); smtp_closedown(US"Unexpected error"); - exim_exit(EXIT_FAILURE, NULL); + exim_exit(EXIT_FAILURE); } /* If this is the first output for a (non-batch) RCPT command, see if all RCPTs @@ -5800,7 +5800,7 @@ while (done <= 0) } enq_end(etrn_serialize_key); - exim_underbar_exit(EXIT_SUCCESS, US"etrn-serialize-interproc"); + exim_underbar_exit(EXIT_SUCCESS); } /* Back in the top level SMTP process. Check that we started a subprocess diff --git a/src/src/tls.c b/src/src/tls.c index 9732da533..1362032f3 100644 --- a/src/src/tls.c +++ b/src/src/tls.c @@ -455,7 +455,7 @@ if (pid == 0) log_write(0, LOG_PANIC_DIE|LOG_CONFIG, "tls_require_ciphers invalid: %s", errmsg); fflush(NULL); - exim_underbar_exit(0, NULL); + exim_underbar_exit(EXIT_SUCCESS); } do { diff --git a/src/src/transport.c b/src/src/transport.c index d2cb8c235..aca7c7f5a 100644 --- a/src/src/transport.c +++ b/src/src/transport.c @@ -1274,7 +1274,7 @@ if ((write_pid = exim_fork(US"tpt-filter-writer")) == 0) != sizeof(struct timeval) ) rc = FALSE; /* compiler quietening */ - exim_underbar_exit(0, US"tpt-filter writer"); + exim_underbar_exit(EXIT_SUCCESS); } save_errno = errno; diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index 0bec253c1..fc5bb7801 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -3361,7 +3361,7 @@ for (int fd_bits = 3; fd_bits; ) done: testharness_pause_ms(100); /* let logging complete */ - exim_exit(0, US"TLS proxy"); + exim_exit(EXIT_SUCCESS); } #endif |