|
|
|
|
@ -327,6 +327,7 @@ void set_up_intercept()
|
|
|
|
|
------------------------- ioctl(), fcntl(), setsockopt()------------------------ |
|
|
|
|
------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
char *cmd_to_str(int cmd) |
|
|
|
|
{ |
|
|
|
|
switch(cmd) |
|
|
|
|
@ -352,7 +353,8 @@ char *cmd_to_str(int cmd)
|
|
|
|
|
} |
|
|
|
|
return "?"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
/*
|
|
|
|
|
void arg_to_str(int arg) |
|
|
|
|
{ |
|
|
|
|
if(arg & O_RDONLY) dwr("O_RDONLY "); |
|
|
|
|
@ -370,7 +372,8 @@ void arg_to_str(int arg)
|
|
|
|
|
if(arg & O_DSYNC) dwr("O_DSYNC "); |
|
|
|
|
if(arg & O_SYNC) dwr("O_SYNC "); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
/*
|
|
|
|
|
char* level_to_str(int level) |
|
|
|
|
{ |
|
|
|
|
switch(level) |
|
|
|
|
@ -384,7 +387,8 @@ char* level_to_str(int level)
|
|
|
|
|
} |
|
|
|
|
return "?"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
/*
|
|
|
|
|
char* option_name_to_str(int opt) |
|
|
|
|
{ |
|
|
|
|
if(opt == SO_DEBUG) return "SO_DEBUG"; |
|
|
|
|
@ -403,6 +407,62 @@ char* option_name_to_str(int opt)
|
|
|
|
|
if(opt == SO_SNDTIMEO)return "SO_SNDTIMEO"; |
|
|
|
|
return "?"; |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
---------------------------------- shutdown() ---------------------------------- |
|
|
|
|
------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
void shutdown_arg_to_str(int arg) |
|
|
|
|
{ |
|
|
|
|
if(arg & O_RDONLY) dwr("O_RDONLY "); |
|
|
|
|
if(arg & O_WRONLY) dwr("O_WRONLY "); |
|
|
|
|
if(arg & O_RDWR) dwr("O_RDWR "); |
|
|
|
|
if(arg & O_CREAT) dwr("O_CREAT "); |
|
|
|
|
if(arg & O_EXCL) dwr("O_EXCL "); |
|
|
|
|
if(arg & O_NOCTTY) dwr("O_NOCTTY "); |
|
|
|
|
if(arg & O_TRUNC) dwr("O_TRUNC "); |
|
|
|
|
if(arg & O_APPEND) dwr("O_APPEND "); |
|
|
|
|
if(arg & O_ASYNC) dwr("O_ASYNC "); |
|
|
|
|
if(arg & O_DIRECT) dwr("O_DIRECT "); |
|
|
|
|
if(arg & O_NOATIME) dwr("O_NOATIME "); |
|
|
|
|
if(arg & O_NONBLOCK) dwr("O_NONBLOCK "); |
|
|
|
|
if(arg & O_DSYNC) dwr("O_DSYNC "); |
|
|
|
|
if(arg & O_SYNC) dwr("O_SYNC "); |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
void sock_type_to_str(int arg) |
|
|
|
|
{ |
|
|
|
|
if(arg == SOCK_STREAM) printf("SOCK_STREAM "); |
|
|
|
|
if(arg == SOCK_DGRAM) printf("SOCK_DGRAM "); |
|
|
|
|
if(arg == SOCK_SEQPACKET) printf("SOCK_SEQPACKET "); |
|
|
|
|
if(arg == SOCK_RAW) printf("SOCK_RAW "); |
|
|
|
|
if(arg == SOCK_RDM) printf("SOCK_RDM "); |
|
|
|
|
if(arg == SOCK_PACKET) printf("SOCK_PACKET "); |
|
|
|
|
if(arg & SOCK_NONBLOCK) printf("| SOCK_NONBLOCK "); |
|
|
|
|
if(arg & SOCK_CLOEXEC) printf("| SOCK_CLOEXEC "); |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
void sock_domain_to_str(int domain) |
|
|
|
|
{ |
|
|
|
|
if(domain == AF_UNIX) printf("AF_UNIX "); |
|
|
|
|
if(domain == AF_LOCAL) printf("AF_LOCAL "); |
|
|
|
|
if(domain == AF_INET) printf("AF_INET "); |
|
|
|
|
if(domain == AF_INET6) printf("AF_INET6 "); |
|
|
|
|
if(domain == AF_IPX) printf("AF_IPX "); |
|
|
|
|
if(domain == AF_NETLINK) printf("AF_NETLINK "); |
|
|
|
|
if(domain == AF_X25) printf("AF_X25 "); |
|
|
|
|
if(domain == AF_AX25) printf("AF_AX25 "); |
|
|
|
|
if(domain == AF_ATMPVC) printf("AF_ATMPVC "); |
|
|
|
|
if(domain == AF_APPLETALK) printf("AF_APPLETALK "); |
|
|
|
|
if(domain == AF_PACKET) printf("AF_PACKET "); |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
--------------------------------- setsockopt() --------------------------------- |
|
|
|
|
@ -458,59 +518,10 @@ int getsockopt(GETSOCKOPT_SIG)
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
---------------------------------- shutdown() ---------------------------------- |
|
|
|
|
------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
void shutdown_arg_to_str(int arg) |
|
|
|
|
{ |
|
|
|
|
if(arg & O_RDONLY) dwr("O_RDONLY "); |
|
|
|
|
if(arg & O_WRONLY) dwr("O_WRONLY "); |
|
|
|
|
if(arg & O_RDWR) dwr("O_RDWR "); |
|
|
|
|
if(arg & O_CREAT) dwr("O_CREAT "); |
|
|
|
|
if(arg & O_EXCL) dwr("O_EXCL "); |
|
|
|
|
if(arg & O_NOCTTY) dwr("O_NOCTTY "); |
|
|
|
|
if(arg & O_TRUNC) dwr("O_TRUNC "); |
|
|
|
|
if(arg & O_APPEND) dwr("O_APPEND "); |
|
|
|
|
if(arg & O_ASYNC) dwr("O_ASYNC "); |
|
|
|
|
if(arg & O_DIRECT) dwr("O_DIRECT "); |
|
|
|
|
if(arg & O_NOATIME) dwr("O_NOATIME "); |
|
|
|
|
if(arg & O_NONBLOCK) dwr("O_NONBLOCK "); |
|
|
|
|
if(arg & O_DSYNC) dwr("O_DSYNC "); |
|
|
|
|
if(arg & O_SYNC) dwr("O_SYNC "); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
|
|
|
----------------------------------- socket() ----------------------------------- |
|
|
|
|
------------------------------------------------------------------------------*/ |
|
|
|
|
|
|
|
|
|
void sock_type_to_str(int arg) |
|
|
|
|
{ |
|
|
|
|
if(arg == SOCK_STREAM) printf("SOCK_STREAM "); |
|
|
|
|
if(arg == SOCK_DGRAM) printf("SOCK_DGRAM "); |
|
|
|
|
if(arg == SOCK_SEQPACKET) printf("SOCK_SEQPACKET "); |
|
|
|
|
if(arg == SOCK_RAW) printf("SOCK_RAW "); |
|
|
|
|
if(arg == SOCK_RDM) printf("SOCK_RDM "); |
|
|
|
|
if(arg == SOCK_PACKET) printf("SOCK_PACKET "); |
|
|
|
|
if(arg & SOCK_NONBLOCK) printf("| SOCK_NONBLOCK "); |
|
|
|
|
if(arg & SOCK_CLOEXEC) printf("| SOCK_CLOEXEC "); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void sock_domain_to_str(int domain) |
|
|
|
|
{ |
|
|
|
|
if(domain == AF_UNIX) printf("AF_UNIX "); |
|
|
|
|
if(domain == AF_LOCAL) printf("AF_LOCAL "); |
|
|
|
|
if(domain == AF_INET) printf("AF_INET "); |
|
|
|
|
if(domain == AF_INET6) printf("AF_INET6 "); |
|
|
|
|
if(domain == AF_IPX) printf("AF_IPX "); |
|
|
|
|
if(domain == AF_NETLINK) printf("AF_NETLINK "); |
|
|
|
|
if(domain == AF_X25) printf("AF_X25 "); |
|
|
|
|
if(domain == AF_AX25) printf("AF_AX25 "); |
|
|
|
|
if(domain == AF_ATMPVC) printf("AF_ATMPVC "); |
|
|
|
|
if(domain == AF_APPLETALK) printf("AF_APPLETALK "); |
|
|
|
|
if(domain == AF_PACKET) printf("AF_PACKET "); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* int socket_family, int socket_type, int protocol
|
|
|
|
|
socket() intercept function */ |
|
|
|
|
|
|
|
|
|
@ -520,14 +531,20 @@ int socket(SOCKET_SIG)
|
|
|
|
|
#ifdef CHECKS |
|
|
|
|
/* Check that type makes sense */ |
|
|
|
|
int flags = socket_type & ~SOCK_TYPE_MASK; |
|
|
|
|
if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) |
|
|
|
|
return -EINVAL; |
|
|
|
|
if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) { |
|
|
|
|
errno = EINVAL; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
socket_type &= SOCK_TYPE_MASK; |
|
|
|
|
/* Check protocol is in range */ |
|
|
|
|
if (socket_family < 0 || socket_family >= NPROTO) |
|
|
|
|
return -EAFNOSUPPORT; |
|
|
|
|
if (socket_type < 0 || socket_type >= SOCK_MAX) |
|
|
|
|
return -EINVAL; |
|
|
|
|
if (socket_family < 0 || socket_family >= NPROTO){ |
|
|
|
|
errno = EAFNOSUPPORT; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
if (socket_type < 0 || socket_type >= SOCK_MAX) { |
|
|
|
|
errno = EINVAL; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
/* Check that we haven't hit the soft-limit file descriptors allowed */ |
|
|
|
|
/* FIXME: Find number of open fds
|
|
|
|
|
struct rlimit rl; |
|
|
|
|
@ -565,12 +582,12 @@ int socket(SOCKET_SIG)
|
|
|
|
|
cmd[0] = RPC_SOCKET; |
|
|
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct socket_st)); |
|
|
|
|
pthread_mutex_lock(&lock); |
|
|
|
|
write(fdret_sock,cmd, BUF_SZ); |
|
|
|
|
send_command(fdret_sock, cmd); |
|
|
|
|
|
|
|
|
|
/* get new fd */ |
|
|
|
|
char gmybuf[16]; |
|
|
|
|
ssize_t size = sock_fd_read(fdret_sock, gmybuf, sizeof(gmybuf), &newfd); |
|
|
|
|
if(size > 0) |
|
|
|
|
char rbuf[16]; |
|
|
|
|
ssize_t sz = sock_fd_read(fdret_sock, rbuf, sizeof(rbuf), &newfd); |
|
|
|
|
if(sz > 0) |
|
|
|
|
{ |
|
|
|
|
/* send our local-fd number back to service so
|
|
|
|
|
it can complete its mapping table entry */ |
|
|
|
|
@ -780,8 +797,10 @@ int bind(BIND_SIG)
|
|
|
|
|
int accept4(ACCEPT4_SIG) |
|
|
|
|
{ |
|
|
|
|
#ifdef CHECKS |
|
|
|
|
if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) |
|
|
|
|
return -EINVAL; |
|
|
|
|
if (flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK)) { |
|
|
|
|
errno = EINVAL; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
#ifdef DUMMY |
|
|
|
|
dwr("accept4(%d)\n", sockfd); |
|
|
|
|
@ -843,11 +862,12 @@ int accept(ACCEPT_SIG)
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
char gmybuf[16], c[1]; |
|
|
|
|
int new_conn_socket, n = read(sockfd, c, sizeof(c)); |
|
|
|
|
char rbuf[16], c[1]; |
|
|
|
|
int new_conn_socket; |
|
|
|
|
int n = read(sockfd, c, sizeof(c)); // Read signal byte
|
|
|
|
|
if(n > 0) |
|
|
|
|
{ |
|
|
|
|
ssize_t size = sock_fd_read(fdret_sock, gmybuf, sizeof(gmybuf), &new_conn_socket); |
|
|
|
|
ssize_t size = sock_fd_read(fdret_sock, rbuf, sizeof(rbuf), &new_conn_socket); |
|
|
|
|
if(size > 0) { |
|
|
|
|
/* Send our local-fd number back to service so it can complete its mapping table */ |
|
|
|
|
memset(cmd, '\0', BUF_SZ); |
|
|
|
|
@ -857,7 +877,7 @@ int accept(ACCEPT_SIG)
|
|
|
|
|
int n_write = write(fdret_sock, cmd, BUF_SZ); |
|
|
|
|
if(n_write < 0) { |
|
|
|
|
dwr("Error sending perceived FD to service.\n"); |
|
|
|
|
errno = ECONNABORTED; |
|
|
|
|
errno = ECONNABORTED; // FIXME: Closest match, service unreachable
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
pthread_mutex_unlock(&lock); |
|
|
|
|
@ -866,13 +886,13 @@ int accept(ACCEPT_SIG)
|
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
dwr("Error receiving new FD from service.\n"); |
|
|
|
|
errno = ECONNABORTED; |
|
|
|
|
errno = ECONNABORTED; // FIXME: Closest match, service unreachable
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
dwr("Error reading signal byte from service.\n"); |
|
|
|
|
//errno = EWOULDBLOCK;
|
|
|
|
|
errno = ECONNABORTED; |
|
|
|
|
errno = ECONNABORTED; // FIXME: Closest match, service unreachable
|
|
|
|
|
return -1; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|