summaryrefslogtreecommitdiff
path: root/netcon/Intercept.c
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2016-01-12 12:25:19 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2016-01-12 12:25:19 -0800
commitd03a63e0557e51d0c9bf0d95166968977d55e7d6 (patch)
tree264901b6bafe8bb8c20e40f9192642aee00c908a /netcon/Intercept.c
parent93ab8d46b94060e6327610052cf8fc750d87b81e (diff)
parente2ae9165c6fea5c1099428da7147a42068c0ce1a (diff)
downloadinfinitytier-d03a63e0557e51d0c9bf0d95166968977d55e7d6.tar.gz
infinitytier-d03a63e0557e51d0c9bf0d95166968977d55e7d6.zip
Merge branch 'edge' of http://10.6.6.2/zerotier/ZeroTierOne into edge
Diffstat (limited to 'netcon/Intercept.c')
-rw-r--r--netcon/Intercept.c75
1 files changed, 55 insertions, 20 deletions
diff --git a/netcon/Intercept.c b/netcon/Intercept.c
index 5b0b3480..ed7e3cb8 100644
--- a/netcon/Intercept.c
+++ b/netcon/Intercept.c
@@ -62,7 +62,7 @@
------------------- Intercept<--->Service Comm mechanisms ----------------------
------------------------------------------------------------------------------*/
-static char *network_pathname = (char *)0;
+static char *netpath = (char *)0;
/* Check whether the socket is mapped to the service or not. We
need to know if this is a regular AF_LOCAL socket or an end of a socketpair
@@ -79,7 +79,7 @@ static int connected_to_service(int sockfd)
getpeername(sockfd, (struct sockaddr*)&addr, &len);
if (addr.ss_family == AF_LOCAL || addr.ss_family == AF_LOCAL) {
addr_un = (struct sockaddr_un*)&addr;
- if(strcmp(addr_un->sun_path, network_pathname) == 0) {
+ if(strcmp(addr_un->sun_path, netpath) == 0) {
dwr(MSG_DEBUG_EXTRA,"connected_to_service(): Yes, %s\n", addr_un->sun_path);
return 1;
}
@@ -115,12 +115,11 @@ static int set_up_intercept()
realsyscall = dlsym(RTLD_NEXT, "syscall");
realgetsockname = dlsym(RTLD_NEXT, "getsockname");
}
-
- if (!network_pathname) {
- network_pathname = getenv("ZT_NC_NETWORK");
- if (!network_pathname)
+ if (!netpath) {
+ netpath = getenv("ZT_NC_NETWORK");
+ if (!netpath)
return 0;
- dwr(MSG_DEBUG,"Connecting to service at: %s\n", network_pathname);
+ dwr(MSG_DEBUG,"Connecting to service at: %s\n", netpath);
/* Hook/intercept Posix net API symbols */
rpc_mutex_init();
}
@@ -194,6 +193,14 @@ int socket(SOCKET_SIG)
errno = EINVAL;
return -1;
}
+
+/*
+ if(flags & SOCK_DGRAM) {
+ fprintf(stderr, "socket(): DGRAM, passing through\n");
+ return realsocket(socket_family, socket_type, protocol);
+ }
+*/
+
socket_type &= SOCK_TYPE_MASK;
/* Check protocol is in range */
if (socket_family < 0 || socket_family >= NPROTO){
@@ -219,7 +226,7 @@ int socket(SOCKET_SIG)
rpc_st.protocol = protocol;
rpc_st.__tid = syscall(SYS_gettid);
/* -1 is passed since we we're generating the new socket in this call */
- return rpc_send_command(RPC_SOCKET, -1, &rpc_st, sizeof(struct socket_st));
+ return rpc_send_command(netpath, RPC_SOCKET, -1, &rpc_st, sizeof(struct socket_st));
}
/*------------------------------------------------------------------------------
@@ -233,9 +240,42 @@ int connect(CONNECT_SIG)
if (!set_up_intercept())
return realconnect(__fd, __addr, __len);
- dwr(MSG_DEBUG,"connect(%d):\n", __fd);
+/*
+ int opt;
+ socklen_t opt_len;
+ realgetsockopt(__fd, SOL_SOCKET, SO_TYPE, (void *) &opt, &opt_len);
+
+ if(opt & SOCK_DGRAM)
+ {
+ fprintf(stderr, "connect(): DGRAM, passing through.\n");
+ return realconnect(__fd, __addr, __len);
+ }
+*/
+
struct sockaddr_in *connaddr;
- connaddr = (struct sockaddr_in *) __addr;
+ connaddr = (struct sockaddr_in *)__addr;
+
+ if(__addr->sa_family == AF_LOCAL || __addr->sa_family == AF_UNIX) {
+ struct sockaddr_storage storage;
+ memcpy(&storage, __addr, __len);
+ struct sockaddr_un *s_un = (struct sockaddr_un*)&storage;
+ fprintf(stderr, "connect(): address = %s\n", s_un->sun_path);
+ }
+
+ int port = connaddr->sin_port;
+ int ip = connaddr->sin_addr.s_addr;
+ unsigned char d[4];
+ d[0] = ip & 0xFF;
+ d[1] = (ip >> 8) & 0xFF;
+ d[2] = (ip >> 16) & 0xFF;
+ d[3] = (ip >> 24) & 0xFF;
+ dwr(MSG_DEBUG,"connect(): %d.%d.%d.%d: %d\n", d[0],d[1],d[2],d[3], ntohs(port));
+
+
+ if (!set_up_intercept())
+ return realconnect(__fd, __addr, __len);
+
+ dwr(MSG_DEBUG,"connect(%d):\n", __fd);
/* Check that this is a valid fd */
if(fcntl(__fd, F_GETFD) < 0) {
errno = EBADF;
@@ -261,8 +301,7 @@ int connect(CONNECT_SIG)
|| connaddr->sin_family == PF_NETLINK
|| connaddr->sin_family == AF_NETLINK
|| connaddr->sin_family == AF_UNIX)) {
- int err = realconnect(__fd, __addr, __len);
- return err;
+ return realconnect(__fd, __addr, __len);
}
/* Assemble and send RPC */
struct connect_st rpc_st;
@@ -270,7 +309,7 @@ int connect(CONNECT_SIG)
rpc_st.__fd = __fd;
memcpy(&rpc_st.__addr, __addr, sizeof(struct sockaddr_storage));
memcpy(&rpc_st.__len, &__len, sizeof(socklen_t));
- return rpc_send_command(RPC_CONNECT, __fd, &rpc_st, sizeof(struct connect_st));
+ return rpc_send_command(netpath, RPC_CONNECT, __fd, &rpc_st, sizeof(struct connect_st));
}
/*------------------------------------------------------------------------------
@@ -325,7 +364,7 @@ int bind(BIND_SIG)
rpc_st.__tid = syscall(SYS_gettid);
memcpy(&rpc_st.addr, addr, sizeof(struct sockaddr_storage));
memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
- return rpc_send_command(RPC_BIND, sockfd, &rpc_st, sizeof(struct bind_st));
+ return rpc_send_command(netpath, RPC_BIND, sockfd, &rpc_st, sizeof(struct bind_st));
}
/*------------------------------------------------------------------------------
@@ -398,10 +437,6 @@ int accept(ACCEPT_SIG)
if(addr)
addr->sa_family = AF_INET;
- /* The following line is required for libuv/nodejs to accept connections properly,
- however, this has the side effect of causing certain webservers to max out the CPU
- in an accept loop */
- //fcntl(sockfd, F_SETFL, SOCK_NONBLOCK);
int new_fd = get_new_fd(sockfd);
if(new_fd > 0) {
errno = ERR_OK;
@@ -452,7 +487,7 @@ int listen(LISTEN_SIG)
rpc_st.sockfd = sockfd;
rpc_st.backlog = backlog;
rpc_st.__tid = syscall(SYS_gettid);
- return rpc_send_command(RPC_LISTEN, sockfd, &rpc_st, sizeof(struct listen_st));
+ return rpc_send_command(netpath, RPC_LISTEN, sockfd, &rpc_st, sizeof(struct listen_st));
}
/*------------------------------------------------------------------------------
@@ -490,7 +525,7 @@ int getsockname(GETSOCKNAME_SIG)
rpc_st.sockfd = sockfd;
memcpy(&rpc_st.addr, addr, *addrlen);
memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
- int rpcfd = rpc_send_command(RPC_GETSOCKNAME, sockfd, &rpc_st, sizeof(struct getsockname_st));
+ int rpcfd = rpc_send_command(netpath, RPC_GETSOCKNAME, sockfd, &rpc_st, sizeof(struct getsockname_st));
/* read address info from service */
char addrbuf[sizeof(struct sockaddr_storage)];
memset(&addrbuf, 0, sizeof(struct sockaddr_storage));