summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/conf.c27
-rw-r--r--src/upstream.c49
-rw-r--r--src/upstream.h14
3 files changed, 58 insertions, 32 deletions
diff --git a/src/conf.c b/src/conf.c
index b17f6ee..f2b8c31 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -74,6 +74,9 @@
*/
#define RE_MAX_MATCHES 24
+#define CP_WARN(FMT, ...) \
+ log_message (LOG_WARNING, "line %lu: " FMT, lineno, __VA_ARGS__)
+
/*
* All configuration handling functions are REQUIRED to be defined
* with the same function template as below.
@@ -638,9 +641,7 @@ static HANDLE_FUNC (handle_anonymous)
return -1;
if(anonymous_insert (conf, arg) < 0) {
- log_message (LOG_WARNING,
- "anonymous_insert() failed: '%s'",
- arg);
+ CP_WARN ("anonymous_insert() failed: '%s'", arg);
safefree(arg);
return -1;
}
@@ -768,7 +769,7 @@ static HANDLE_FUNC (handle_group)
}
static void warn_invalid_address(char *arg, unsigned long lineno) {
- log_message (LOG_WARNING, "Invalid address %s on line %lu", arg, lineno);
+ CP_WARN ("Invalid address %s", arg);
}
static HANDLE_FUNC (handle_allow)
@@ -813,8 +814,8 @@ static HANDLE_FUNC (handle_listen)
if (conf->listen_addrs == NULL) {
conf->listen_addrs = sblist_new(sizeof(char*), 16);
if (conf->listen_addrs == NULL) {
- log_message(LOG_WARNING, "Could not create a list "
- "of listen addresses.");
+ CP_WARN ("Could not create a list "
+ "of listen addresses.", "");
safefree(arg);
return -1;
}
@@ -840,9 +841,7 @@ static HANDLE_FUNC (handle_errorfile)
char *page = get_string_arg (line, &match[4]);
if(add_new_errorpage (conf, page, err) < 0) {
- log_message (LOG_WARNING,
- "add_new_errorpage() failed: '%s'",
- page);
+ CP_WARN ("add_new_errorpage() failed: '%s'", page);
safefree (page);
}
return 0;
@@ -1025,6 +1024,7 @@ static HANDLE_FUNC (handle_upstream)
int port, mi;
char *domain = 0, *user = 0, *pass = 0, *tmp;
enum proxy_type pt;
+ enum upstream_build_error ube;
if (match[3].rm_so != -1) {
tmp = get_string_arg (line, &match[3]);
@@ -1034,9 +1034,9 @@ static HANDLE_FUNC (handle_upstream)
domain = get_string_arg (line, &match[4]);
if (!domain)
return -1;
- upstream_add (NULL, 0, domain, 0, 0, PT_NONE, &conf->upstream_list);
+ ube = upstream_add (NULL, 0, domain, 0, 0, PT_NONE, &conf->upstream_list);
safefree (domain);
- return 0;
+ goto check_err;
}
}
@@ -1066,13 +1066,16 @@ static HANDLE_FUNC (handle_upstream)
if (match[mi].rm_so != -1)
domain = get_string_arg (line, &match[mi]);
- upstream_add (ip, port, domain, user, pass, pt, &conf->upstream_list);
+ ube = upstream_add (ip, port, domain, user, pass, pt, &conf->upstream_list);
safefree (user);
safefree (pass);
safefree (domain);
safefree (ip);
+check_err:;
+ if(ube != UBE_SUCCESS)
+ CP_WARN("%s", upstream_build_error_string(ube));
return 0;
}
diff --git a/src/upstream.c b/src/upstream.c
index 0f7f24f..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);
@@ -83,13 +96,11 @@ static struct upstream *upstream_build (const char *host, int port, const char *
if (domain == NULL) {
if (type == PT_NONE) {
e_nonedomain:;
- log_message (LOG_WARNING,
- "Nonsense upstream none rule: empty domain");
+ *ube = UBE_EDOMAIN;
goto fail;
}
if (!host || !host[0] || port < 1) {
- log_message (LOG_WARNING,
- "Nonsense upstream rule: invalid host or port");
+ *ube = UBE_INVHOST;
goto fail;
}
@@ -103,8 +114,7 @@ static struct upstream *upstream_build (const char *host, int port, const char *
if (!domain[0]) goto e_nonedomain;
} else {
if (!host || !host[0] || !domain[0]) {
- log_message (LOG_WARNING,
- "Nonsense upstream rule: invalid parameters");
+ *ube = UBE_INVPARAMS;
goto fail;
}
up->host = safestrdup (host);
@@ -130,8 +140,7 @@ static struct upstream *upstream_build (const char *host, int port, const char *
}
up->ip = up->ip & up->mask;
} else {
- log_message (LOG_WARNING,
- "Nonsense upstream rule: failed to parse netmask");
+ *ube = UBE_NETMASK;
goto fail;
}
} else {
@@ -160,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 */
@@ -184,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;
@@ -194,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;
}
/*
diff --git a/src/upstream.h b/src/upstream.h
index c112784..a611807 100644
--- a/src/upstream.h
+++ b/src/upstream.h
@@ -27,6 +27,16 @@
#include "common.h"
+enum upstream_build_error {
+ UBE_SUCCESS = 0,
+ UBE_OOM,
+ UBE_USERLEN,
+ UBE_EDOMAIN,
+ UBE_INVHOST,
+ UBE_INVPARAMS,
+ UBE_NETMASK,
+};
+
/*
* Even if upstream support is not compiled into tinyproxy, this
* structure still needs to be defined.
@@ -54,11 +64,13 @@ struct upstream {
#ifdef UPSTREAM_SUPPORT
const char *proxy_type_name(proxy_type type);
-extern void upstream_add (const char *host, int port, const char *domain,
+extern 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);
extern struct upstream *upstream_get (char *host, struct upstream *up);
extern void free_upstream_list (struct upstream *up);
+extern const char* upstream_build_error_string(enum upstream_build_error);
#endif /* UPSTREAM_SUPPORT */
#endif /* _TINYPROXY_UPSTREAM_H_ */