mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			154 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * This fcrypt/crypt speed testing program
 | 
						|
 * is derived from one floating around in
 | 
						|
 * the net. It's distributed along with
 | 
						|
 * UFC-crypt but is not covered by any
 | 
						|
 * licence.
 | 
						|
 *
 | 
						|
 * @(#)speeds.c	1.11 20 Aug 1996
 | 
						|
 */
 | 
						|
 | 
						|
#include <signal.h>
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
#ifndef SIGVTALRM
 | 
						|
/*
 | 
						|
 * patch from chip@chinacat.unicom.com (Chip Rosenthal):
 | 
						|
 * you may enable it if your system does not include
 | 
						|
 * a setitimer() function. You'll have to ensure the
 | 
						|
 * existence an environment variable: HZ giving how many
 | 
						|
 * ticks goes per second.
 | 
						|
 * If not existing in your default environment 50, 60
 | 
						|
 * or even 100 may be the right value. Perhaps you should
 | 
						|
 * then use 'time ./ufc 10000' instead of guessing.
 | 
						|
 */
 | 
						|
#define NO_ITIMER
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef NO_ITIMER
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/times.h>
 | 
						|
#else
 | 
						|
#include <sys/time.h>
 | 
						|
#endif
 | 
						|
 | 
						|
static int cnt;
 | 
						|
#ifdef NO_ITIMER
 | 
						|
char *hz;
 | 
						|
struct tms tstart, tfinish;
 | 
						|
#endif
 | 
						|
#define ITIME	10		/* Number of seconds to run test. */
 | 
						|
 | 
						|
char *crypt(), *fcrypt();
 | 
						|
 | 
						|
void
 | 
						|
Stop (void)
 | 
						|
{
 | 
						|
    double elapsed;
 | 
						|
#ifdef NO_ITIMER
 | 
						|
    (void) times(&tfinish);
 | 
						|
    elapsed = ((tfinish.tms_utime + tfinish.tms_stime) -
 | 
						|
	(tstart.tms_utime + tstart.tms_stime)) / atoi(hz);
 | 
						|
    printf("elapsed time = %d sec,  CPU time = %f sec\n", ITIME, elapsed);
 | 
						|
#else
 | 
						|
    elapsed = ITIME;
 | 
						|
#endif
 | 
						|
    printf ("Did %f %s()s per second.\n", ((float) cnt) / elapsed,
 | 
						|
#if defined(FCRYPT)
 | 
						|
	    "fcrypt"
 | 
						|
#else
 | 
						|
	    "crypt"
 | 
						|
#endif
 | 
						|
    );
 | 
						|
    exit (0);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Silly rewrite of 'bzero'. I do so
 | 
						|
 * because some machines don't have
 | 
						|
 * bzero and some don't have memset.
 | 
						|
 */
 | 
						|
 | 
						|
static void clearmem(start, cnt)
 | 
						|
  char *start;
 | 
						|
  int cnt;
 | 
						|
  { while(cnt--)
 | 
						|
      *start++ = '\0';
 | 
						|
  }
 | 
						|
 | 
						|
main (void)
 | 
						|
{
 | 
						|
   char *s;
 | 
						|
#ifdef NO_ITIMER
 | 
						|
    extern char *getenv();
 | 
						|
#else
 | 
						|
    struct itimerval itv;
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef NO_ITIMER
 | 
						|
    if ((hz = getenv("HZ")) == NULL) {
 | 
						|
	fprintf(stderr, "HZ environment parameter undefined\n");
 | 
						|
	exit(1);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef FCRYPT
 | 
						|
    printf("\n");
 | 
						|
    printf("Warning: this version of the speed program may run slower when\n");
 | 
						|
    printf("benchmarking UFC-crypt than previous versions. This is because it\n");
 | 
						|
    printf("stresses the CPU hardware cache in order to get benchmark figures\n");
 | 
						|
    printf("that corresponds closer to the performance that can be expected in\n");
 | 
						|
    printf("a password cracker.\n\n");
 | 
						|
#endif
 | 
						|
 | 
						|
    printf ("Running %s for %d seconds of virtual time ...\n",
 | 
						|
#ifdef FCRYPT
 | 
						|
    "UFC-crypt",
 | 
						|
#else
 | 
						|
    "crypt(libc)",
 | 
						|
#endif
 | 
						|
	    ITIME);
 | 
						|
 | 
						|
#ifdef FCRYPT
 | 
						|
    init_des ();
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef NO_ITIMER
 | 
						|
    signal(SIGALRM, Stop);
 | 
						|
    switch (fork()) {
 | 
						|
    case -1:
 | 
						|
	perror("fork failed");
 | 
						|
	exit(1);
 | 
						|
    case 0:
 | 
						|
	sleep(10);
 | 
						|
	kill(getppid(), SIGALRM);
 | 
						|
	exit(0);
 | 
						|
    default:
 | 
						|
	(void) times(&tstart);
 | 
						|
    }
 | 
						|
#else
 | 
						|
    clearmem ((char*)&itv, (int)sizeof (itv));
 | 
						|
    signal (SIGVTALRM, Stop);
 | 
						|
    itv.it_value.tv_sec = ITIME;
 | 
						|
    itv.it_value.tv_usec = 0;
 | 
						|
    setitimer (ITIMER_VIRTUAL, &itv, NULL);
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
    s = "fredred";
 | 
						|
    for (cnt = 0;; cnt++)
 | 
						|
    {
 | 
						|
#ifdef FCRYPT
 | 
						|
	s = fcrypt (s, "eek");
 | 
						|
#else
 | 
						|
	s = crypt (s, "eek");
 | 
						|
#endif
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |