MILTERS *milter_new(const char *names, int conn_timeout, int cmd_timeout, int msg_timeout, const char *protocol, const char *def_action, MILTER_MACROS *macros) { MILTERS *milters; MILTER *head = 0; MILTER *tail = 0; char *name; MILTER *milter; const char *sep = ", \t\r\n"; /* * Parse the milter list. */ milters = (MILTERS *) mymalloc(sizeof(*milters)); if (names != 0) { char *saved_names = mystrdup(names); char *cp = saved_names; while ((name = mystrtok(&cp, sep)) != 0) { milter = milter8_create(name, conn_timeout, cmd_timeout, msg_timeout, protocol, def_action, milters); if (head == 0) { head = milter; } else { tail->next = milter; } tail = milter; } myfree(saved_names); } milters->milter_list = head; milters->mac_lookup = 0; milters->mac_context = 0; milters->macros = macros; milters->add_header = 0; milters->upd_header = milters->ins_header = 0; milters->del_header = 0; milters->add_rcpt = milters->del_rcpt = 0; milters->repl_body = 0; milters->chg_context = 0; return (milters); }
MILTERS *milter_new(const char *names, int conn_timeout, int cmd_timeout, int msg_timeout, const char *protocol, const char *def_action, MILTER_MACROS *macros) { MILTERS *milters; MILTER *head = 0; MILTER *tail = 0; char *name; MILTER *milter; const char *sep = ", \t\r\n"; const char *parens = "{}"; int my_conn_timeout; int my_cmd_timeout; int my_msg_timeout; const char *my_protocol; const char *my_def_action; /* * Initialize. */ link_override_table_to_variable(time_table, my_conn_timeout); link_override_table_to_variable(time_table, my_cmd_timeout); link_override_table_to_variable(time_table, my_msg_timeout); link_override_table_to_variable(str_table, my_protocol); link_override_table_to_variable(str_table, my_def_action); /* * Parse the milter list. */ milters = (MILTERS *) mymalloc(sizeof(*milters)); if (names != 0 && *names != 0) { char *saved_names = mystrdup(names); char *cp = saved_names; char *op; char *err; /* * Instantiate Milters, allowing for per-Milter overrides. */ while ((name = mystrtokq(&cp, sep, parens)) != 0) { my_conn_timeout = conn_timeout; my_cmd_timeout = cmd_timeout; my_msg_timeout = msg_timeout; my_protocol = protocol; my_def_action = def_action; if (name[0] == '{') { /* } */ op = name; if ((err = extpar(&op, parens, EXTPAR_FLAG_NONE)) != 0) msg_fatal("milter service syntax error: %s", err); if ((name = mystrtok(&op, sep)) == 0) msg_fatal("empty milter definition: \"%s\"", names); attr_override(op, sep, parens, ATTR_OVER_STR_TABLE, str_table, ATTR_OVER_TIME_TABLE, time_table, 0); } milter = milter8_create(name, my_conn_timeout, my_cmd_timeout, my_msg_timeout, my_protocol, my_def_action, milters); if (head == 0) { head = milter; } else { tail->next = milter; } tail = milter; } myfree(saved_names); } milters->milter_list = head; milters->mac_lookup = 0; milters->mac_context = 0; milters->macros = macros; milters->add_header = 0; milters->upd_header = milters->ins_header = 0; milters->del_header = 0; milters->add_rcpt = milters->del_rcpt = 0; milters->repl_body = 0; milters->chg_context = 0; return (milters); }