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 "curl_setup.h"
25*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h>
26*6236dae4SAndroid Build Coastguard Worker #include "testutil.h"
27*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Worker #if defined(_WIN32)
30*6236dae4SAndroid Build Coastguard Worker
tutil_tvnow(void)31*6236dae4SAndroid Build Coastguard Worker struct timeval tutil_tvnow(void)
32*6236dae4SAndroid Build Coastguard Worker {
33*6236dae4SAndroid Build Coastguard Worker /*
34*6236dae4SAndroid Build Coastguard Worker ** GetTickCount() is available on _all_ Windows versions from W95 up
35*6236dae4SAndroid Build Coastguard Worker ** to nowadays. Returns milliseconds elapsed since last system boot,
36*6236dae4SAndroid Build Coastguard Worker ** increases monotonically and wraps once 49.7 days have elapsed.
37*6236dae4SAndroid Build Coastguard Worker */
38*6236dae4SAndroid Build Coastguard Worker struct timeval now;
39*6236dae4SAndroid Build Coastguard Worker DWORD milliseconds = GetTickCount();
40*6236dae4SAndroid Build Coastguard Worker now.tv_sec = (long)(milliseconds / 1000);
41*6236dae4SAndroid Build Coastguard Worker now.tv_usec = (long)((milliseconds % 1000) * 1000);
42*6236dae4SAndroid Build Coastguard Worker return now;
43*6236dae4SAndroid Build Coastguard Worker }
44*6236dae4SAndroid Build Coastguard Worker
45*6236dae4SAndroid Build Coastguard Worker #elif defined(HAVE_CLOCK_GETTIME_MONOTONIC)
46*6236dae4SAndroid Build Coastguard Worker
tutil_tvnow(void)47*6236dae4SAndroid Build Coastguard Worker struct timeval tutil_tvnow(void)
48*6236dae4SAndroid Build Coastguard Worker {
49*6236dae4SAndroid Build Coastguard Worker /*
50*6236dae4SAndroid Build Coastguard Worker ** clock_gettime() is granted to be increased monotonically when the
51*6236dae4SAndroid Build Coastguard Worker ** monotonic clock is queried. Time starting point is unspecified, it
52*6236dae4SAndroid Build Coastguard Worker ** could be the system start-up time, the Epoch, or something else,
53*6236dae4SAndroid Build Coastguard Worker ** in any case the time starting point does not change once that the
54*6236dae4SAndroid Build Coastguard Worker ** system has started up.
55*6236dae4SAndroid Build Coastguard Worker */
56*6236dae4SAndroid Build Coastguard Worker struct timeval now;
57*6236dae4SAndroid Build Coastguard Worker struct timespec tsnow;
58*6236dae4SAndroid Build Coastguard Worker if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
59*6236dae4SAndroid Build Coastguard Worker now.tv_sec = tsnow.tv_sec;
60*6236dae4SAndroid Build Coastguard Worker now.tv_usec = (int)(tsnow.tv_nsec / 1000);
61*6236dae4SAndroid Build Coastguard Worker }
62*6236dae4SAndroid Build Coastguard Worker /*
63*6236dae4SAndroid Build Coastguard Worker ** Even when the configure process has truly detected monotonic clock
64*6236dae4SAndroid Build Coastguard Worker ** availability, it might happen that it is not actually available at
65*6236dae4SAndroid Build Coastguard Worker ** run-time. When this occurs simply fallback to other time source.
66*6236dae4SAndroid Build Coastguard Worker */
67*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_GETTIMEOFDAY
68*6236dae4SAndroid Build Coastguard Worker else
69*6236dae4SAndroid Build Coastguard Worker (void)gettimeofday(&now, NULL);
70*6236dae4SAndroid Build Coastguard Worker #else
71*6236dae4SAndroid Build Coastguard Worker else {
72*6236dae4SAndroid Build Coastguard Worker now.tv_sec = time(NULL);
73*6236dae4SAndroid Build Coastguard Worker now.tv_usec = 0;
74*6236dae4SAndroid Build Coastguard Worker }
75*6236dae4SAndroid Build Coastguard Worker #endif
76*6236dae4SAndroid Build Coastguard Worker return now;
77*6236dae4SAndroid Build Coastguard Worker }
78*6236dae4SAndroid Build Coastguard Worker
79*6236dae4SAndroid Build Coastguard Worker #elif defined(HAVE_GETTIMEOFDAY)
80*6236dae4SAndroid Build Coastguard Worker
tutil_tvnow(void)81*6236dae4SAndroid Build Coastguard Worker struct timeval tutil_tvnow(void)
82*6236dae4SAndroid Build Coastguard Worker {
83*6236dae4SAndroid Build Coastguard Worker /*
84*6236dae4SAndroid Build Coastguard Worker ** gettimeofday() is not granted to be increased monotonically, due to
85*6236dae4SAndroid Build Coastguard Worker ** clock drifting and external source time synchronization it can jump
86*6236dae4SAndroid Build Coastguard Worker ** forward or backward in time.
87*6236dae4SAndroid Build Coastguard Worker */
88*6236dae4SAndroid Build Coastguard Worker struct timeval now;
89*6236dae4SAndroid Build Coastguard Worker (void)gettimeofday(&now, NULL);
90*6236dae4SAndroid Build Coastguard Worker return now;
91*6236dae4SAndroid Build Coastguard Worker }
92*6236dae4SAndroid Build Coastguard Worker
93*6236dae4SAndroid Build Coastguard Worker #else
94*6236dae4SAndroid Build Coastguard Worker
tutil_tvnow(void)95*6236dae4SAndroid Build Coastguard Worker struct timeval tutil_tvnow(void)
96*6236dae4SAndroid Build Coastguard Worker {
97*6236dae4SAndroid Build Coastguard Worker /*
98*6236dae4SAndroid Build Coastguard Worker ** time() returns the value of time in seconds since the Epoch.
99*6236dae4SAndroid Build Coastguard Worker */
100*6236dae4SAndroid Build Coastguard Worker struct timeval now;
101*6236dae4SAndroid Build Coastguard Worker now.tv_sec = time(NULL);
102*6236dae4SAndroid Build Coastguard Worker now.tv_usec = 0;
103*6236dae4SAndroid Build Coastguard Worker return now;
104*6236dae4SAndroid Build Coastguard Worker }
105*6236dae4SAndroid Build Coastguard Worker
106*6236dae4SAndroid Build Coastguard Worker #endif
107*6236dae4SAndroid Build Coastguard Worker
108*6236dae4SAndroid Build Coastguard Worker /*
109*6236dae4SAndroid Build Coastguard Worker * Make sure that the first argument is the more recent time, as otherwise
110*6236dae4SAndroid Build Coastguard Worker * we'll get a weird negative time-diff back...
111*6236dae4SAndroid Build Coastguard Worker *
112*6236dae4SAndroid Build Coastguard Worker * Returns: the time difference in number of milliseconds.
113*6236dae4SAndroid Build Coastguard Worker */
tutil_tvdiff(struct timeval newer,struct timeval older)114*6236dae4SAndroid Build Coastguard Worker long tutil_tvdiff(struct timeval newer, struct timeval older)
115*6236dae4SAndroid Build Coastguard Worker {
116*6236dae4SAndroid Build Coastguard Worker return (long)(newer.tv_sec-older.tv_sec)*1000+
117*6236dae4SAndroid Build Coastguard Worker (long)(newer.tv_usec-older.tv_usec)/1000;
118*6236dae4SAndroid Build Coastguard Worker }
119*6236dae4SAndroid Build Coastguard Worker
120*6236dae4SAndroid Build Coastguard Worker /*
121*6236dae4SAndroid Build Coastguard Worker * Same as tutil_tvdiff but with full usec resolution.
122*6236dae4SAndroid Build Coastguard Worker *
123*6236dae4SAndroid Build Coastguard Worker * Returns: the time difference in seconds with subsecond resolution.
124*6236dae4SAndroid Build Coastguard Worker */
tutil_tvdiff_secs(struct timeval newer,struct timeval older)125*6236dae4SAndroid Build Coastguard Worker double tutil_tvdiff_secs(struct timeval newer, struct timeval older)
126*6236dae4SAndroid Build Coastguard Worker {
127*6236dae4SAndroid Build Coastguard Worker if(newer.tv_sec != older.tv_sec)
128*6236dae4SAndroid Build Coastguard Worker return (double)(newer.tv_sec-older.tv_sec)+
129*6236dae4SAndroid Build Coastguard Worker (double)(newer.tv_usec-older.tv_usec)/1000000.0;
130*6236dae4SAndroid Build Coastguard Worker return (double)(newer.tv_usec-older.tv_usec)/1000000.0;
131*6236dae4SAndroid Build Coastguard Worker }
132*6236dae4SAndroid Build Coastguard Worker
133*6236dae4SAndroid Build Coastguard Worker #ifdef _WIN32
win32_load_system_library(const TCHAR * filename)134*6236dae4SAndroid Build Coastguard Worker HMODULE win32_load_system_library(const TCHAR *filename)
135*6236dae4SAndroid Build Coastguard Worker {
136*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_WINDOWS_UWP
137*6236dae4SAndroid Build Coastguard Worker (void)filename;
138*6236dae4SAndroid Build Coastguard Worker return NULL;
139*6236dae4SAndroid Build Coastguard Worker #else
140*6236dae4SAndroid Build Coastguard Worker size_t filenamelen = _tcslen(filename);
141*6236dae4SAndroid Build Coastguard Worker size_t systemdirlen = GetSystemDirectory(NULL, 0);
142*6236dae4SAndroid Build Coastguard Worker size_t written;
143*6236dae4SAndroid Build Coastguard Worker TCHAR *path;
144*6236dae4SAndroid Build Coastguard Worker
145*6236dae4SAndroid Build Coastguard Worker if(!filenamelen || filenamelen > 32768 ||
146*6236dae4SAndroid Build Coastguard Worker !systemdirlen || systemdirlen > 32768)
147*6236dae4SAndroid Build Coastguard Worker return NULL;
148*6236dae4SAndroid Build Coastguard Worker
149*6236dae4SAndroid Build Coastguard Worker /* systemdirlen includes null character */
150*6236dae4SAndroid Build Coastguard Worker path = malloc(sizeof(TCHAR) * (systemdirlen + 1 + filenamelen));
151*6236dae4SAndroid Build Coastguard Worker if(!path)
152*6236dae4SAndroid Build Coastguard Worker return NULL;
153*6236dae4SAndroid Build Coastguard Worker
154*6236dae4SAndroid Build Coastguard Worker /* if written >= systemdirlen then nothing was written */
155*6236dae4SAndroid Build Coastguard Worker written = GetSystemDirectory(path, (unsigned int)systemdirlen);
156*6236dae4SAndroid Build Coastguard Worker if(!written || written >= systemdirlen)
157*6236dae4SAndroid Build Coastguard Worker return NULL;
158*6236dae4SAndroid Build Coastguard Worker
159*6236dae4SAndroid Build Coastguard Worker if(path[written - 1] != _T('\\'))
160*6236dae4SAndroid Build Coastguard Worker path[written++] = _T('\\');
161*6236dae4SAndroid Build Coastguard Worker
162*6236dae4SAndroid Build Coastguard Worker _tcscpy(path + written, filename);
163*6236dae4SAndroid Build Coastguard Worker
164*6236dae4SAndroid Build Coastguard Worker return LoadLibrary(path);
165*6236dae4SAndroid Build Coastguard Worker #endif
166*6236dae4SAndroid Build Coastguard Worker }
167*6236dae4SAndroid Build Coastguard Worker #endif
168