static HANDLE_FUNC (handle_upstream) { char *ip; int port; char *domain; ip = get_string_arg (line, &match[2]); if (!ip) return -1; port = (int) get_long_arg (line, &match[7]); if (match[10].rm_so != -1) { domain = get_string_arg (line, &match[10]); if (domain) { upstream_add (ip, port, domain, &conf->upstream_list); safefree (domain); } } else { upstream_add (ip, port, NULL, &conf->upstream_list); } safefree (ip); return 0; }
static HANDLE_FUNC (handle_reversepath) { /* * The second string argument is optional. */ char *arg1, *arg2; arg1 = get_string_arg (line, &match[2]); if (!arg1) return -1; if (match[4].rm_so != -1) { arg2 = get_string_arg (line, &match[4]); if (!arg2) { safefree (arg1); return -1; } reversepath_add (arg1, arg2, &conf->reversepath_list); safefree (arg1); safefree (arg2); } else { reversepath_add (NULL, arg1, &conf->reversepath_list); safefree (arg1); } return 0; }
static HANDLE_FUNC (handle_listen) { char *arg = get_string_arg (line, &match[2]); if (arg == NULL) { return -1; } if (conf->listen_addrs == NULL) { conf->listen_addrs = vector_create(); if (conf->listen_addrs == NULL) { log_message(LOG_WARNING, "Could not create a list " "of listen addresses."); safefree(arg); return -1; } } vector_append (conf->listen_addrs, arg, strlen(arg) + 1); log_message(LOG_INFO, "Added address [%s] to listen addresses.", arg); safefree (arg); return 0; }
static HANDLE_FUNC (handle_deny) { char *arg = get_string_arg (line, &match[2]); insert_acl (arg, ACL_DENY, &conf->access_list); safefree (arg); return 0; }
static HANDLE_FUNC (handle_anonymous) { char *arg = get_string_arg (line, &match[2]); if (!arg) return -1; anonymous_insert (arg); safefree (arg); return 0; }
static HANDLE_FUNC (handle_upstream_no) { char *domain; domain = get_string_arg (line, &match[2]); if (!domain) return -1; upstream_add (NULL, 0, domain, &conf->upstream_list); safefree (domain); return 0; }
static HANDLE_FUNC (handle_addheader) { char *name = get_string_arg (line, &match[2]); char *value = get_string_arg (line, &match[3]); http_header_t *header; if (!conf->add_headers) { conf->add_headers = vector_create (); } header = (http_header_t *) safemalloc (sizeof (http_header_t)); header->name = name; header->value = value; vector_prepend (conf->add_headers, header, sizeof *header); safefree (header); /* Don't free name or value here, as they are referenced in the * struct inserted into the vector. */ return 0; }
static int set_string_arg (char **var, const char *line, regmatch_t * match) { char *arg = get_string_arg (line, match); if (!arg) return -1; if (*var != NULL) { safefree (*var); } *var = arg; return 0; }
static HANDLE_FUNC (handle_errorfile) { /* * Because an integer is defined as ((0x)?[[:digit:]]+) _two_ * match places are used. match[2] matches the full digit * string, while match[3] matches only the "0x" part if * present. This is why the "string" is located at * match[4] (rather than the more intuitive match[3]. */ unsigned long int err = get_long_arg (line, &match[2]); char *page = get_string_arg (line, &match[4]); add_new_errorpage (page, err); safefree (page); return 0; }
static HANDLE_FUNC (handle_loglevel) { static const unsigned int nlevels = sizeof (log_levels) / sizeof (log_levels[0]); unsigned int i; char *arg = get_string_arg (line, &match[2]); for (i = 0; i != nlevels; ++i) { if (!strcasecmp (arg, log_levels[i].string)) { set_log_level (log_levels[i].level); safefree (arg); return 0; } } safefree (arg); return -1; }