19bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 8e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Copyright (C) 1998 - 2013, 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 129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * are also available at http://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 { 80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET sprintf(optr, "%%%02x", *iptr++); 81e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET optr+=3; 82e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 83e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } 84e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET *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 1029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 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 1439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (!FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 1449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels LANG_NEUTRAL, buf, sizeof(buf), NULL)) 1459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels snprintf(buf, sizeof(buf), "Unknown error %lu (%#lx)", err, err); 1469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (msg) 1479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 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 1629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if (err != 0) { 1639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels perror("Winsock init failed"); 1649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Error initialising winsock -- aborting"); 1659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels exit(1); 1669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if ( LOBYTE( wsaData.wVersion ) != USE_WINSOCK || 1699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels HIBYTE( wsaData.wVersion ) != USE_WINSOCK ) { 1709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels WSACleanup(); 1729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels perror("Winsock init failed"); 1739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("No suitable winsock.dll found -- aborting"); 1749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels exit(1); 1759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid win32_cleanup(void) 1799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 1809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels WSACleanup(); 1819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif /* USE_WINSOCK */ 1839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* set by the main code to point to where the test dir is */ 1859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsconst char *path="."; 1869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelschar *test2file(long testno) 1889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 1899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels static char filename[256]; 1909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels snprintf(filename, sizeof(filename), TEST_DATA_PATH, path, testno); 1919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return filename; 1929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 1939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* 1959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Portable function used for waiting a specific amount of ms. 1969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Waiting indefinitely with this function is not allowed, a 1979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * zero or negative timeout value will return immediately. 1989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 1999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Return values: 2009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * -1 = system call error, or invalid timeout value 2019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 0 = specified timeout has elapsed 2029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 2039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint wait_ms(int timeout_ms) 2049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 2059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#if !defined(MSDOS) && !defined(USE_WINSOCK) 2069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#ifndef HAVE_POLL_FINE 2079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct timeval pending_tv; 2089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 2099bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct timeval initial_tv; 2109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int pending_ms; 2119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int error; 2129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 2139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int r = 0; 2149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!timeout_ms) 2169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; 2179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(timeout_ms < 0) { 218e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET errno = EINVAL; 2199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return -1; 2209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 2219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#if defined(MSDOS) 2229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels delay(timeout_ms); 2239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#elif defined(USE_WINSOCK) 2249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels Sleep(timeout_ms); 2259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 2269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pending_ms = timeout_ms; 2279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels initial_tv = curlx_tvnow(); 2289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels do { 2299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#if defined(HAVE_POLL_FINE) 2309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels r = poll(NULL, 0, pending_ms); 2319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#else 2329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pending_tv.tv_sec = pending_ms / 1000; 2339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pending_tv.tv_usec = (pending_ms % 1000) * 1000; 2349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels r = select(0, NULL, NULL, NULL, &pending_tv); 2359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif /* HAVE_POLL_FINE */ 2369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(r != -1) 2379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels break; 238e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET error = errno; 2399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(error && (error != EINTR)) 2409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels break; 2419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pending_ms = timeout_ms - (int)curlx_tvdiff(curlx_tvnow(), initial_tv); 2429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(pending_ms <= 0) 2439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels break; 2449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } while(r == -1); 2459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif /* USE_WINSOCK */ 2469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(r) 2479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels r = -1; 2489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return r; 2499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 2509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint write_pidfile(const char *filename) 2529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 2539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels FILE *pidfile; 2549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels long pid; 2559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pid = (long)getpid(); 2579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels pidfile = fopen(filename, "wb"); 2589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(!pidfile) { 259e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET logmsg("Couldn't write pid file: %s %s", filename, strerror(errno)); 2609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 0; /* fail */ 2619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 2629bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(pidfile, "%ld\n", pid); 2639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(pidfile); 2649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Wrote pid %ld to %s", pid, filename); 2659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return 1; /* success */ 2669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 2679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid set_advisor_read_lock(const char *filename) 2699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 2709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels FILE *lockfile; 2719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int error = 0; 2729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int res; 2739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels do { 2759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels lockfile = fopen(filename, "wb"); 276e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } while((lockfile == NULL) && ((error = errno) == EINTR)); 2779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(lockfile == NULL) { 2789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Error creating lock file %s error: %d %s", 2799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels filename, error, strerror(error)); 2809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return; 2819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 2829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels do { 2849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = fclose(lockfile); 285e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } while(res && ((error = errno) == EINTR)); 2869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(res) 2879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Error closing lock file %s error: %d %s", 2889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels filename, error, strerror(error)); 2899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 2909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2919bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsvoid clear_advisor_read_lock(const char *filename) 2929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 2939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int error = 0; 2949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int res; 2959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 2969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* 2979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ** Log all removal failures. Even those due to file not existing. 2989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ** This allows to detect if unexpectedly the file has already been 2999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels ** removed by a process different than the one that should do this. 3009bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 3019bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 3029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels do { 3039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = unlink(filename); 304e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET } while(res && ((error = errno) == EINTR)); 3059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(res) 3069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels logmsg("Error removing lock file %s error: %d %s", 3079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels filename, error, strerror(error)); 3089bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 309