diff options
-rw-r--r-- | tests/server/sockfilt.c | 189 |
1 files changed, 112 insertions, 77 deletions
diff --git a/tests/server/sockfilt.c b/tests/server/sockfilt.c index a4ddd225a..3274127c8 100644 --- a/tests/server/sockfilt.c +++ b/tests/server/sockfilt.c @@ -107,19 +107,32 @@ static void lograw(unsigned char *buffer, int len) int width=0; for(i=0; i<len; i++) { - sprintf(optr, "%c", - (isgraph(ptr[i]) || ptr[i]==0x20) ?ptr[i]:'.'); - optr += 1; - width += 1; + switch(ptr[i]) { + case '\n': + sprintf(optr, "\\n"); + width += 2; + optr += 2; + break; + case '\r': + sprintf(optr, "\\r"); + width += 2; + optr += 2; + break; + default: + sprintf(optr, "%c", (isgraph(ptr[i]) || ptr[i]==0x20) ?ptr[i]:'.'); + width++; + optr++; + break; + } if(width>60) { - logmsg("RAW: '%s'", data); + logmsg("'%s'", data); width = 0; optr = data; } } if(width) - logmsg("RAW: '%s'", data); + logmsg("'%s'", data); } #ifdef SIGPIPE @@ -159,7 +172,7 @@ static int juggle(curl_socket_t *sockfdp, int r; unsigned char buffer[256]; /* FIX: bigger buffer */ char data[256]; - int sockfd; + curl_socket_t sockfd; timeout.tv_sec = 120; timeout.tv_usec = 0; @@ -228,7 +241,7 @@ static int juggle(curl_socket_t *sockfdp, if(FD_ISSET(fileno(stdin), &fds_read)) { - size_t nread; + ssize_t nread; /* read from stdin, commands/data to be dealt with and possibly passed on to the socket @@ -307,7 +320,7 @@ static int juggle(curl_socket_t *sockfdp, return TRUE; } } - else { + else if(nread == -1){ logmsg("read %d from stdin, exiting", (int)nread); return FALSE; } @@ -356,20 +369,101 @@ static int juggle(curl_socket_t *sockfdp, return TRUE; } +static curl_socket_t sockdaemon(curl_socket_t sock, + unsigned short *port) +{ + /* passive daemon style */ + struct sockaddr_in me; +#ifdef ENABLE_IPV6 + struct sockaddr_in6 me6; +#endif /* ENABLE_IPV6 */ + int flag = 1; + int rc; + + if (setsockopt + (sock, SOL_SOCKET, SO_REUSEADDR, (const void *) &flag, + sizeof(int)) < 0) { + perror("setsockopt(SO_REUSEADDR)"); + } + +#ifdef ENABLE_IPV6 + if(!use_ipv6) { +#endif + me.sin_family = AF_INET; + me.sin_addr.s_addr = INADDR_ANY; + me.sin_port = htons(*port); + rc = bind(sock, (struct sockaddr *) &me, sizeof(me)); +#ifdef ENABLE_IPV6 + } + else { + memset(&me6, 0, sizeof(struct sockaddr_in6)); + me6.sin6_family = AF_INET6; + me6.sin6_addr = in6addr_any; + me6.sin6_port = htons(*port); + rc = bind(sock, (struct sockaddr *) &me6, sizeof(me6)); + } +#endif /* ENABLE_IPV6 */ + if(rc < 0) { + perror("binding stream socket"); + logmsg("Error binding socket"); + return CURL_SOCKET_BAD; + } + + if(!*port) { + /* The system picked a port number, now figure out which port we actually + got */ + /* we succeeded to bind */ + struct sockaddr_in add; + socklen_t socksize = sizeof(add); + + if(getsockname(sock, (struct sockaddr *) &add, + &socksize)<0) { + fprintf(stderr, "getsockname() failed"); + return CURL_SOCKET_BAD; + } + *port = ntohs(add.sin_port); + } + + /* start accepting connections */ + listen(sock, 4); + + return sock; +} + +static curl_socket_t mksock(bool use_ipv6) +{ + curl_socket_t sock; +#ifdef ENABLE_IPV6 + if(!use_ipv6) +#endif + sock = socket(AF_INET, SOCK_STREAM, 0); +#ifdef ENABLE_IPV6 + else + sock = socket(AF_INET6, SOCK_STREAM, 0); +#endif + + if (sock < 0) { + perror("opening stream socket"); + logmsg("Error opening socket"); + return CURL_SOCKET_BAD; + } + + return sock; +} + + int main(int argc, char *argv[]) { struct sockaddr_in me; #ifdef ENABLE_IPV6 struct sockaddr_in6 me6; #endif /* ENABLE_IPV6 */ - int sock; - int msgsock = CURL_SOCKET_BAD; /* no stream socket yet */ - int flag; + curl_socket_t sock; + curl_socket_t msgsock; FILE *pidfile; char *pidname= (char *)".sockfilt.pid"; int rc; int arg=1; - bool ok = FALSE; enum sockmode mode = PASSIVE_LISTEN; /* default */ while(argc>arg) { @@ -447,20 +541,8 @@ int main(int argc, char *argv[]) #endif #endif -#ifdef ENABLE_IPV6 - if(!use_ipv6) -#endif - sock = socket(AF_INET, SOCK_STREAM, 0); -#ifdef ENABLE_IPV6 - else - sock = socket(AF_INET6, SOCK_STREAM, 0); -#endif - if (sock < 0) { - perror("opening stream socket"); - logmsg("Error opening socket"); - return 1; - } + sock = mksock(use_ipv6); if(connectport) { /* Active mode, we should connect to the given port number */ @@ -496,55 +578,10 @@ int main(int argc, char *argv[]) } else { /* passive daemon style */ - - flag = 1; - if (setsockopt - (sock, SOL_SOCKET, SO_REUSEADDR, (const void *) &flag, - sizeof(int)) < 0) { - perror("setsockopt(SO_REUSEADDR)"); - } - -#ifdef ENABLE_IPV6 - if(!use_ipv6) { -#endif - me.sin_family = AF_INET; - me.sin_addr.s_addr = INADDR_ANY; - me.sin_port = htons(port); - rc = bind(sock, (struct sockaddr *) &me, sizeof(me)); -#ifdef ENABLE_IPV6 - } - else { - memset(&me6, 0, sizeof(struct sockaddr_in6)); - me6.sin6_family = AF_INET6; - me6.sin6_addr = in6addr_any; - me6.sin6_port = htons(port); - rc = bind(sock, (struct sockaddr *) &me6, sizeof(me6)); - } -#endif /* ENABLE_IPV6 */ - if(rc < 0) { - perror("binding stream socket"); - logmsg("Error binding socket"); + sock = sockdaemon(sock, &port); + if(CURL_SOCKET_BAD == sock) return 1; - } - - if(!port) { - /* The system picked a port number, now figure out which port we actually - got */ - /* we succeeded to bind */ - struct sockaddr_in add; - socklen_t socksize = sizeof(add); - - if(getsockname(sock, (struct sockaddr *) &add, - &socksize)<0) { - fprintf(stderr, "getsockname() failed"); - return 1; - } - port = ntohs(add.sin_port); - } - - /* start accepting connections */ - listen(sock, 1); - + msgsock = CURL_SOCKET_BAD; /* no stream socket yet */ } logmsg("Running IPv%d version", @@ -565,9 +602,7 @@ int main(int argc, char *argv[]) else fprintf(stderr, "Couldn't write pid file\n"); - do { - ok = juggle(&msgsock, sock, &mode); - } while(ok); + while(juggle(&msgsock, sock, &mode)); sclose(sock); |