19bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 8d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. 99bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * This software is licensed as described in the file COPYING, which 119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * you should have received as part of this distribution. The terms 12d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html. 139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * You may opt to use, copy, modify, merge, publish, distribute and/or sell 159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * copies of the Software, and permit persons to whom the Software is 169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * furnished to do so, under the terms of the COPYING file. 179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * KIND, either express or implied. 209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ***************************************************************************/ 22e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#include "server_setup.h" 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_SIGNAL_H 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <signal.h> 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_NETINET_IN_H 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <netinet/in.h> 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef _XOPEN_SOURCE_EXTENDED 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* This define is "almost" required to build on HPUX 11 */ 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <arpa/inet.h> 339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_NETDB_H 359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <netdb.h> 369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef HAVE_SYS_POLL_H 389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <sys/poll.h> 399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#elif defined(HAVE_POLL_H) 409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <poll.h> 419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#define ENABLE_CURLX_PRINTF 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* make the curlx header define all printf() functions to use the curlx_* 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels versions instead */ 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "curlx.h" /* from the private lib dir */ 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "getpart.h" 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "util.h" 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "timeval.h" 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 51e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#ifdef USE_WINSOCK 52e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#undef EINTR 53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define EINTR 4 /* errno.h value */ 54e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#undef EINVAL 55e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#define EINVAL 22 /* errno.h value */ 56e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET#endif 57e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#if defined(ENABLE_IPV6) && defined(__MINGW32__) 599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsconst struct in6_addr in6addr_any = {{ IN6ADDR_ANY_INIT }}; 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 62e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/* This function returns a pointer to STATIC memory. It converts the given 63e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * binary lump to a hex formatted string usable for output in logs or 64e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * whatever. 65e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET */ 66e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNETchar *data_to_hex(char *data, size_t len) 67e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET{ 68e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET static char buf[256*3]; 69e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET size_t i; 70e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET char *optr = buf; 71e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET char *iptr = data; 72e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 73e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if(len > 255) 74e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET len = 255; 75e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 76e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET for(i=0; i < len; i++) { 77e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET if((data[i] >= 0x20) && (data[i] < 0x7f)) 78e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *optr++ = *iptr++; 79e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET else { 80d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo snprintf(optr, 4, "%%%02x", *iptr++); 81e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET optr+=3; 82e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 84d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo *optr=0; /* in case no sprintf was used */ 85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 86e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return buf; 87e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET} 88e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid logmsg(const char *msg, ...) 909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels va_list ap; 929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels char buffer[2048 + 1]; 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels FILE *logfp; 949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int error; 959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct timeval tv; 969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels time_t sec; 979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct tm *now; 989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels char timebuf[20]; 999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels static time_t epoch_offset; 1009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels static int known_offset; 1019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 102d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if(!serverlogfile) { 1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Error: serverlogfile not set\n"); 1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return; 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels tv = curlx_tvnow(); 1089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!known_offset) { 1099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels epoch_offset = time(NULL) - tv.tv_sec; 1109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels known_offset = 1; 1119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels sec = epoch_offset + tv.tv_sec; 1139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels now = localtime(&sec); /* not thread safe but we don't care */ 1149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels snprintf(timebuf, sizeof(timebuf), "%02d:%02d:%02d.%06ld", 1169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels (int)now->tm_hour, (int)now->tm_min, (int)now->tm_sec, (long)tv.tv_usec); 1179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels va_start(ap, msg); 1199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels vsnprintf(buffer, sizeof(buffer), msg, ap); 1209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels va_end(ap); 1219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logfp = fopen(serverlogfile, "ab"); 1239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(logfp) { 1249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(logfp, "%s %s\n", timebuf, buffer); 1259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(logfp); 1269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels else { 128e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET error = errno; 1299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "fopen() failed with error: %d %s\n", 1309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels error, strerror(error)); 1319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Error opening file: %s\n", serverlogfile); 1329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Msg not logged: %s %s\n", timebuf, buffer); 1339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef WIN32 1379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* use instead of perror() on generic windows */ 1389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid win32_perror (const char *msg) 1399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 1409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels char buf[512]; 1419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels DWORD err = SOCKERRNO; 1429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 143d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if(!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 144d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo LANG_NEUTRAL, buf, sizeof(buf), NULL)) 1459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels snprintf(buf, sizeof(buf), "Unknown error %lu (%#lx)", err, err); 146d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if(msg) 147d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo fprintf(stderr, "%s: ", msg); 1489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "%s\n", buf); 1499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif /* WIN32 */ 1519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifdef USE_WINSOCK 1539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid win32_init(void) 1549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 1559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels WORD wVersionRequested; 1569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels WSADATA wsaData; 1579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int err; 1589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels wVersionRequested = MAKEWORD(USE_WINSOCK, USE_WINSOCK); 1599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels err = WSAStartup(wVersionRequested, &wsaData); 1619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 162d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if(err != 0) { 1639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels perror("Winsock init failed"); 1649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Error initialising winsock -- aborting"); 1659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels exit(1); 1669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 168d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if(LOBYTE(wsaData.wVersion) != USE_WINSOCK || 169d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo HIBYTE(wsaData.wVersion) != USE_WINSOCK) { 1709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels WSACleanup(); 1719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels perror("Winsock init failed"); 1729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("No suitable winsock.dll found -- aborting"); 1739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels exit(1); 1749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid win32_cleanup(void) 1789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 1799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels WSACleanup(); 1809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif /* USE_WINSOCK */ 1829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* set by the main code to point to where the test dir is */ 1849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsconst char *path="."; 1859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelschar *test2file(long testno) 1879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 1889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels static char filename[256]; 1899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels snprintf(filename, sizeof(filename), TEST_DATA_PATH, path, testno); 1909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return filename; 1919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* 1949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Portable function used for waiting a specific amount of ms. 1959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Waiting indefinitely with this function is not allowed, a 1969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * zero or negative timeout value will return immediately. 1979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 1989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Return values: 1999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * -1 = system call error, or invalid timeout value 2009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 0 = specified timeout has elapsed 2019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 2029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint wait_ms(int timeout_ms) 2039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 2049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#if !defined(MSDOS) && !defined(USE_WINSOCK) 2059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifndef HAVE_POLL_FINE 2069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct timeval pending_tv; 2079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 2089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct timeval initial_tv; 2099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int pending_ms; 2109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int error; 2119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 2129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int r = 0; 2139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!timeout_ms) 2159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; 2169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(timeout_ms < 0) { 217e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET errno = EINVAL; 2189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return -1; 2199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 2209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#if defined(MSDOS) 2219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels delay(timeout_ms); 2229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#elif defined(USE_WINSOCK) 2239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels Sleep(timeout_ms); 2249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 2259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pending_ms = timeout_ms; 2269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels initial_tv = curlx_tvnow(); 2279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels do { 2289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#if defined(HAVE_POLL_FINE) 2299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels r = poll(NULL, 0, pending_ms); 2309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 2319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pending_tv.tv_sec = pending_ms / 1000; 2329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pending_tv.tv_usec = (pending_ms % 1000) * 1000; 2339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels r = select(0, NULL, NULL, NULL, &pending_tv); 2349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif /* HAVE_POLL_FINE */ 2359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(r != -1) 2369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels break; 237e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET error = errno; 2389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(error && (error != EINTR)) 2399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels break; 2409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pending_ms = timeout_ms - (int)curlx_tvdiff(curlx_tvnow(), initial_tv); 2419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(pending_ms <= 0) 2429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels break; 2439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } while(r == -1); 2449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif /* USE_WINSOCK */ 2459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(r) 2469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels r = -1; 2479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return r; 2489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 2499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint write_pidfile(const char *filename) 2519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 2529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels FILE *pidfile; 2539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels long pid; 2549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pid = (long)getpid(); 2569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pidfile = fopen(filename, "wb"); 2579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!pidfile) { 258e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET logmsg("Couldn't write pid file: %s %s", filename, strerror(errno)); 2599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; /* fail */ 2609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 2619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(pidfile, "%ld\n", pid); 2629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(pidfile); 2639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Wrote pid %ld to %s", pid, filename); 2649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; /* success */ 2659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 2669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid set_advisor_read_lock(const char *filename) 2689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 2699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels FILE *lockfile; 2709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int error = 0; 2719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int res; 2729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels do { 2749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels lockfile = fopen(filename, "wb"); 275e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } while((lockfile == NULL) && ((error = errno) == EINTR)); 2769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(lockfile == NULL) { 2779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Error creating lock file %s error: %d %s", 2789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels filename, error, strerror(error)); 2799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return; 2809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 2819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels do { 2839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = fclose(lockfile); 284e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } while(res && ((error = errno) == EINTR)); 2859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(res) 2869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Error closing lock file %s error: %d %s", 2879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels filename, error, strerror(error)); 2889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 2899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid clear_advisor_read_lock(const char *filename) 2919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 2929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int error = 0; 2939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int res; 2949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* 2969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ** Log all removal failures. Even those due to file not existing. 2979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ** This allows to detect if unexpectedly the file has already been 2989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ** removed by a process different than the one that should do this. 2999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 3009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 3019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels do { 3029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = unlink(filename); 303e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } while(res && ((error = errno) == EINTR)); 3049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(res) 3059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Error removing lock file %s error: %d %s", 3069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels filename, error, strerror(error)); 3079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 308