mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-28 11:43:50 +00:00
support bind-to-addr
This commit is contained in:
+10
-4
@@ -54,7 +54,7 @@ int setinterface(int socket_fd, const char* interface_name)
|
||||
}
|
||||
#endif
|
||||
|
||||
int create_and_bind(const char *port) {
|
||||
int create_and_bind(const char *addr, const char *port) {
|
||||
struct addrinfo hints;
|
||||
struct addrinfo *result, *rp;
|
||||
int s, listen_sock;
|
||||
@@ -63,7 +63,7 @@ int create_and_bind(const char *port) {
|
||||
hints.ai_family = AF_UNSPEC; /* Return IPv4 and IPv6 choices */
|
||||
hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */
|
||||
|
||||
s = getaddrinfo("0.0.0.0", port, &hints, &result);
|
||||
s = getaddrinfo(addr, port, &hints, &result);
|
||||
if (s != 0) {
|
||||
LOGD("getaddrinfo: %s", gai_strerror(s));
|
||||
return -1;
|
||||
@@ -601,6 +601,7 @@ int main (int argc, char **argv) {
|
||||
int i, c;
|
||||
int pid_flags = 0;
|
||||
char *local_port = NULL;
|
||||
char *local_addr = NULL;
|
||||
char *password = NULL;
|
||||
char *timeout = NULL;
|
||||
char *method = NULL;
|
||||
@@ -614,7 +615,7 @@ int main (int argc, char **argv) {
|
||||
|
||||
opterr = 0;
|
||||
|
||||
while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:i:c:")) != -1) {
|
||||
while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:i:c:b:")) != -1) {
|
||||
switch (c) {
|
||||
case 's':
|
||||
remote_host[remote_num++] = optarg;
|
||||
@@ -644,6 +645,9 @@ int main (int argc, char **argv) {
|
||||
case 'i':
|
||||
iface = optarg;
|
||||
break;
|
||||
case 'b':
|
||||
local_addr = optarg;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -675,6 +679,8 @@ int main (int argc, char **argv) {
|
||||
|
||||
if (timeout == NULL) timeout = "10";
|
||||
|
||||
if (local_addr == NULL) local_addr = "0.0.0.0";
|
||||
|
||||
if (pid_flags) {
|
||||
demonize(pid_path);
|
||||
}
|
||||
@@ -688,7 +694,7 @@ int main (int argc, char **argv) {
|
||||
|
||||
// Setup socket
|
||||
int listenfd;
|
||||
listenfd = create_and_bind(local_port);
|
||||
listenfd = create_and_bind(local_addr, local_port);
|
||||
if (listenfd < 0) {
|
||||
FATAL("bind() error..");
|
||||
}
|
||||
|
||||
+10
-4
@@ -49,7 +49,7 @@ int setnonblocking(int fd) {
|
||||
return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
|
||||
}
|
||||
|
||||
int create_and_bind(const char *port) {
|
||||
int create_and_bind(const char *addr, const char *port) {
|
||||
struct addrinfo hints;
|
||||
struct addrinfo *result, *rp;
|
||||
int s, listen_sock;
|
||||
@@ -58,7 +58,7 @@ int create_and_bind(const char *port) {
|
||||
hints.ai_family = AF_UNSPEC; /* Return IPv4 and IPv6 choices */
|
||||
hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */
|
||||
|
||||
s = getaddrinfo("0.0.0.0", port, &hints, &result);
|
||||
s = getaddrinfo(addr, port, &hints, &result);
|
||||
if (s != 0) {
|
||||
LOGD("getaddrinfo: %s", gai_strerror(s));
|
||||
return -1;
|
||||
@@ -533,6 +533,7 @@ int main (int argc, char **argv) {
|
||||
int i, c;
|
||||
int pid_flags = 0;
|
||||
char *local_port = NULL;
|
||||
char *local_addr = NULL;
|
||||
char *password = NULL;
|
||||
char *timeout = NULL;
|
||||
char *method = NULL;
|
||||
@@ -545,7 +546,7 @@ int main (int argc, char **argv) {
|
||||
|
||||
opterr = 0;
|
||||
|
||||
while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:c:")) != -1) {
|
||||
while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:c:b:")) != -1) {
|
||||
switch (c) {
|
||||
case 's':
|
||||
remote_host[remote_num++] = optarg;
|
||||
@@ -572,6 +573,9 @@ int main (int argc, char **argv) {
|
||||
case 'c':
|
||||
conf_path = optarg;
|
||||
break;
|
||||
case 'b':
|
||||
local_addr = optarg;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -603,6 +607,8 @@ int main (int argc, char **argv) {
|
||||
|
||||
if (timeout == NULL) timeout = "10";
|
||||
|
||||
if (local_addr == NULL) local_addr = "0.0.0.0";
|
||||
|
||||
if (pid_flags) {
|
||||
demonize(pid_path);
|
||||
}
|
||||
@@ -616,7 +622,7 @@ int main (int argc, char **argv) {
|
||||
|
||||
// Setup socket
|
||||
int listenfd;
|
||||
listenfd = create_and_bind(local_port);
|
||||
listenfd = create_and_bind(local_addr, local_port);
|
||||
if (listenfd < 0) {
|
||||
FATAL("bind() error..");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user