mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-22 23:56:01 +00:00
Add option for binding to address #626
This commit is contained in:
-13
@@ -131,19 +131,6 @@ int setnonblocking(int fd)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef SET_INTERFACE
|
||||
int setinterface(int socket_fd, const char *interface_name)
|
||||
{
|
||||
struct ifreq interface;
|
||||
memset(&interface, 0, sizeof(interface));
|
||||
strncpy(interface.ifr_name, interface_name, IFNAMSIZ);
|
||||
int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,
|
||||
sizeof(struct ifreq));
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int create_and_bind(const char *addr, const char *port)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
@@ -39,6 +39,12 @@
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)
|
||||
#include <net/if.h>
|
||||
#include <sys/ioctl.h>
|
||||
#define SET_INTERFACE
|
||||
#endif
|
||||
|
||||
#include "netutils.h"
|
||||
#include "utils.h"
|
||||
|
||||
@@ -64,6 +70,36 @@ size_t get_sockaddr_len(struct sockaddr *addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef SET_INTERFACE
|
||||
int setinterface(int socket_fd, const char *interface_name)
|
||||
{
|
||||
struct ifreq interface;
|
||||
memset(&interface, 0, sizeof(interface));
|
||||
strncpy(interface.ifr_name, interface_name, IFNAMSIZ);
|
||||
int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,
|
||||
sizeof(struct ifreq));
|
||||
return res;
|
||||
}
|
||||
#endif
|
||||
|
||||
int bind_to_address(int socket_fd, const char *address)
|
||||
{
|
||||
if (address != NULL) {
|
||||
struct cork_ip ip;
|
||||
struct sockaddr_storage addr;
|
||||
if (cork_ip_init(&ip, address) != -1) {
|
||||
if (ip.version == 4) {
|
||||
dns_pton(AF_INET, address, &addr);
|
||||
return bind(socket_fd, (struct sockaddr_in *)&addr, sizeof(struct sockaddr_in));
|
||||
} else if (ip.version == 6) {
|
||||
dns_pton(AF_INET6, address, &addr);
|
||||
return bind(socket_fd, (struct sockaddr_in6 *)&addr, sizeof(struct sockaddr_in6));
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
ssize_t get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, int block)
|
||||
{
|
||||
struct cork_ip ip;
|
||||
|
||||
@@ -32,6 +32,12 @@ size_t get_sockaddr_len(struct sockaddr *addr);
|
||||
ssize_t get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, int block);
|
||||
int set_reuseport(int socket);
|
||||
|
||||
#ifdef SET_INTERFACE
|
||||
int setinterface(int socket_fd, const char *interface_name);
|
||||
#endif
|
||||
|
||||
int bind_to_address(int socket_fd, const char *address);
|
||||
|
||||
/**
|
||||
* Compare two sockaddrs. Imposes an ordering on the addresses.
|
||||
* Compares address and port.
|
||||
|
||||
+6
-14
@@ -121,6 +121,7 @@ static int nofile = 0;
|
||||
static int remote_conn = 0;
|
||||
static int server_conn = 0;
|
||||
|
||||
static char *bind_address = NULL;
|
||||
static char *server_port = NULL;
|
||||
static char *manager_address = NULL;
|
||||
uint64_t tx = 0;
|
||||
@@ -300,19 +301,6 @@ int setnonblocking(int fd)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef SET_INTERFACE
|
||||
int setinterface(int socket_fd, const char *interface_name)
|
||||
{
|
||||
struct ifreq interface;
|
||||
memset(&interface, 0, sizeof(interface));
|
||||
strncpy(interface.ifr_name, interface_name, IFNAMSIZ);
|
||||
int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,
|
||||
sizeof(struct ifreq));
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int create_and_bind(const char *host, const char *port)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
@@ -429,6 +417,7 @@ static remote_t *connect_to_remote(struct addrinfo *res,
|
||||
|
||||
// setup remote socks
|
||||
setnonblocking(sockfd);
|
||||
bind_to_address(sockfd, bind_address);
|
||||
#ifdef SET_INTERFACE
|
||||
if (iface) {
|
||||
if (setinterface(sockfd, iface) == -1)
|
||||
@@ -1329,7 +1318,7 @@ int main(int argc, char **argv)
|
||||
|
||||
USE_TTY();
|
||||
|
||||
while ((c = getopt_long(argc, argv, "f:s:p:l:k:t:m:c:i:d:a:n:huUvAw6",
|
||||
while ((c = getopt_long(argc, argv, "f:s:p:l:k:t:m:b:c:i:d:a:n:huUvAw6",
|
||||
long_options, &option_index)) != -1) {
|
||||
switch (c) {
|
||||
case 0:
|
||||
@@ -1351,6 +1340,9 @@ int main(int argc, char **argv)
|
||||
server_host[server_num++] = optarg;
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
bind_address = optarg;
|
||||
break;
|
||||
case 'p':
|
||||
server_port = optarg;
|
||||
break;
|
||||
|
||||
@@ -110,19 +110,6 @@ static int setnonblocking(int fd)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef SET_INTERFACE
|
||||
int setinterface(int socket_fd, const char *interface_name)
|
||||
{
|
||||
struct ifreq interface;
|
||||
memset(&interface, 0, sizeof(interface));
|
||||
strncpy(interface.ifr_name, interface_name, IFNAMSIZ);
|
||||
int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,
|
||||
sizeof(struct ifreq));
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int create_and_bind(const char *addr, const char *port)
|
||||
{
|
||||
struct addrinfo hints;
|
||||
|
||||
@@ -116,19 +116,6 @@ static int setnonblocking(int fd)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef SET_INTERFACE
|
||||
static int setinterface(int socket_fd, const char *interface_name)
|
||||
{
|
||||
struct ifreq interface;
|
||||
memset(&interface, 0, sizeof(interface));
|
||||
strncpy(interface.ifr_name, interface_name, IFNAMSIZ);
|
||||
int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,
|
||||
sizeof(struct ifreq));
|
||||
return res;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(MODULE_REMOTE) && defined(SO_BROADCAST)
|
||||
static int set_broadcast(int socket_fd)
|
||||
{
|
||||
|
||||
@@ -243,10 +243,8 @@ void usage()
|
||||
printf(
|
||||
" [-i <interface>] Network interface to bind.\n");
|
||||
#endif
|
||||
#ifndef MODULE_REMOTE
|
||||
printf(
|
||||
" [-b <local_address>] Local address to bind.\n");
|
||||
#endif
|
||||
printf("\n");
|
||||
printf(
|
||||
" [-u] Enable UDP relay,\n");
|
||||
|
||||
Reference in New Issue
Block a user