diff --git a/configure.ac b/configure.ac index 020698a1..7c26973d 100755 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ dnl -*- Autoconf -*- dnl Process this file with autoconf to produce a configure script. AC_PREREQ([2.67]) -AC_INIT([shadowsocks], [1.3.3], [max.c.lv@gmail.com]) +AC_INIT([shadowsocks], [1.4.0], [max.c.lv@gmail.com]) AC_CONFIG_SRCDIR([src/encrypt.c]) AC_CONFIG_HEADERS([config.h]) diff --git a/src/local.c b/src/local.c index 62abe22c..a7f44a09 100644 --- a/src/local.c +++ b/src/local.c @@ -40,6 +40,7 @@ #endif int verbose = 0; +int udprelay = 0; static int setnonblocking(int fd) { @@ -215,7 +216,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) struct sockaddr_in s_addr; memset(&s_addr, 0, sizeof(s_addr)); - if (request->cmd == 3) + if (udprelay && request->cmd == 3) { socklen_t addr_len = sizeof(s_addr); getsockname(server->fd, (struct sockaddr *)&s_addr, @@ -799,7 +800,7 @@ int main (int argc, char **argv) opterr = 0; - while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:i:c:b:v")) != -1) + while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:i:c:b:uv")) != -1) { switch (c) { @@ -834,6 +835,9 @@ int main (int argc, char **argv) case 'b': local_addr = optarg; break; + case 'u': + udprelay = 1; + break; case 'v': verbose = 1; break; @@ -926,7 +930,8 @@ int main (int argc, char **argv) ev_io_start (loop, &listen_ctx.io); // Setup UDP - udprelay(local_addr, local_port, remote_host[0], remote_port, m, iface); + if (udprelay) + udprelay_init(local_addr, local_port, remote_host[0], remote_port, m, iface); ev_run (loop, 0); return 0; diff --git a/src/server.c b/src/server.c index 70a8520d..6a3491b1 100644 --- a/src/server.c +++ b/src/server.c @@ -40,6 +40,7 @@ #endif int verbose = 0; +int udprelay = 0; static int remote_conn = 0; static int server_conn = 0; @@ -912,7 +913,7 @@ int main (int argc, char **argv) opterr = 0; - while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:c:i:d:v")) != -1) + while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:c:i:d:uv")) != -1) { switch (c) { @@ -945,6 +946,9 @@ int main (int argc, char **argv) dns_thread_num = atoi(optarg); if (!dns_thread_num) FATAL("Invalid DNS thread number"); break; + case 'u': + udprelay = 1; + break; case 'v': verbose = 1; break; @@ -1039,7 +1043,8 @@ int main (int argc, char **argv) } // Setup UDP - udprelay(server_host[0], server_port, asyncns, m, iface); + if (udprelay) + udprelay_init(server_host[0], server_port, asyncns, m, iface); // start ev loop ev_run (loop, 0); diff --git a/src/udprelay.c b/src/udprelay.c index e8d8d3e8..282f9ace 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -733,7 +733,7 @@ void free_cb(void *element) close_and_free_remote(EV_DEFAULT, remote_ctx); } -int udprelay(const char *server_host, const char *server_port, +int udprelay_init(const char *server_host, const char *server_port, #ifdef UDPRELAY_LOCAL const char *remote_host, const char *remote_port, #endif diff --git a/src/udprelay.h b/src/udprelay.h index 743bcb96..fdb79f9e 100644 --- a/src/udprelay.h +++ b/src/udprelay.h @@ -72,4 +72,13 @@ static void close_and_free_server(EV_P_ struct server_ctx *server_ctx); struct remote_ctx* new_remote_ctx(int fd); struct server_ctx* new_server(int fd); +int udprelay(const char *server_host, const char *server_port, +#ifdef UDPRELAY_LOCAL + const char *remote_host, const char *remote_port, +#endif +#ifdef UDPRELAY_REMOTE + asyncns_t *asyncns, +#endif + int method, const char *interface); + #endif // _UDPRELAY_H diff --git a/src/utils.c b/src/utils.c index 751439c8..dfbe2c8c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -77,25 +77,27 @@ void usage() printf(" maintained by Max Lv \n\n"); printf(" usage:\n\n"); printf(" ss-[local|redir|server]\n"); - printf(" -s -p \n"); - printf(" -l -k \n"); - printf(" [-m ] [-f ]\n"); - printf(" [-t ] [-c ]\n"); - printf(" [-i ] [-b ]\n"); + printf(" -s host name or ip address of your remote server\n"); + printf(" -p port number of your remote server\n"); + printf(" -l > port number of your local server\n"); + printf(" -k password of your remote server\n"); printf("\n"); - printf(" options:\n\n"); - printf(" encrypt_method: table, rc4,\n"); - printf(" aes-128-cfb, aes-192-cfb, aes-256-cfb,\n"); - printf(" bf-cfb, camellia-128-cfb, camellia-192-cfb,\n"); - printf(" camellia-256-cfb, cast5-cfb, des-cfb,\n"); - printf(" idea-cfb, rc2-cfb and seed-cfb\n"); - printf(" pid_file: valid path to the pid file\n"); - printf(" timeout: socket timeout in senconds\n"); - printf(" config_file: json format config file\n"); - printf(" interface: specific network interface to bind,\n"); - printf(" only avaliable in local and server modes\n"); - printf(" local_address: specific local address to bind,\n"); - printf(" only avaliable in local and redir modes\n"); + printf(" [-m ] encrypt method, supporting table, rc4,\n"); + printf(" aes-128-cfb, aes-192-cfb, aes-256-cfb,\n"); + printf(" bf-cfb, camellia-128-cfb, camellia-192-cfb,\n"); + printf(" camellia-256-cfb, cast5-cfb, des-cfb,\n"); + printf(" idea-cfb, rc2-cfb and seed-cfb\n"); + printf(" [-f ] valid path to the pid file\n"); + printf(" [-t ] socket timeout in seconds\n"); + printf(" [-c ] json format config file\n"); + printf("\n"); + printf(" [-i ] specific network interface to bind,\n"); + printf(" only avaliable in local and server modes\n"); + printf(" [-b ] specific local address to bind,\n"); + printf(" only avaliable in local and redir modes\n"); + printf(" [-u] udprelay mode to supprot udp traffic\n"); + printf(" only avaliable in local and redir modes\n"); + printf(" [-v] verbose mode, debug output in console\n"); printf("\n"); }