Browse Source

Add option for binding to address #626

pull/628/head
Max Lv 9 years ago
parent
commit
bb50fc22ca
7 changed files with 48 additions and 55 deletions
  1. 13
      src/local.c
  2. 36
      src/netutils.c
  3. 6
      src/netutils.h
  4. 20
      src/server.c
  5. 13
      src/tunnel.c
  6. 13
      src/udprelay.c
  7. 2
      src/utils.c

13
src/local.c

@ -131,19 +131,6 @@ int setnonblocking(int fd)
#endif #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) int create_and_bind(const char *addr, const char *port)
{ {
struct addrinfo hints; struct addrinfo hints;

36
src/netutils.c

@ -39,6 +39,12 @@
#include <unistd.h> #include <unistd.h>
#endif #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 "netutils.h"
#include "utils.h" #include "utils.h"
@ -64,6 +70,36 @@ size_t get_sockaddr_len(struct sockaddr *addr)
return 0; 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) ssize_t get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, int block)
{ {
struct cork_ip ip; struct cork_ip ip;

6
src/netutils.h

@ -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); ssize_t get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, int block);
int set_reuseport(int socket); 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. * Compare two sockaddrs. Imposes an ordering on the addresses.
* Compares address and port. * Compares address and port.

20
src/server.c

@ -121,6 +121,7 @@ static int nofile = 0;
static int remote_conn = 0; static int remote_conn = 0;
static int server_conn = 0; static int server_conn = 0;
static char *bind_address = NULL;
static char *server_port = NULL; static char *server_port = NULL;
static char *manager_address = NULL; static char *manager_address = NULL;
uint64_t tx = 0; uint64_t tx = 0;
@ -300,19 +301,6 @@ int setnonblocking(int fd)
#endif #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) int create_and_bind(const char *host, const char *port)
{ {
struct addrinfo hints; struct addrinfo hints;
@ -429,6 +417,7 @@ static remote_t *connect_to_remote(struct addrinfo *res,
// setup remote socks // setup remote socks
setnonblocking(sockfd); setnonblocking(sockfd);
bind_to_address(sockfd, bind_address);
#ifdef SET_INTERFACE #ifdef SET_INTERFACE
if (iface) { if (iface) {
if (setinterface(sockfd, iface) == -1) if (setinterface(sockfd, iface) == -1)
@ -1329,7 +1318,7 @@ int main(int argc, char **argv)
USE_TTY(); 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) { long_options, &option_index)) != -1) {
switch (c) { switch (c) {
case 0: case 0:
@ -1351,6 +1340,9 @@ int main(int argc, char **argv)
server_host[server_num++] = optarg; server_host[server_num++] = optarg;
} }
break; break;
case 'b':
bind_address = optarg;
break;
case 'p': case 'p':
server_port = optarg; server_port = optarg;
break; break;

13
src/tunnel.c

@ -110,19 +110,6 @@ static int setnonblocking(int fd)
#endif #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) int create_and_bind(const char *addr, const char *port)
{ {
struct addrinfo hints; struct addrinfo hints;

13
src/udprelay.c

@ -116,19 +116,6 @@ static int setnonblocking(int fd)
#endif #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) #if defined(MODULE_REMOTE) && defined(SO_BROADCAST)
static int set_broadcast(int socket_fd) static int set_broadcast(int socket_fd)
{ {

2
src/utils.c

@ -243,10 +243,8 @@ void usage()
printf( printf(
" [-i <interface>] Network interface to bind.\n"); " [-i <interface>] Network interface to bind.\n");
#endif #endif
#ifndef MODULE_REMOTE
printf( printf(
" [-b <local_address>] Local address to bind.\n"); " [-b <local_address>] Local address to bind.\n");
#endif
printf("\n"); printf("\n");
printf( printf(
" [-u] Enable UDP relay,\n"); " [-u] Enable UDP relay,\n");

Loading…
Cancel
Save