1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58: #include <stdio.h>
59: #include <stdlib.h>
60: #include "cryptlib.h"
61: #include <openssl/tmdiff.h>
62: #if !defined(OPENSSL_SYS_MSDOS)
63: #include OPENSSL_UNISTD
64: #endif
65:
66: #ifdef TIMEB
67: #undef OPENSSL_SYS_WIN32
68: #undef TIMES
69: #endif
70:
71: #if !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32) && !(defined(OPENSSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX_RHAPSODY) && !defined(OPENSSL_SYS_VXWORKS)
72: # define TIMES
73: #endif
74:
75: #ifdef OPENSSL_SYS_NETWARE
76: #undef TIMES
77: #endif
78:
79: #if !defined(_IRIX) || defined (OPENSSL_SYS_NETWARE)
80: # include <time.h>
81: #endif
82: #ifdef TIMES
83: # include <sys/types.h>
84: # include <sys/times.h>
85: #endif
86:
87:
88:
89:
90:
91: #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__TMS)
92: #undef TIMES
93: #endif
94:
95: #if defined(sun) || defined(__ultrix)
96: #define _POSIX_SOURCE
97: #include <limits.h>
98: #include <sys/param.h>
99: #endif
100:
101: #if !defined(TIMES) && !defined(OPENSSL_SYS_VXWORKS) && !defined(OPENSSL_SYS_NETWARE)
102: #include <sys/timeb.h>
103: #endif
104:
105: #ifdef OPENSSL_SYS_WIN32
106: #include <windows.h>
107: #endif
108:
109:
110: #ifndef HZ
111: # if defined(_SC_CLK_TCK) \
112: && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000)
113:
114: # define HZ sysconf(_SC_CLK_TCK)
115: # else
116: # ifndef CLK_TCK
117: # ifndef _BSD_CLK_TCK_
118: # define HZ 100.0
119: # else
120: # define HZ ((double)_BSD_CLK_TCK_)
121: # endif
122: # else
123: # define HZ ((double)CLK_TCK)
124: # endif
125: # endif
126: #endif
127:
128: struct ms_tm
129: {
130: #ifdef TIMES
131: struct tms ms_tms;
132: #else
133: # ifdef OPENSSL_SYS_WIN32
134: HANDLE thread_id;
135: FILETIME ms_win32;
136: # elif defined (OPENSSL_SYS_NETWARE)
137: clock_t ms_clock;
138: # else
139: # ifdef OPENSSL_SYS_VXWORKS
140: unsigned long ticks;
141: # else
142: struct timeb ms_timeb;
143: # endif
144: # endif
145: #endif
146: };
147:
148: MS_TM *ms_time_new(void)
149: {
150: MS_TM *ret;
151:
152: ret=(MS_TM *)OPENSSL_malloc(sizeof(MS_TM));
153: if (ret == NULL)
154: return(NULL);
155: memset(ret,0,sizeof(MS_TM));
156: #ifdef OPENSSL_SYS_WIN32
157: ret->thread_id=GetCurrentThread();
158: #endif
159: return ret;
160: }
161:
162: void ms_time_free(MS_TM *a)
163: {
164: if (a != NULL)
165: OPENSSL_free(a);
166: }
167:
168: void ms_time_get(MS_TM *tm)
169: {
170: #ifdef OPENSSL_SYS_WIN32
171: FILETIME tmpa,tmpb,tmpc;
172: #endif
173:
174: #ifdef TIMES
175: times(&tm->ms_tms);
176: #else
177: # ifdef OPENSSL_SYS_WIN32
178: GetThreadTimes(tm->thread_id,&tmpa,&tmpb,&tmpc,&(tm->ms_win32));
179: # elif defined (OPENSSL_SYS_NETWARE)
180: tm->ms_clock = clock();
181: # else
182: # ifdef OPENSSL_SYS_VXWORKS
183: tm->ticks = tickGet();
184: # else
185: ftime(&tm->ms_timeb);
186: # endif
187: # endif
188: #endif
189: }
190:
191: double ms_time_diff(MS_TM *a, MS_TM *b)
192: {
193: double ret;
194:
195: #ifdef TIMES
196: ret = HZ;
197: ret = (b->ms_tms.tms_utime-a->ms_tms.tms_utime) / ret;
198: #else
199: # ifdef OPENSSL_SYS_WIN32
200: {
201: #ifdef __GNUC__
202: signed long long la,lb;
203: #else
204: signed _int64 la,lb;
205: #endif
206: la=a->ms_win32.dwHighDateTime;
207: lb=b->ms_win32.dwHighDateTime;
208: la<<=32;
209: lb<<=32;
210: la+=a->ms_win32.dwLowDateTime;
211: lb+=b->ms_win32.dwLowDateTime;
212: ret=((double)(lb-la))/1e7;
213: }
214: # elif defined (OPENSSL_SYS_NETWARE)
215: ret= (double)(b->ms_clock - a->ms_clock);
216: # else
217: # ifdef OPENSSL_SYS_VXWORKS
218: ret = (double)(b->ticks - a->ticks) / (double)sysClkRateGet();
219: # else
220: ret= (double)(b->ms_timeb.time-a->ms_timeb.time)+
221: (((double)b->ms_timeb.millitm)-
222: ((double)a->ms_timeb.millitm))/1000.0;
223: # endif
224: # endif
225: #endif
226: return((ret < 0.0000001)?0.0000001:ret);
227: }
228:
229: int ms_time_cmp(const MS_TM *a, const MS_TM *b)
230: {
231: double d;
232: int ret;
233:
234: #ifdef TIMES
235: d = HZ;
236: d = (b->ms_tms.tms_utime-a->ms_tms.tms_utime) / d;
237: #else
238: # ifdef OPENSSL_SYS_WIN32
239: d =(b->ms_win32.dwHighDateTime&0x000fffff)*10+b->ms_win32.dwLowDateTime/1e7;
240: d-=(a->ms_win32.dwHighDateTime&0x000fffff)*10+a->ms_win32.dwLowDateTime/1e7;
241: # elif defined (OPENSSL_SYS_NETWARE)
242: d= (double)(b->ms_clock - a->ms_clock);
243: # else
244: # ifdef OPENSSL_SYS_VXWORKS
245: d = (b->ticks - a->ticks);
246: # else
247: d= (double)(b->ms_timeb.time-a->ms_timeb.time)+
248: (((double)b->ms_timeb.millitm)-(double)a->ms_timeb.millitm)/1000.0;
249: # endif
250: # endif
251: #endif
252: if (d == 0.0)
253: ret=0;
254: else if (d < 0)
255: ret= -1;
256: else
257: ret=1;
258: return(ret);
259: }
260: