diff options
Diffstat (limited to 'tests/server/rtspd.c')
-rw-r--r-- | tests/server/rtspd.c | 147 |
1 files changed, 71 insertions, 76 deletions
diff --git a/tests/server/rtspd.c b/tests/server/rtspd.c index 788d61c..0293f59 100644 --- a/tests/server/rtspd.c +++ b/tests/server/rtspd.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -19,6 +19,7 @@ * KIND, either express or implied. * ***************************************************************************/ +#include "server_setup.h" /* * curl's test suite Real Time Streaming Protocol (RTSP) server. @@ -26,19 +27,9 @@ * This source file was started based on curl's HTTP test suite server. */ -#define CURL_NO_OLDIES - -#include "setup.h" /* portability help from the lib directory */ - #ifdef HAVE_SIGNAL_H #include <signal.h> #endif -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_SYS_SOCKET_H -#include <sys/socket.h> -#endif #ifdef HAVE_NETINET_IN_H #include <netinet/in.h> #endif @@ -58,10 +49,18 @@ #include "curlx.h" /* from the private lib dir */ #include "getpart.h" #include "util.h" +#include "server_sockaddr.h" /* include memdebug.h last */ #include "memdebug.h" +#ifdef USE_WINSOCK +#undef EINTR +#define EINTR 4 /* errno.h value */ +#undef ERANGE +#define ERANGE 34 /* errno.h value */ +#endif + #ifdef ENABLE_IPV6 static bool use_ipv6 = FALSE; #endif @@ -229,6 +228,10 @@ static SIGHANDLER_T old_sigint_handler = SIG_ERR; static SIGHANDLER_T old_sigterm_handler = SIG_ERR; #endif +#if defined(SIGBREAK) && defined(WIN32) +static SIGHANDLER_T old_sigbreak_handler = SIG_ERR; +#endif + /* var which if set indicates that the program should finish execution */ SIG_ATOMIC_T got_exit_signal = 0; @@ -244,13 +247,13 @@ static volatile int exit_signal = 0; static RETSIGTYPE exit_signal_handler(int signum) { - int old_errno = ERRNO; + int old_errno = errno; if(got_exit_signal == 0) { got_exit_signal = 1; exit_signal = signum; } (void)signal(signum, exit_signal_handler); - SET_ERRNO(old_errno); + errno = old_errno; } static void install_signal_handlers(void) @@ -258,32 +261,39 @@ static void install_signal_handlers(void) #ifdef SIGHUP /* ignore SIGHUP signal */ if((old_sighup_handler = signal(SIGHUP, SIG_IGN)) == SIG_ERR) - logmsg("cannot install SIGHUP handler: %s", strerror(ERRNO)); + logmsg("cannot install SIGHUP handler: %s", strerror(errno)); #endif #ifdef SIGPIPE /* ignore SIGPIPE signal */ if((old_sigpipe_handler = signal(SIGPIPE, SIG_IGN)) == SIG_ERR) - logmsg("cannot install SIGPIPE handler: %s", strerror(ERRNO)); + logmsg("cannot install SIGPIPE handler: %s", strerror(errno)); #endif #ifdef SIGALRM /* ignore SIGALRM signal */ if((old_sigalrm_handler = signal(SIGALRM, SIG_IGN)) == SIG_ERR) - logmsg("cannot install SIGALRM handler: %s", strerror(ERRNO)); + logmsg("cannot install SIGALRM handler: %s", strerror(errno)); #endif #ifdef SIGINT /* handle SIGINT signal with our exit_signal_handler */ if((old_sigint_handler = signal(SIGINT, exit_signal_handler)) == SIG_ERR) - logmsg("cannot install SIGINT handler: %s", strerror(ERRNO)); + logmsg("cannot install SIGINT handler: %s", strerror(errno)); else siginterrupt(SIGINT, 1); #endif #ifdef SIGTERM /* handle SIGTERM signal with our exit_signal_handler */ if((old_sigterm_handler = signal(SIGTERM, exit_signal_handler)) == SIG_ERR) - logmsg("cannot install SIGTERM handler: %s", strerror(ERRNO)); + logmsg("cannot install SIGTERM handler: %s", strerror(errno)); else siginterrupt(SIGTERM, 1); #endif +#if defined(SIGBREAK) && defined(WIN32) + /* handle SIGBREAK signal with our exit_signal_handler */ + if((old_sigbreak_handler = signal(SIGBREAK, exit_signal_handler)) == SIG_ERR) + logmsg("cannot install SIGBREAK handler: %s", strerror(errno)); + else + siginterrupt(SIGBREAK, 1); +#endif } static void restore_signal_handlers(void) @@ -308,6 +318,10 @@ static void restore_signal_handlers(void) if(SIG_ERR != old_sigterm_handler) (void)signal(SIGTERM, old_sigterm_handler); #endif +#if defined(SIGBREAK) && defined(WIN32) + if(SIG_ERR != old_sigbreak_handler) + (void)signal(SIGBREAK, old_sigbreak_handler); +#endif } static int ProcessRequest(struct httprequest *req) @@ -403,7 +417,7 @@ static int ProcessRequest(struct httprequest *req) stream=fopen(filename, "rb"); if(!stream) { - error = ERRNO; + error = errno; logmsg("fopen() failed with error: %d %s", error, strerror(error)); logmsg("Error opening file: %s", filename); logmsg("Couldn't open test file %ld", req->testno); @@ -509,8 +523,7 @@ static int ProcessRequest(struct httprequest *req) } while(ptr && *ptr); logmsg("Done parsing server commands"); } - if(cmd) - free(cmd); + free(cmd); } } else { @@ -530,8 +543,8 @@ static int ProcessRequest(struct httprequest *req) /* if the host name starts with test, the port number used in the CONNECT line will be used as test number! */ char *portp = strchr(doc, ':'); - if(portp) - req->testno = atoi(portp+1); + if(portp && (*(portp+1) != '\0') && ISDIGIT(*(portp+1))) + req->testno = strtol(portp+1, NULL, 10); else req->testno = DOCNUMBER_CONNECT; } @@ -583,9 +596,9 @@ static int ProcessRequest(struct httprequest *req) while(*ptr && ISSPACE(*ptr)) ptr++; endptr = ptr; - SET_ERRNO(0); + errno = 0; clen = strtoul(ptr, &endptr, 10); - if((ptr == endptr) || !ISSPACE(*endptr) || (ERANGE == ERRNO)) { + if((ptr == endptr) || !ISSPACE(*endptr) || (ERANGE == errno)) { /* this assumes that a zero Content-Length is valid */ logmsg("Found invalid Content-Length: (%s) in the request", ptr); req->open = FALSE; /* closes connection */ @@ -717,7 +730,7 @@ static void storerequest(char *reqbuf, size_t totalsize) do { dump = fopen(REQUEST_DUMP, "ab"); - } while ((dump == NULL) && ((error = ERRNO) == EINTR)); + } while ((dump == NULL) && ((error = errno) == EINTR)); if (dump == NULL) { logmsg("Error opening file %s error: %d %s", REQUEST_DUMP, error, strerror(error)); @@ -733,7 +746,7 @@ static void storerequest(char *reqbuf, size_t totalsize) goto storerequest_cleanup; if(written > 0) writeleft -= written; - } while ((writeleft > 0) && ((error = ERRNO) == EINTR)); + } while ((writeleft > 0) && ((error = errno) == EINTR)); if(writeleft == 0) logmsg("Wrote request (%zu bytes) input to " REQUEST_DUMP, totalsize); @@ -748,7 +761,7 @@ storerequest_cleanup: do { res = fclose(dump); - } while(res && ((error = ERRNO) == EINTR)); + } while(res && ((error = errno) == EINTR)); if(res) logmsg("Error closing file %s error: %d %s", REQUEST_DUMP, error, strerror(error)); @@ -797,7 +810,7 @@ static int get_request(curl_socket_t sock, struct httprequest *req) while(!done_processing && (req->offset < REQBUFSIZ-1)) { if(pipereq_length && pipereq) { memmove(reqbuf, pipereq, pipereq_length); - got = pipereq_length; + got = curlx_uztosz(pipereq_length); pipereq_length = 0; } else { @@ -962,7 +975,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) stream=fopen(filename, "rb"); if(!stream) { - error = ERRNO; + error = errno; logmsg("fopen() failed with error: %d %s", error, strerror(error)); logmsg("Error opening file: %s", filename); logmsg("Couldn't open test file"); @@ -979,20 +992,18 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) } if(got_exit_signal) { - if(ptr) - free(ptr); + free(ptr); return -1; } /* re-open the same file again */ stream=fopen(filename, "rb"); if(!stream) { - error = ERRNO; + error = errno; logmsg("fopen() failed with error: %d %s", error, strerror(error)); logmsg("Error opening file: %s", filename); logmsg("Couldn't open test file"); - if(ptr) - free(ptr); + free(ptr); return 0; } else { @@ -1001,18 +1012,15 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) fclose(stream); if(error) { logmsg("getpart() failed with error: %d", error); - if(ptr) - free(ptr); + free(ptr); return 0; } } } if(got_exit_signal) { - if(ptr) - free(ptr); - if(cmd) - free(cmd); + free(ptr); + free(cmd); return -1; } @@ -1032,14 +1040,12 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) dump = fopen(RESPONSE_DUMP, "ab"); if(!dump) { - error = ERRNO; + error = errno; logmsg("fopen() failed with error: %d %s", error, strerror(error)); logmsg("Error opening file: %s", RESPONSE_DUMP); logmsg("couldn't create logfile: " RESPONSE_DUMP); - if(ptr) - free(ptr); - if(cmd) - free(cmd); + free(ptr); + free(cmd); return -1; } @@ -1090,34 +1096,28 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) do { res = fclose(dump); - } while(res && ((error = ERRNO) == EINTR)); + } while(res && ((error = errno) == EINTR)); if(res) logmsg("Error closing file %s error: %d %s", RESPONSE_DUMP, error, strerror(error)); if(got_exit_signal) { - if(ptr) - free(ptr); - if(cmd) - free(cmd); + free(ptr); + free(cmd); return -1; } if(sendfailure) { logmsg("Sending response failed. Only (%zu bytes) of (%zu bytes) were sent", responsesize-count, responsesize); - if(ptr) - free(ptr); - if(cmd) - free(cmd); + free(ptr); + free(cmd); return -1; } logmsg("Response sent (%zu bytes) and written to " RESPONSE_DUMP, responsesize); - - if(ptr) - free(ptr); + free(ptr); if(cmdsize > 0 ) { char command[32]; @@ -1136,7 +1136,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) break; if(res) { /* should not happen */ - error = SOCKERRNO; + error = errno; logmsg("wait_ms() failed with error: (%d) %s", error, strerror(error)); break; @@ -1155,9 +1155,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) ptr = NULL; } while(ptr && *ptr); } - if(cmd) - free(cmd); - + free(cmd); req->open = persistant; prevtestno = req->testno; @@ -1169,10 +1167,7 @@ static int send_doc(curl_socket_t sock, struct httprequest *req) int main(int argc, char *argv[]) { - struct sockaddr_in me; -#ifdef ENABLE_IPV6 - struct sockaddr_in6 me6; -#endif /* ENABLE_IPV6 */ + srvr_sockaddr_union_t me; curl_socket_t sock = CURL_SOCKET_BAD; curl_socket_t msgsock = CURL_SOCKET_BAD; int wrotepidfile = 0; @@ -1294,19 +1289,19 @@ int main(int argc, char *argv[]) #ifdef ENABLE_IPV6 if(!use_ipv6) { #endif - memset(&me, 0, sizeof(me)); - 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)); + memset(&me.sa4, 0, sizeof(me.sa4)); + me.sa4.sin_family = AF_INET; + me.sa4.sin_addr.s_addr = INADDR_ANY; + me.sa4.sin_port = htons(port); + rc = bind(sock, &me.sa, sizeof(me.sa4)); #ifdef ENABLE_IPV6 } else { - memset(&me6, 0, sizeof(me6)); - me6.sin6_family = AF_INET6; - me6.sin6_addr = in6addr_any; - me6.sin6_port = htons(port); - rc = bind(sock, (struct sockaddr *) &me6, sizeof(me6)); + memset(&me.sa6, 0, sizeof(me.sa6)); + me.sa6.sin6_family = AF_INET6; + me.sa6.sin6_addr = in6addr_any; + me.sa6.sin6_port = htons(port); + rc = bind(sock, &me.sa, sizeof(me.sa6)); } #endif /* ENABLE_IPV6 */ if(0 != rc) { |