예제 #1
0
파일: milter.c 프로젝트: execunix/vinos
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);
}
예제 #2
0
파일: milter.c 프로젝트: terbolous/postfix
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);
}