X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/bfe645c1570343d3adca657ab67998e122ca8792..1e1ddfac79fbcd052f199500a6493c7f79cb8462:/src/src/routers/queryprogram.c diff --git a/src/src/routers/queryprogram.c b/src/src/routers/queryprogram.c index 138062e16..03c84fc89 100644 --- a/src/src/routers/queryprogram.c +++ b/src/src/routers/queryprogram.c @@ -2,7 +2,8 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2015 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ +/* Copyright (c) The Exim Maintainers 2020 */ /* See the file NOTICE for conditions of use and distribution. */ #include "../exim.h" @@ -15,23 +16,23 @@ optionlist queryprogram_router_options[] = { { "*expand_command_group", opt_bool | opt_hidden, - (void *)(offsetof(queryprogram_router_options_block, expand_cmd_gid)) }, + OPT_OFF(queryprogram_router_options_block, expand_cmd_gid) }, { "*expand_command_user", opt_bool | opt_hidden, - (void *)(offsetof(queryprogram_router_options_block, expand_cmd_uid)) }, + OPT_OFF(queryprogram_router_options_block, expand_cmd_uid) }, { "*set_command_group", opt_bool | opt_hidden, - (void *)(offsetof(queryprogram_router_options_block, cmd_gid_set)) }, + OPT_OFF(queryprogram_router_options_block, cmd_gid_set) }, { "*set_command_user", opt_bool | opt_hidden, - (void *)(offsetof(queryprogram_router_options_block, cmd_uid_set)) }, + OPT_OFF(queryprogram_router_options_block, cmd_uid_set) }, { "command", opt_stringptr, - (void *)(offsetof(queryprogram_router_options_block, command)) }, + OPT_OFF(queryprogram_router_options_block, command) }, { "command_group",opt_expand_gid, - (void *)(offsetof(queryprogram_router_options_block, cmd_gid)) }, + OPT_OFF(queryprogram_router_options_block, cmd_gid) }, { "command_user", opt_expand_uid, - (void *)(offsetof(queryprogram_router_options_block, cmd_uid)) }, + OPT_OFF(queryprogram_router_options_block, cmd_uid) }, { "current_directory", opt_stringptr, - (void *)(offsetof(queryprogram_router_options_block, current_directory)) }, + OPT_OFF(queryprogram_router_options_block, current_directory) }, { "timeout", opt_time, - (void *)(offsetof(queryprogram_router_options_block, timeout)) } + OPT_OFF(queryprogram_router_options_block, timeout) } }; /* Size of the options list. An extern variable has to be used so that its @@ -40,6 +41,20 @@ address can appear in the tables drtables.c. */ int queryprogram_router_options_count = sizeof(queryprogram_router_options)/sizeof(optionlist); + +#ifdef MACRO_PREDEF + +/* Dummy entries */ +queryprogram_router_options_block queryprogram_router_option_defaults = {0}; +void queryprogram_router_init(router_instance *rblock) {} +int queryprogram_router_entry(router_instance *rblock, address_item *addr, + struct passwd *pw, int verify, address_item **addr_local, + address_item **addr_remote, address_item **addr_new, + address_item **addr_succeed) {return 0;} + +#else /*!MACRO_PREDEF*/ + + /* Default private options block for the queryprogram router. */ queryprogram_router_options_block queryprogram_router_option_defaults = { @@ -109,20 +124,22 @@ add_generated(router_instance *rblock, address_item **addr_new, { while (generated != NULL) { + BOOL ignore_error = addr->prop.ignore_error; address_item *next = generated; + generated = next->next; next->parent = addr; - orflag(next, addr, af_propagate); next->prop = *addr_prop; + next->prop.ignore_error = next->prop.ignore_error || ignore_error; next->start_router = rblock->redirect_router; next->next = *addr_new; *addr_new = next; - if (addr->child_count == SHRT_MAX) + if (addr->child_count == USHRT_MAX) log_write(0, LOG_MAIN|LOG_PANIC_DIE, "%s router generated more than %d " - "child addresses for <%s>", rblock->name, SHRT_MAX, addr->address); + "child addresses for <%s>", rblock->name, USHRT_MAX, addr->address); addr->child_count++; DEBUG(D_route) @@ -214,7 +231,9 @@ ugid.uid_set = ugid.gid_set = FALSE; /* Set up the propagated data block with the current address_data and the errors address and extra header stuff. */ +bzero(&addr_prop, sizeof(addr_prop)); addr_prop.address_data = deliver_address_data; +tree_dup((tree_node **)&addr_prop.variables, addr->prop.variables); rc = rf_get_errors_address(addr, rblock, verify, &addr_prop.errors_address); if (rc != OK) return rc; @@ -223,6 +242,10 @@ rc = rf_get_munge_headers(addr, rblock, &addr_prop.extra_headers, &addr_prop.remove_headers); if (rc != OK) return rc; +#ifdef EXPERIMENTAL_SRS +addr_prop.srs_sender = NULL; +#endif + /* Get the fixed or expanded uid under which the command is to run (initialization ensures that one or the other is set). */ @@ -286,10 +309,8 @@ if (!transport_set_up_command(&argvptr, /* anchor for arg list */ /* Create the child process, making it a group leader. */ -pid = child_open_uid(argvptr, NULL, 0077, puid, pgid, &fd_in, &fd_out, - current_directory, TRUE); - -if (pid < 0) +if ((pid = child_open_uid(argvptr, NULL, 0077, puid, pgid, &fd_in, &fd_out, + current_directory, TRUE, US"queryprogram-cmd")) < 0) { addr->message = string_sprintf("%s router couldn't create child process: %s", rblock->name, strerror(errno)); @@ -468,9 +489,9 @@ lookup_value = NULL; if (*s != 0) { transport_instance *transport; - for (transport = transports; transport != NULL; transport = transport->next) + for (transport = transports; transport; transport = transport->next) if (Ustrcmp(transport->name, s) == 0) break; - if (transport == NULL) + if (!transport) { addr->message = string_sprintf("unknown transport name %s yielded by " "command", s); @@ -499,14 +520,14 @@ s = expand_string(US"${extract{hosts}{$value}}"); if (*s != 0) { - int lookup_type = lk_default; + int lookup_type = LK_DEFAULT; uschar *ss = expand_string(US"${extract{lookup}{$value}}"); lookup_value = NULL; if (*ss != 0) { - if (Ustrcmp(ss, "byname") == 0) lookup_type = lk_byname; - else if (Ustrcmp(ss, "bydns") == 0) lookup_type = lk_bydns; + if (Ustrcmp(ss, "byname") == 0) lookup_type = LK_BYNAME; + else if (Ustrcmp(ss, "bydns") == 0) lookup_type = LK_BYDNS; else { addr->message = string_sprintf("bad lookup type \"%s\" yielded by " @@ -534,4 +555,5 @@ return rf_queue_add(addr, addr_local, addr_remote, rblock, pw)? OK : DEFER; } +#endif /*!MACRO_PREDEF*/ /* End of routers/queryprogram.c */