From 6a0f853d15400901f9b54f66af3b3ae74f322b92 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Tue, 29 Oct 2013 17:05:59 +0800 Subject: [PATCH 1/2] add multi-config support --- src/jconf.c | 26 ++++++++++++++++++++++++-- src/jconf.h | 8 +++++++- src/local.c | 21 +++++++++++++-------- src/local.h | 3 +-- src/redir.c | 21 +++++++++++++-------- src/redir.h | 3 +-- src/server.c | 2 +- 7 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/jconf.c b/src/jconf.c index dbf27ce0..f1a14d9a 100644 --- a/src/jconf.c +++ b/src/jconf.c @@ -52,6 +52,27 @@ static int to_int(const json_value *value) return 0; } +static void parse_addr(const char *str, remote_addr_t *addr) { + int ret = -1; + char *pch; + pch = strchr(str, ':'); + while (pch != NULL) + { + ret = pch - str; + pch = strchr(pch + 1, ':'); + } + if (ret == -1) + { + addr->host = str; + addr->port = NULL; + } + else + { + addr->host = ss_strndup(str, ret); + addr->port = str + ret + 1; + } +} + jconf_t *read_jconf(const char* file) { @@ -101,13 +122,14 @@ jconf_t *read_jconf(const char* file) { if (j >= MAX_REMOTE_NUM) break; json_value *v = value->u.array.values[j]; - conf.remote_host[j] = to_string(v); + parse_addr(to_string(v), conf.remote_addr + j); conf.remote_num = j + 1; } } else if (value->type == json_string) { - conf.remote_host[0] = to_string(value); + conf.remote_addr[0].host = to_string(value); + conf.remote_addr[0].port = NULL; conf.remote_num = 1; } } diff --git a/src/jconf.h b/src/jconf.h index a47fc776..ca99142e 100644 --- a/src/jconf.h +++ b/src/jconf.h @@ -6,10 +6,16 @@ #define DNS_THREAD_NUM 4 #define MAX_UDP_CONN_NUM 4096 +typedef struct +{ + char *host; + char *port; +} remote_addr_t; + typedef struct { int remote_num; - char *remote_host[MAX_REMOTE_NUM]; + remote_addr_t remote_addr[MAX_REMOTE_NUM]; char *remote_port; char *local_port; char *password; diff --git a/src/local.c b/src/local.c index 867cc17d..819c5f40 100644 --- a/src/local.c +++ b/src/local.c @@ -751,7 +751,11 @@ static void accept_cb (EV_P_ ev_io *w, int revents) hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; int index = rand() % listener->remote_num; - int err = getaddrinfo(listener->remote_host[index], listener->remote_port, &hints, &res); + if (verbose) + { + LOGD("connect to %s:%s", listener->remote_addr[index].host, listener->remote_addr[index].port); + } + int err = getaddrinfo(listener->remote_addr[index].host, listener->remote_addr[index].port, &hints, &res); if (err) { ERROR("getaddrinfo"); @@ -804,7 +808,7 @@ int main (int argc, char **argv) char *iface = NULL; int remote_num = 0; - char *remote_host[MAX_REMOTE_NUM]; + remote_addr_t remote_addr[MAX_REMOTE_NUM]; char *remote_port = NULL; opterr = 0; @@ -814,7 +818,8 @@ int main (int argc, char **argv) switch (c) { case 's': - remote_host[remote_num++] = optarg; + remote_addr[remote_num].host = optarg; + remote_addr[remote_num++].port = NULL; break; case 'p': remote_port = optarg; @@ -867,7 +872,7 @@ int main (int argc, char **argv) remote_num = conf->remote_num; for (i = 0; i < remote_num; i++) { - remote_host[i] = conf->remote_host[i]; + remote_addr[i] = conf->remote_addr[i]; } } if (remote_port == NULL) remote_port = conf->remote_port; @@ -922,13 +927,13 @@ int main (int argc, char **argv) // Setup proxy context struct listen_ctx listen_ctx; listen_ctx.remote_num = remote_num; - listen_ctx.remote_host = malloc(sizeof(char *) * remote_num); + listen_ctx.remote_addr = malloc(sizeof(remote_addr_t) * remote_num); while (remote_num > 0) { int index = --remote_num; - listen_ctx.remote_host[index] = remote_host[index]; + if (remote_addr[index].port == NULL) remote_addr[index].port = remote_port; + listen_ctx.remote_addr[index] = remote_addr[index]; } - listen_ctx.remote_port = remote_port; listen_ctx.timeout = atoi(timeout); listen_ctx.fd = listenfd; listen_ctx.iface = iface; @@ -946,7 +951,7 @@ int main (int argc, char **argv) if (udprelay) { LOGD("udprelay enabled."); - udprelay_init(local_addr, local_port, remote_host[0], remote_port, m, iface); + udprelay_init(local_addr, local_port, remote_addr[0].host, remote_addr[0].port, m, iface); } ev_run (loop, 0); diff --git a/src/local.h b/src/local.h index ac716d2a..e4766d57 100644 --- a/src/local.h +++ b/src/local.h @@ -8,8 +8,7 @@ struct listen_ctx { ev_io io; - char **remote_host; - char *remote_port; + remote_addr_t *remote_addr; char *iface; int remote_num; int method; diff --git a/src/redir.c b/src/redir.c index ff254949..ef6c4f66 100644 --- a/src/redir.c +++ b/src/redir.c @@ -619,7 +619,11 @@ static void accept_cb (EV_P_ ev_io *w, int revents) hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; int index = rand() % listener->remote_num; - err = getaddrinfo(listener->remote_host[index], listener->remote_port, &hints, &res); + if (verbose) + { + LOGD("connect to %s:%s", listener->remote_addr[index].host, listener->remote_addr[index].port); + } + err = getaddrinfo(listener->remote_addr[index].host, listener->remote_addr[index].port, &hints, &res); if (err) { ERROR("getaddrinfo"); @@ -670,7 +674,7 @@ int main (int argc, char **argv) char *conf_path = NULL; int remote_num = 0; - char *remote_host[MAX_REMOTE_NUM]; + remote_addr_t remote_addr[MAX_REMOTE_NUM]; char *remote_port = NULL; opterr = 0; @@ -680,7 +684,8 @@ int main (int argc, char **argv) switch (c) { case 's': - remote_host[remote_num++] = optarg; + remote_addr[remote_num].host = optarg; + remote_addr[remote_num++].port = NULL; break; case 'p': remote_port = optarg; @@ -724,7 +729,7 @@ int main (int argc, char **argv) remote_num = conf->remote_num; for (i = 0; i < remote_num; i++) { - remote_host[i] = conf->remote_host[i]; + remote_addr[i] = conf->remote_addr[i]; } } if (remote_port == NULL) remote_port = conf->remote_port; @@ -755,7 +760,7 @@ int main (int argc, char **argv) signal(SIGABRT, SIG_IGN); // Setup keys - LOGD("calculating ciphers..."); + LOGD("initialize ciphers... %s", method); int m = enc_init(password, method); // Setup socket @@ -775,13 +780,13 @@ int main (int argc, char **argv) // Setup proxy context struct listen_ctx listen_ctx; listen_ctx.remote_num = remote_num; - listen_ctx.remote_host = malloc(sizeof(char *) * remote_num); + listen_ctx.remote_addr = malloc(sizeof(remote_addr_t) * remote_num); while (remote_num > 0) { int index = --remote_num; - listen_ctx.remote_host[index] = remote_host[index]; + if (remote_addr[index].port == NULL) remote_addr[index].port = remote_port; + listen_ctx.remote_addr[index] = remote_addr[index]; } - listen_ctx.remote_port = remote_port; listen_ctx.timeout = atoi(timeout); listen_ctx.fd = listenfd; listen_ctx.method = m; diff --git a/src/redir.h b/src/redir.h index c5300133..2213be6f 100644 --- a/src/redir.h +++ b/src/redir.h @@ -8,8 +8,7 @@ struct listen_ctx { ev_io io; - char **remote_host; - char *remote_port; + remote_addr_t *remote_host; int remote_num; int timeout; int fd; diff --git a/src/server.c b/src/server.c index b7de0f90..3b9547e7 100644 --- a/src/server.c +++ b/src/server.c @@ -969,7 +969,7 @@ int main (int argc, char **argv) server_num = conf->remote_num; for (i = 0; i < server_num; i++) { - server_host[i] = conf->remote_host[i]; + server_host[i] = conf->remote_addr[i].host; } } if (server_port == NULL) server_port = conf->remote_port; From 183f02162820b217e384aa5e2f73b37c5d80c774 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Tue, 29 Oct 2013 02:09:03 -0700 Subject: [PATCH 2/2] fix build error --- src/redir.c | 4 ---- src/redir.h | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/redir.c b/src/redir.c index ef6c4f66..ba5ce8ec 100644 --- a/src/redir.c +++ b/src/redir.c @@ -619,10 +619,6 @@ static void accept_cb (EV_P_ ev_io *w, int revents) hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; int index = rand() % listener->remote_num; - if (verbose) - { - LOGD("connect to %s:%s", listener->remote_addr[index].host, listener->remote_addr[index].port); - } err = getaddrinfo(listener->remote_addr[index].host, listener->remote_addr[index].port, &hints, &res); if (err) { diff --git a/src/redir.h b/src/redir.h index 2213be6f..da765ee8 100644 --- a/src/redir.h +++ b/src/redir.h @@ -8,7 +8,7 @@ struct listen_ctx { ev_io io; - remote_addr_t *remote_host; + remote_addr_t *remote_addr; int remote_num; int timeout; int fd;