xref: /aosp_15_r20/external/curl/src/tool_util.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker  *
8*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker  *
14*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker  *
18*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker  *
21*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker #include "tool_setup.h"
25*6236dae4SAndroid Build Coastguard Worker 
26*6236dae4SAndroid Build Coastguard Worker #if defined(HAVE_STRCASECMP) && defined(HAVE_STRINGS_H)
27*6236dae4SAndroid Build Coastguard Worker #include <strings.h>
28*6236dae4SAndroid Build Coastguard Worker #endif
29*6236dae4SAndroid Build Coastguard Worker 
30*6236dae4SAndroid Build Coastguard Worker #include "tool_util.h"
31*6236dae4SAndroid Build Coastguard Worker 
32*6236dae4SAndroid Build Coastguard Worker #include "curlx.h"
33*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h" /* keep this as LAST include */
34*6236dae4SAndroid Build Coastguard Worker 
35*6236dae4SAndroid Build Coastguard Worker #if defined(_WIN32)
36*6236dae4SAndroid Build Coastguard Worker 
37*6236dae4SAndroid Build Coastguard Worker /* In case of bug fix this function has a counterpart in timeval.c */
tvnow(void)38*6236dae4SAndroid Build Coastguard Worker struct timeval tvnow(void)
39*6236dae4SAndroid Build Coastguard Worker {
40*6236dae4SAndroid Build Coastguard Worker   struct timeval now;
41*6236dae4SAndroid Build Coastguard Worker   if(tool_isVistaOrGreater) { /* QPC timer might have issues pre-Vista */
42*6236dae4SAndroid Build Coastguard Worker     LARGE_INTEGER count;
43*6236dae4SAndroid Build Coastguard Worker     QueryPerformanceCounter(&count);
44*6236dae4SAndroid Build Coastguard Worker     now.tv_sec = (long)(count.QuadPart / tool_freq.QuadPart);
45*6236dae4SAndroid Build Coastguard Worker     now.tv_usec = (long)((count.QuadPart % tool_freq.QuadPart) * 1000000 /
46*6236dae4SAndroid Build Coastguard Worker                          tool_freq.QuadPart);
47*6236dae4SAndroid Build Coastguard Worker   }
48*6236dae4SAndroid Build Coastguard Worker   else {
49*6236dae4SAndroid Build Coastguard Worker     /* Disable /analyze warning that GetTickCount64 is preferred  */
50*6236dae4SAndroid Build Coastguard Worker #if defined(_MSC_VER)
51*6236dae4SAndroid Build Coastguard Worker #pragma warning(push)
52*6236dae4SAndroid Build Coastguard Worker #pragma warning(disable:28159)
53*6236dae4SAndroid Build Coastguard Worker #endif
54*6236dae4SAndroid Build Coastguard Worker     DWORD milliseconds = GetTickCount();
55*6236dae4SAndroid Build Coastguard Worker #if defined(_MSC_VER)
56*6236dae4SAndroid Build Coastguard Worker #pragma warning(pop)
57*6236dae4SAndroid Build Coastguard Worker #endif
58*6236dae4SAndroid Build Coastguard Worker 
59*6236dae4SAndroid Build Coastguard Worker     now.tv_sec = (long)(milliseconds / 1000);
60*6236dae4SAndroid Build Coastguard Worker     now.tv_usec = (long)((milliseconds % 1000) * 1000);
61*6236dae4SAndroid Build Coastguard Worker   }
62*6236dae4SAndroid Build Coastguard Worker   return now;
63*6236dae4SAndroid Build Coastguard Worker }
64*6236dae4SAndroid Build Coastguard Worker 
65*6236dae4SAndroid Build Coastguard Worker #elif defined(HAVE_CLOCK_GETTIME_MONOTONIC)
66*6236dae4SAndroid Build Coastguard Worker 
tvnow(void)67*6236dae4SAndroid Build Coastguard Worker struct timeval tvnow(void)
68*6236dae4SAndroid Build Coastguard Worker {
69*6236dae4SAndroid Build Coastguard Worker   /*
70*6236dae4SAndroid Build Coastguard Worker   ** clock_gettime() is granted to be increased monotonically when the
71*6236dae4SAndroid Build Coastguard Worker   ** monotonic clock is queried. Time starting point is unspecified, it
72*6236dae4SAndroid Build Coastguard Worker   ** could be the system start-up time, the Epoch, or something else,
73*6236dae4SAndroid Build Coastguard Worker   ** in any case the time starting point does not change once that the
74*6236dae4SAndroid Build Coastguard Worker   ** system has started up.
75*6236dae4SAndroid Build Coastguard Worker   */
76*6236dae4SAndroid Build Coastguard Worker   struct timeval now;
77*6236dae4SAndroid Build Coastguard Worker   struct timespec tsnow;
78*6236dae4SAndroid Build Coastguard Worker   if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
79*6236dae4SAndroid Build Coastguard Worker     now.tv_sec = tsnow.tv_sec;
80*6236dae4SAndroid Build Coastguard Worker     now.tv_usec = (int)(tsnow.tv_nsec / 1000);
81*6236dae4SAndroid Build Coastguard Worker   }
82*6236dae4SAndroid Build Coastguard Worker   /*
83*6236dae4SAndroid Build Coastguard Worker   ** Even when the configure process has truly detected monotonic clock
84*6236dae4SAndroid Build Coastguard Worker   ** availability, it might happen that it is not actually available at
85*6236dae4SAndroid Build Coastguard Worker   ** runtime. When this occurs simply fallback to other time source.
86*6236dae4SAndroid Build Coastguard Worker   */
87*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_GETTIMEOFDAY
88*6236dae4SAndroid Build Coastguard Worker   else
89*6236dae4SAndroid Build Coastguard Worker     (void)gettimeofday(&now, NULL);
90*6236dae4SAndroid Build Coastguard Worker #else
91*6236dae4SAndroid Build Coastguard Worker   else {
92*6236dae4SAndroid Build Coastguard Worker     now.tv_sec = time(NULL);
93*6236dae4SAndroid Build Coastguard Worker     now.tv_usec = 0;
94*6236dae4SAndroid Build Coastguard Worker   }
95*6236dae4SAndroid Build Coastguard Worker #endif
96*6236dae4SAndroid Build Coastguard Worker   return now;
97*6236dae4SAndroid Build Coastguard Worker }
98*6236dae4SAndroid Build Coastguard Worker 
99*6236dae4SAndroid Build Coastguard Worker #elif defined(HAVE_GETTIMEOFDAY)
100*6236dae4SAndroid Build Coastguard Worker 
tvnow(void)101*6236dae4SAndroid Build Coastguard Worker struct timeval tvnow(void)
102*6236dae4SAndroid Build Coastguard Worker {
103*6236dae4SAndroid Build Coastguard Worker   /*
104*6236dae4SAndroid Build Coastguard Worker   ** gettimeofday() is not granted to be increased monotonically, due to
105*6236dae4SAndroid Build Coastguard Worker   ** clock drifting and external source time synchronization it can jump
106*6236dae4SAndroid Build Coastguard Worker   ** forward or backward in time.
107*6236dae4SAndroid Build Coastguard Worker   */
108*6236dae4SAndroid Build Coastguard Worker   struct timeval now;
109*6236dae4SAndroid Build Coastguard Worker   (void)gettimeofday(&now, NULL);
110*6236dae4SAndroid Build Coastguard Worker   return now;
111*6236dae4SAndroid Build Coastguard Worker }
112*6236dae4SAndroid Build Coastguard Worker 
113*6236dae4SAndroid Build Coastguard Worker #else
114*6236dae4SAndroid Build Coastguard Worker 
tvnow(void)115*6236dae4SAndroid Build Coastguard Worker struct timeval tvnow(void)
116*6236dae4SAndroid Build Coastguard Worker {
117*6236dae4SAndroid Build Coastguard Worker   /*
118*6236dae4SAndroid Build Coastguard Worker   ** time() returns the value of time in seconds since the Epoch.
119*6236dae4SAndroid Build Coastguard Worker   */
120*6236dae4SAndroid Build Coastguard Worker   struct timeval now;
121*6236dae4SAndroid Build Coastguard Worker   now.tv_sec = time(NULL);
122*6236dae4SAndroid Build Coastguard Worker   now.tv_usec = 0;
123*6236dae4SAndroid Build Coastguard Worker   return now;
124*6236dae4SAndroid Build Coastguard Worker }
125*6236dae4SAndroid Build Coastguard Worker 
126*6236dae4SAndroid Build Coastguard Worker #endif
127*6236dae4SAndroid Build Coastguard Worker 
128*6236dae4SAndroid Build Coastguard Worker /*
129*6236dae4SAndroid Build Coastguard Worker  * Make sure that the first argument is the more recent time, as otherwise
130*6236dae4SAndroid Build Coastguard Worker  * we will get a weird negative time-diff back...
131*6236dae4SAndroid Build Coastguard Worker  *
132*6236dae4SAndroid Build Coastguard Worker  * Returns: the time difference in number of milliseconds.
133*6236dae4SAndroid Build Coastguard Worker  */
tvdiff(struct timeval newer,struct timeval older)134*6236dae4SAndroid Build Coastguard Worker long tvdiff(struct timeval newer, struct timeval older)
135*6236dae4SAndroid Build Coastguard Worker {
136*6236dae4SAndroid Build Coastguard Worker   return (long)(newer.tv_sec-older.tv_sec)*1000+
137*6236dae4SAndroid Build Coastguard Worker     (long)(newer.tv_usec-older.tv_usec)/1000;
138*6236dae4SAndroid Build Coastguard Worker }
139*6236dae4SAndroid Build Coastguard Worker 
140*6236dae4SAndroid Build Coastguard Worker /* Case insensitive compare. Accept NULL pointers. */
struplocompare(const char * p1,const char * p2)141*6236dae4SAndroid Build Coastguard Worker int struplocompare(const char *p1, const char *p2)
142*6236dae4SAndroid Build Coastguard Worker {
143*6236dae4SAndroid Build Coastguard Worker   if(!p1)
144*6236dae4SAndroid Build Coastguard Worker     return p2 ? -1 : 0;
145*6236dae4SAndroid Build Coastguard Worker   if(!p2)
146*6236dae4SAndroid Build Coastguard Worker     return 1;
147*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_STRCASECMP
148*6236dae4SAndroid Build Coastguard Worker   return strcasecmp(p1, p2);
149*6236dae4SAndroid Build Coastguard Worker #elif defined(HAVE_STRCMPI)
150*6236dae4SAndroid Build Coastguard Worker   return strcmpi(p1, p2);
151*6236dae4SAndroid Build Coastguard Worker #elif defined(HAVE_STRICMP)
152*6236dae4SAndroid Build Coastguard Worker   return stricmp(p1, p2);
153*6236dae4SAndroid Build Coastguard Worker #else
154*6236dae4SAndroid Build Coastguard Worker   return strcmp(p1, p2);
155*6236dae4SAndroid Build Coastguard Worker #endif
156*6236dae4SAndroid Build Coastguard Worker }
157*6236dae4SAndroid Build Coastguard Worker 
158*6236dae4SAndroid Build Coastguard Worker /* Indirect version to use as qsort callback. */
struplocompare4sort(const void * p1,const void * p2)159*6236dae4SAndroid Build Coastguard Worker int struplocompare4sort(const void *p1, const void *p2)
160*6236dae4SAndroid Build Coastguard Worker {
161*6236dae4SAndroid Build Coastguard Worker   return struplocompare(* (char * const *) p1, * (char * const *) p2);
162*6236dae4SAndroid Build Coastguard Worker }
163*6236dae4SAndroid Build Coastguard Worker 
164*6236dae4SAndroid Build Coastguard Worker #ifdef USE_TOOL_FTRUNCATE
165*6236dae4SAndroid Build Coastguard Worker 
166*6236dae4SAndroid Build Coastguard Worker #ifdef _WIN32_WCE
167*6236dae4SAndroid Build Coastguard Worker /* 64-bit lseek-like function unavailable */
168*6236dae4SAndroid Build Coastguard Worker #  undef _lseeki64
169*6236dae4SAndroid Build Coastguard Worker #  define _lseeki64(hnd,ofs,whence) lseek(hnd,ofs,whence)
170*6236dae4SAndroid Build Coastguard Worker #  undef _get_osfhandle
171*6236dae4SAndroid Build Coastguard Worker #  define _get_osfhandle(fd) (fd)
172*6236dae4SAndroid Build Coastguard Worker #endif
173*6236dae4SAndroid Build Coastguard Worker 
174*6236dae4SAndroid Build Coastguard Worker /*
175*6236dae4SAndroid Build Coastguard Worker  * Truncate a file handle at a 64-bit position 'where'.
176*6236dae4SAndroid Build Coastguard Worker  */
177*6236dae4SAndroid Build Coastguard Worker 
tool_ftruncate64(int fd,curl_off_t where)178*6236dae4SAndroid Build Coastguard Worker int tool_ftruncate64(int fd, curl_off_t where)
179*6236dae4SAndroid Build Coastguard Worker {
180*6236dae4SAndroid Build Coastguard Worker   intptr_t handle = _get_osfhandle(fd);
181*6236dae4SAndroid Build Coastguard Worker 
182*6236dae4SAndroid Build Coastguard Worker   if(_lseeki64(fd, where, SEEK_SET) < 0)
183*6236dae4SAndroid Build Coastguard Worker     return -1;
184*6236dae4SAndroid Build Coastguard Worker 
185*6236dae4SAndroid Build Coastguard Worker   if(!SetEndOfFile((HANDLE)handle))
186*6236dae4SAndroid Build Coastguard Worker     return -1;
187*6236dae4SAndroid Build Coastguard Worker 
188*6236dae4SAndroid Build Coastguard Worker   return 0;
189*6236dae4SAndroid Build Coastguard Worker }
190*6236dae4SAndroid Build Coastguard Worker 
191*6236dae4SAndroid Build Coastguard Worker #endif /* USE_TOOL_FTRUNCATE */
192*6236dae4SAndroid Build Coastguard Worker 
193*6236dae4SAndroid Build Coastguard Worker #ifdef _WIN32
Curl_execpath(const char * filename,char ** pathp)194*6236dae4SAndroid Build Coastguard Worker FILE *Curl_execpath(const char *filename, char **pathp)
195*6236dae4SAndroid Build Coastguard Worker {
196*6236dae4SAndroid Build Coastguard Worker   static char filebuffer[512];
197*6236dae4SAndroid Build Coastguard Worker   unsigned long len;
198*6236dae4SAndroid Build Coastguard Worker   /* Get the filename of our executable. GetModuleFileName is already declared
199*6236dae4SAndroid Build Coastguard Worker    * via inclusions done in setup header file. We assume that we are using
200*6236dae4SAndroid Build Coastguard Worker    * the ASCII version here.
201*6236dae4SAndroid Build Coastguard Worker    */
202*6236dae4SAndroid Build Coastguard Worker   len = GetModuleFileNameA(0, filebuffer, sizeof(filebuffer));
203*6236dae4SAndroid Build Coastguard Worker   if(len > 0 && len < sizeof(filebuffer)) {
204*6236dae4SAndroid Build Coastguard Worker     /* We got a valid filename - get the directory part */
205*6236dae4SAndroid Build Coastguard Worker     char *lastdirchar = strrchr(filebuffer, DIR_CHAR[0]);
206*6236dae4SAndroid Build Coastguard Worker     if(lastdirchar) {
207*6236dae4SAndroid Build Coastguard Worker       size_t remaining;
208*6236dae4SAndroid Build Coastguard Worker       *lastdirchar = 0;
209*6236dae4SAndroid Build Coastguard Worker       /* If we have enough space, build the RC filename */
210*6236dae4SAndroid Build Coastguard Worker       remaining = sizeof(filebuffer) - strlen(filebuffer);
211*6236dae4SAndroid Build Coastguard Worker       if(strlen(filename) < remaining - 1) {
212*6236dae4SAndroid Build Coastguard Worker         msnprintf(lastdirchar, remaining, "%s%s", DIR_CHAR, filename);
213*6236dae4SAndroid Build Coastguard Worker         *pathp = filebuffer;
214*6236dae4SAndroid Build Coastguard Worker         return fopen(filebuffer, FOPEN_READTEXT);
215*6236dae4SAndroid Build Coastguard Worker       }
216*6236dae4SAndroid Build Coastguard Worker     }
217*6236dae4SAndroid Build Coastguard Worker   }
218*6236dae4SAndroid Build Coastguard Worker 
219*6236dae4SAndroid Build Coastguard Worker   return NULL;
220*6236dae4SAndroid Build Coastguard Worker }
221*6236dae4SAndroid Build Coastguard Worker #endif
222