|
@@ -152,11 +152,51 @@ void checkpid()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
/*
|
|
/*
|
|
- * Sends an RPC command to the service
|
|
|
|
|
|
+ * Reads a return value from the service and sets errno (if applicable)
|
|
*/
|
|
*/
|
|
-int send_command(int rpc_fd, char *cmd)
|
|
|
|
|
|
+int get_retval()
|
|
|
|
+{
|
|
|
|
+ dwr(MSG_DEBUG,"get_retval()\n");
|
|
|
|
+ if(fdret_sock >= 0) {
|
|
|
|
+ int retval;
|
|
|
|
+ int sz = sizeof(char) + sizeof(retval) + sizeof(errno);
|
|
|
|
+ char retbuf[BUF_SZ];
|
|
|
|
+ memset(&retbuf, '\0', sz);
|
|
|
|
+ int n_read = read(fdret_sock, &retbuf, sz);
|
|
|
|
+ if(n_read > 0) {
|
|
|
|
+ memcpy(&retval, &retbuf[1], sizeof(retval));
|
|
|
|
+ memcpy(&errno, &retbuf[1+sizeof(retval)], sizeof(errno));
|
|
|
|
+ return retval;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ dwr(MSG_DEBUG,"unable to read return value\n");
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* Reads a new file descriptor from the service */
|
|
|
|
+int get_new_fd(int oversock)
|
|
|
|
+{
|
|
|
|
+ char buf[BUF_SZ];
|
|
|
|
+ int newfd;
|
|
|
|
+ ssize_t size = sock_fd_read(oversock, buf, sizeof(buf), &newfd);
|
|
|
|
+ if(size > 0){
|
|
|
|
+ dwr(MSG_DEBUG, "get_new_fd(): RX: fd = (%d) over (%d)\n", newfd, oversock);
|
|
|
|
+ return newfd;
|
|
|
|
+ }
|
|
|
|
+ dwr(MSG_ERROR, "get_new_fd(): ERROR: unable to read fd over (%d)\n", oversock);
|
|
|
|
+ return -1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+int send_cmd(int rpc_fd, char *cmd)
|
|
{
|
|
{
|
|
|
|
+ //dwr(MSG_DEBUG, "\n---send_cmd[start]\n");
|
|
|
|
+ pthread_mutex_lock(&lock);
|
|
char metabuf[BUF_SZ]; // portion of buffer which contains RPC metadata for debugging
|
|
char metabuf[BUF_SZ]; // portion of buffer which contains RPC metadata for debugging
|
|
#ifdef VERBOSE
|
|
#ifdef VERBOSE
|
|
/*
|
|
/*
|
|
@@ -183,51 +223,34 @@ int send_command(int rpc_fd, char *cmd)
|
|
#endif
|
|
#endif
|
|
/* Combine command flag+payload with RPC metadata */
|
|
/* Combine command flag+payload with RPC metadata */
|
|
memcpy(&metabuf[IDX_PAYLOAD], cmd, PAYLOAD_SZ);
|
|
memcpy(&metabuf[IDX_PAYLOAD], cmd, PAYLOAD_SZ);
|
|
|
|
+ usleep(100000);
|
|
int n_write = write(rpc_fd, &metabuf, BUF_SZ);
|
|
int n_write = write(rpc_fd, &metabuf, BUF_SZ);
|
|
if(n_write < 0){
|
|
if(n_write < 0){
|
|
dwr(MSG_DEBUG,"Error writing command to service (CMD = %d)\n", cmd[0]);
|
|
dwr(MSG_DEBUG,"Error writing command to service (CMD = %d)\n", cmd[0]);
|
|
errno = 0;
|
|
errno = 0;
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
- return 0;
|
|
|
|
-}
|
|
|
|
|
|
|
|
-/*
|
|
|
|
- * Reads a return value from the service and sets errno (if applicable)
|
|
|
|
- */
|
|
|
|
-int get_retval()
|
|
|
|
-{
|
|
|
|
- dwr(MSG_DEBUG,"get_retval()\n");
|
|
|
|
- if(fdret_sock >= 0) {
|
|
|
|
- int retval;
|
|
|
|
- int sz = sizeof(char) + sizeof(retval) + sizeof(errno);
|
|
|
|
- char retbuf[BUF_SZ];
|
|
|
|
- memset(&retbuf, '\0', sz);
|
|
|
|
- int n_read = read(fdret_sock, &retbuf, sz);
|
|
|
|
- if(n_read > 0) {
|
|
|
|
- memcpy(&retval, &retbuf[1], sizeof(retval));
|
|
|
|
- memcpy(&errno, &retbuf[1+sizeof(retval)], sizeof(errno));
|
|
|
|
- return retval;
|
|
|
|
- }
|
|
|
|
|
|
+ int ret = ERR_OK;
|
|
|
|
+
|
|
|
|
+ if(cmd[0]==RPC_SOCKET) {
|
|
|
|
+ dwr(MSG_DEBUG," waiting on get_new_fd()...\n");
|
|
|
|
+ ret = get_new_fd(fdret_sock);
|
|
}
|
|
}
|
|
- dwr(MSG_DEBUG,"unable to read return value\n");
|
|
|
|
- return -1;
|
|
|
|
|
|
+ if(cmd[0]==RPC_MAP || cmd[0]==RPC_CONNECT || cmd[0]==RPC_BIND) {
|
|
|
|
+ dwr(MSG_DEBUG," waiting on get_retval()...\n");
|
|
|
|
+ ret = get_retval();
|
|
|
|
+ }
|
|
|
|
+ if(cmd[0]==RPC_LISTEN || cmd[0]==RPC_GETSOCKNAME) {
|
|
|
|
+ dwr(MSG_DEBUG," waiting on get_retval()...\n");
|
|
|
|
+ /* Do Nothing */
|
|
|
|
+ }
|
|
|
|
+ pthread_mutex_unlock(&lock);
|
|
|
|
+ //dwr(MSG_DEBUG, "---send_cmd[end]\n\n");
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-/* Reads a new file descriptor from the service */
|
|
|
|
-int get_new_fd(int oversock)
|
|
|
|
-{
|
|
|
|
- char buf[BUF_SZ];
|
|
|
|
- int newfd;
|
|
|
|
- ssize_t size = sock_fd_read(oversock, buf, sizeof(buf), &newfd);
|
|
|
|
|
|
|
|
- if(size > 0){
|
|
|
|
- dwr(MSG_DEBUG, "get_new_fd(): RX: fd = (%d) over (%d)\n", newfd, oversock);
|
|
|
|
- return newfd;
|
|
|
|
- }
|
|
|
|
- dwr(MSG_ERROR, "get_new_fd(): ERROR: unable to read fd over (%d)\n", oversock);
|
|
|
|
- return -1;
|
|
|
|
-}
|
|
|
|
|
|
|
|
/* Check whether the socket is mapped to the service or not. We
|
|
/* 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
|
|
need to know if this is a regular AF_LOCAL socket or an end of a socketpair
|
|
@@ -493,11 +516,9 @@ int socket(SOCKET_SIG)
|
|
memset(cmd, '\0', BUF_SZ);
|
|
memset(cmd, '\0', BUF_SZ);
|
|
cmd[0] = RPC_SOCKET;
|
|
cmd[0] = RPC_SOCKET;
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct socket_st));
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct socket_st));
|
|
- pthread_mutex_lock(&lock);
|
|
|
|
- send_command(fdret_sock, cmd);
|
|
|
|
|
|
|
|
- /* get new fd */
|
|
|
|
- newfd = get_new_fd(fdret_sock);
|
|
|
|
|
|
+ /* send command and get new fd */
|
|
|
|
+ newfd = send_cmd(fdret_sock, cmd);
|
|
if(newfd > 0)
|
|
if(newfd > 0)
|
|
{
|
|
{
|
|
dwr(MSG_DEBUG,"sending fd = %d to Service over (%d)\n", newfd, fdret_sock);
|
|
dwr(MSG_DEBUG,"sending fd = %d to Service over (%d)\n", newfd, fdret_sock);
|
|
@@ -506,29 +527,24 @@ int socket(SOCKET_SIG)
|
|
memset(cmd, '\0', BUF_SZ);
|
|
memset(cmd, '\0', BUF_SZ);
|
|
cmd[0] = RPC_MAP;
|
|
cmd[0] = RPC_MAP;
|
|
memcpy(&cmd[1], &newfd, sizeof(newfd));
|
|
memcpy(&cmd[1], &newfd, sizeof(newfd));
|
|
-
|
|
|
|
- if(newfd > -1) {
|
|
|
|
- send_command(fdret_sock, cmd);
|
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
|
- errno = ERR_OK; /* OK */
|
|
|
|
- handle_error("socket", "", newfd);
|
|
|
|
- return newfd;
|
|
|
|
|
|
+ /* send fd mapping and get confirmation */
|
|
|
|
+ dwr(MSG_DEBUG, "pre-send_cmd\n");
|
|
|
|
+ err = send_cmd(fdret_sock, cmd);
|
|
|
|
+ dwr(MSG_DEBUG, "post-send_cmd\n");
|
|
|
|
+
|
|
|
|
+ if(err > -1) {
|
|
|
|
+ errno = ERR_OK;
|
|
|
|
+ dwr(MSG_DEBUG, "RXd fd confirmation. Mapped!\n");
|
|
|
|
+ return newfd; /* Mapping complete, everything is OK */
|
|
}
|
|
}
|
|
- else { /* Try to read retval+errno since we RXed a bad fd */
|
|
|
|
- dwr(MSG_DEBUG,"Error, service sent bad fd.\n");
|
|
|
|
- err = get_retval();
|
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
|
- handle_error("socket", "", -1);
|
|
|
|
- return err;
|
|
|
|
|
|
+ else{
|
|
|
|
+ dwr(MSG_DEBUG,"Error, service sent bad fd.\n");
|
|
|
|
+ return err; /* Mapping failed */
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
- dwr(MSG_DEBUG,"Error while receiving new FD.\n");
|
|
|
|
- err = get_retval();
|
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
|
- handle_error("socket", "", -1);
|
|
|
|
- return err;
|
|
|
|
|
|
+ dwr(MSG_DEBUG,"Error while receiving new fd.\n");
|
|
|
|
+ return newfd;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -603,18 +619,8 @@ int connect(CONNECT_SIG)
|
|
memcpy(&rpc_st.__len, &__len, sizeof(socklen_t));
|
|
memcpy(&rpc_st.__len, &__len, sizeof(socklen_t));
|
|
cmd[0] = RPC_CONNECT;
|
|
cmd[0] = RPC_CONNECT;
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct connect_st));
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct connect_st));
|
|
- pthread_mutex_lock(&lock);
|
|
|
|
- send_command(fdret_sock, cmd);
|
|
|
|
- /*
|
|
|
|
- if(sock_type && O_NONBLOCK) {
|
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
|
- return EINPROGRESS;
|
|
|
|
- }
|
|
|
|
- */
|
|
|
|
- err = get_retval();
|
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
|
- /* handle_error("connect", "", err); */
|
|
|
|
- return err;
|
|
|
|
|
|
+
|
|
|
|
+ return send_cmd(fdret_sock, cmd);
|
|
}
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
/*------------------------------------------------------------------------------
|
|
@@ -689,14 +695,7 @@ int bind(BIND_SIG)
|
|
memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
|
|
memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
|
|
cmd[0]=RPC_BIND;
|
|
cmd[0]=RPC_BIND;
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct bind_st));
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct bind_st));
|
|
- pthread_mutex_lock(&lock);
|
|
|
|
- send_command(fdret_sock, cmd);
|
|
|
|
-
|
|
|
|
- err = get_retval();
|
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
|
- errno = ERR_OK;
|
|
|
|
- handle_error("bind", "", err);
|
|
|
|
- return err;
|
|
|
|
|
|
+ return send_cmd(fdret_sock, cmd);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -914,12 +913,7 @@ int listen(LISTEN_SIG)
|
|
rpc_st.__tid = syscall(SYS_gettid);
|
|
rpc_st.__tid = syscall(SYS_gettid);
|
|
cmd[0] = RPC_LISTEN;
|
|
cmd[0] = RPC_LISTEN;
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct listen_st));
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct listen_st));
|
|
- pthread_mutex_lock(&lock);
|
|
|
|
- send_command(fdret_sock, cmd);
|
|
|
|
- //get_retval();
|
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
|
- handle_error("listen", "", ERR_OK);
|
|
|
|
- return ERR_OK;
|
|
|
|
|
|
+ return send_command(fdret_sock, cmd);
|
|
}
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------------------------
|
|
/*------------------------------------------------------------------------------
|
|
@@ -960,12 +954,12 @@ int poll(POLL_SIG)
|
|
/* int fd */
|
|
/* int fd */
|
|
int close(CLOSE_SIG)
|
|
int close(CLOSE_SIG)
|
|
{
|
|
{
|
|
- checkpid(); // Required for httpd-2.4.17-3.x86_64 -- After clone, some symbols aren't initialized yet */
|
|
|
|
|
|
+ //checkpid(); // Add for nginx support, remove for apache support.
|
|
|
|
+ dwr(MSG_DEBUG, "close(%d)\n", fd);
|
|
if(realclose == NULL){
|
|
if(realclose == NULL){
|
|
- dwr(MSG_ERROR, "close(): SYMBOL NOT FOUND.\n");
|
|
|
|
|
|
+ dwr(MSG_ERROR, "close(%d): SYMBOL NOT FOUND.\n", fd);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
- /* dwr(MSG_DEBUG,"close(%d)\n", fd); */
|
|
|
|
if(fd == fdret_sock)
|
|
if(fd == fdret_sock)
|
|
return -1; /* TODO: Ignore request to shut down our rpc fd, this is *almost always* safe */
|
|
return -1; /* TODO: Ignore request to shut down our rpc fd, this is *almost always* safe */
|
|
if(fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO)
|
|
if(fd != STDIN_FILENO && fd != STDOUT_FILENO && fd != STDERR_FILENO)
|
|
@@ -1030,7 +1024,9 @@ int getsockname(GETSOCKNAME_SIG)
|
|
dwr(MSG_ERROR, "getsockname(): SYMBOL NOT FOUND.\n");
|
|
dwr(MSG_ERROR, "getsockname(): SYMBOL NOT FOUND.\n");
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
+ return realgetsockname(sockfd, addr, addrlen);
|
|
|
|
|
|
|
|
+ /* assemble command */
|
|
char cmd[BUF_SZ];
|
|
char cmd[BUF_SZ];
|
|
struct getsockname_st rpc_st;
|
|
struct getsockname_st rpc_st;
|
|
rpc_st.sockfd = sockfd;
|
|
rpc_st.sockfd = sockfd;
|
|
@@ -1038,9 +1034,8 @@ int getsockname(GETSOCKNAME_SIG)
|
|
memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
|
|
memcpy(&rpc_st.addrlen, &addrlen, sizeof(socklen_t));
|
|
cmd[0] = RPC_GETSOCKNAME;
|
|
cmd[0] = RPC_GETSOCKNAME;
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct getsockname_st));
|
|
memcpy(&cmd[1], &rpc_st, sizeof(struct getsockname_st));
|
|
- pthread_mutex_lock(&lock);
|
|
|
|
- send_command(fdret_sock, cmd);
|
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
|
|
|
+
|
|
|
|
+ send_cmd(fdret_sock, cmd);
|
|
|
|
|
|
char addrbuf[sizeof(struct sockaddr)];
|
|
char addrbuf[sizeof(struct sockaddr)];
|
|
memset(addrbuf, '\0', sizeof(struct sockaddr));
|
|
memset(addrbuf, '\0', sizeof(struct sockaddr));
|