summaryrefslogtreecommitdiffhomepage
path: root/src/upstream.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/upstream.c')
-rw-r--r--src/upstream.c88
1 files changed, 53 insertions, 35 deletions
diff --git a/src/upstream.c b/src/upstream.c
index 327b727..c8fee22 100644
--- a/src/upstream.c
+++ b/src/upstream.c
@@ -43,20 +43,34 @@ proxy_type_name(proxy_type type)
}
}
+
+const char* upstream_build_error_string(enum upstream_build_error ube) {
+ static const char *emap[] = {
+ [UBE_SUCCESS] = "",
+ [UBE_OOM] = "Unable to allocate memory in upstream_build()",
+ [UBE_USERLEN] = "User / pass in upstream config too long",
+ [UBE_EDOMAIN] = "Nonsense upstream none rule: empty domain",
+ [UBE_INVHOST] = "Nonsense upstream rule: invalid host or port",
+ [UBE_INVPARAMS] = "Nonsense upstream rule: invalid parameters",
+ [UBE_NETMASK] = "Nonsense upstream rule: failed to parse netmask",
+ };
+ return emap[ube];
+}
+
/**
* Construct an upstream struct from input data.
*/
static struct upstream *upstream_build (const char *host, int port, const char *domain,
const char *user, const char *pass,
- proxy_type type)
+ proxy_type type, enum upstream_build_error *ube)
{
char *ptr;
struct upstream *up;
+ *ube = UBE_SUCCESS;
up = (struct upstream *) safemalloc (sizeof (struct upstream));
if (!up) {
- log_message (LOG_ERR,
- "Unable to allocate memory in upstream_build()");
+ *ube = UBE_OOM;
return NULL;
}
@@ -69,8 +83,7 @@ static struct upstream *upstream_build (const char *host, int port, const char *
ssize_t ret;
ret = basicauth_string(user, pass, b, sizeof b);
if (ret == 0) {
- log_message (LOG_ERR,
- "User / pass in upstream config too long");
+ *ube = UBE_USERLEN;
return NULL;
}
up->ua.authstr = safestrdup (b);
@@ -81,9 +94,13 @@ static struct upstream *upstream_build (const char *host, int port, const char *
}
if (domain == NULL) {
- if (!host || host[0] == '\0' || port < 1) {
- log_message (LOG_WARNING,
- "Nonsense upstream rule: invalid host or port");
+ if (type == PT_NONE) {
+ e_nonedomain:;
+ *ube = UBE_EDOMAIN;
+ goto fail;
+ }
+ if (!host || !host[0] || port < 1) {
+ *ube = UBE_INVHOST;
goto fail;
}
@@ -92,11 +109,16 @@ static struct upstream *upstream_build (const char *host, int port, const char *
log_message (LOG_INFO, "Added upstream %s %s:%d for [default]",
proxy_type_name(type), host, port);
- } else if (host == NULL || type == PT_NONE) {
- if (!domain || domain[0] == '\0') {
- log_message (LOG_WARNING,
- "Nonsense no-upstream rule: empty domain");
- goto fail;
+ } else {
+ if (type == PT_NONE) {
+ if (!domain[0]) goto e_nonedomain;
+ } else {
+ if (!host || !host[0] || !domain[0]) {
+ *ube = UBE_INVPARAMS;
+ goto fail;
+ }
+ up->host = safestrdup (host);
+ up->port = port;
}
ptr = strchr (domain, '/');
@@ -116,26 +138,20 @@ static struct upstream *upstream_build (const char *host, int port, const char *
up->mask =
~((1 << (32 - atoi (ptr))) - 1);
}
+ up->ip = up->ip & up->mask;
+ } else {
+ *ube = UBE_NETMASK;
+ goto fail;
}
} else {
up->domain = safestrdup (domain);
}
- log_message (LOG_INFO, "Added no-upstream for %s", domain);
- } else {
- if (!host || host[0] == '\0' || port < 1 || !domain
- || domain[0] == '\0') {
- log_message (LOG_WARNING,
- "Nonsense upstream rule: invalid parameters");
- goto fail;
- }
-
- up->host = safestrdup (host);
- up->port = port;
- up->domain = safestrdup (domain);
-
- log_message (LOG_INFO, "Added upstream %s %s:%d for %s",
- proxy_type_name(type), host, port, domain);
+ if (type == PT_NONE)
+ log_message (LOG_INFO, "Added upstream none for %s", domain);
+ else
+ log_message (LOG_INFO, "Added upstream %s %s:%d for %s",
+ proxy_type_name(type), host, port, domain);
}
return up;
@@ -153,15 +169,17 @@ fail:
/*
* Add an entry to the upstream list
*/
-void upstream_add (const char *host, int port, const char *domain,
+enum upstream_build_error upstream_add (
+ const char *host, int port, const char *domain,
const char *user, const char *pass,
proxy_type type, struct upstream **upstream_list)
{
struct upstream *up;
+ enum upstream_build_error ube;
- up = upstream_build (host, port, domain, user, pass, type);
+ up = upstream_build (host, port, domain, user, pass, type, &ube);
if (up == NULL) {
- return;
+ return ube;
}
if (!up->domain && !up->ip) { /* always add default to end */
@@ -177,7 +195,7 @@ void upstream_add (const char *host, int port, const char *domain,
if (!tmp->next) {
up->next = NULL;
tmp->next = up;
- return;
+ return ube;
}
tmp = tmp->next;
@@ -187,14 +205,14 @@ void upstream_add (const char *host, int port, const char *domain,
up->next = *upstream_list;
*upstream_list = up;
- return;
+ return ube;
upstream_cleanup:
safefree (up->host);
safefree (up->domain);
safefree (up);
- return;
+ return ube;
}
/*
@@ -234,7 +252,7 @@ struct upstream *upstream_get (char *host, struct upstream *up)
up = up->next;
}
- if (up && (!up->host || !up->port))
+ if (up && (!up->host))
up = NULL;
if (up)