* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 2016 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
/* See the file NOTICE for conditions of use and distribution. */
#include "../exim.h"
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
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 = {
{
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)
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;
/* 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));
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);
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 "
OK : DEFER;
}
+#endif /*!MACRO_PREDEF*/
/* End of routers/queryprogram.c */