(linenum→info "unix/slp.c:2238")

openssl/0.9.8g/crypto/tmdiff.c

    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(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: /* 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_NETWARE)
  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: 
Syntax (Markdown)