| OLD | NEW |
| (Empty) |
| 1 /* crypto/tmdiff.c */ | |
| 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | |
| 3 * All rights reserved. | |
| 4 * | |
| 5 * This package is an SSL implementation written | |
| 6 * by Eric Young (eay@cryptsoft.com). | |
| 7 * The implementation was written so as to conform with Netscapes SSL. | |
| 8 * | |
| 9 * This library is free for commercial and non-commercial use as long as | |
| 10 * the following conditions are aheared to. The following conditions | |
| 11 * apply to all code found in this distribution, be it the RC4, RSA, | |
| 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation | |
| 13 * included with this distribution is covered by the same copyright terms | |
| 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). | |
| 15 * | |
| 16 * Copyright remains Eric Young's, and as such any Copyright notices in | |
| 17 * the code are not to be removed. | |
| 18 * If this package is used in a product, Eric Young should be given attribution | |
| 19 * as the author of the parts of the library used. | |
| 20 * This can be in the form of a textual message at program startup or | |
| 21 * in documentation (online or textual) provided with the package. | |
| 22 * | |
| 23 * Redistribution and use in source and binary forms, with or without | |
| 24 * modification, are permitted provided that the following conditions | |
| 25 * are met: | |
| 26 * 1. Redistributions of source code must retain the copyright | |
| 27 * notice, this list of conditions and the following disclaimer. | |
| 28 * 2. Redistributions in binary form must reproduce the above copyright | |
| 29 * notice, this list of conditions and the following disclaimer in the | |
| 30 * documentation and/or other materials provided with the distribution. | |
| 31 * 3. All advertising materials mentioning features or use of this software | |
| 32 * must display the following acknowledgement: | |
| 33 * "This product includes cryptographic software written by | |
| 34 * Eric Young (eay@cryptsoft.com)" | |
| 35 * The word 'cryptographic' can be left out if the rouines from the library | |
| 36 * being used are not cryptographic related :-). | |
| 37 * 4. If you include any Windows specific code (or a derivative thereof) from | |
| 38 * the apps directory (application code) you must include an acknowledgement: | |
| 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | |
| 40 * | |
| 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | |
| 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |
| 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 51 * SUCH DAMAGE. | |
| 52 * | |
| 53 * The licence and distribution terms for any publically available version or | |
| 54 * derivative of this code cannot be changed. i.e. this code cannot simply be | |
| 55 * copied and put under another distribution licence | |
| 56 * [including the GNU Public Licence.] | |
| 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(OPEN
SSL_SYS_VMS) || defined(__DECC)) && !defined(OPENSSL_SYS_MACOSX_RHAPSODY) && !de
fined(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 /* Depending on the VMS version, the tms structure is perhaps defined. | |
| 88 The __TMS macro will show if it was. If it wasn't defined, we should | |
| 89 undefine TIMES, since that tells the rest of the program how things | |
| 90 should be handled. -- Richard Levitte */ | |
| 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_NET
WARE) | |
| 102 #include <sys/timeb.h> | |
| 103 #endif | |
| 104 | |
| 105 #ifdef OPENSSL_SYS_WIN32 | |
| 106 #include <windows.h> | |
| 107 #endif | |
| 108 | |
| 109 /* The following if from times(3) man page. It may need to be changed */ | |
| 110 #ifndef HZ | |
| 111 # if defined(_SC_CLK_TCK) \ | |
| 112 && (!defined(OPENSSL_SYS_VMS) || __CTRL_VER >= 70000000) | |
| 113 /* # define HZ ((double)sysconf(_SC_CLK_TCK)) */ | |
| 114 # define HZ sysconf(_SC_CLK_TCK) | |
| 115 # else | |
| 116 # ifndef CLK_TCK | |
| 117 # ifndef _BSD_CLK_TCK_ /* FreeBSD hack */ | |
| 118 # define HZ 100.0 | |
| 119 # else /* _BSD_CLK_TCK_ */ | |
| 120 # define HZ ((double)_BSD_CLK_TCK_) | |
| 121 # endif | |
| 122 # else /* CLK_TCK */ | |
| 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 | |
| OLD | NEW |