// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) 2000-2001 Silicon Graphics, Inc. * All Rights Reserved. */ #include "global.h" #ifdef HAVE_GDBM_NDBM_H_ #include #elif HAVE_GDBM_NDBM_H #include #elif HAVE_NDBM_H #include #else bozo! #endif /* #define WorkDir "/xfs" */ #define DBNAME "DBtest" #define DBRECS 100000 #define LOOPS 100 typedef struct _myDB { char data[976]; unsigned short checksum; long align; } myDB; int InitDbmLookup(int); int DoDbmLookup(void); void CleanupDbmLookup(void); void DoSysError(char *, int); int creatDbRec(myDB *); unsigned short calccksum(char *, int); void CkSumError(char *, unsigned short, unsigned short); int InsertKey(unsigned short *, int, unsigned short); void DumpKeys(int, unsigned short); DBM *dbm; int numDbmEntries, keyIdx, Dups = 0, Errors = 0; unsigned short *KeyArray, *DupsArray; int debugflg = 0; /* are we in debugging mode? */ int errflg = 0; /* usage option errors */ int ignoreflg = 1; /* ignore errors in lookup; default = on */ int loops = LOOPS; int randseed = 0; int main(int argc, char *argv[]) { int numrecs = DBRECS, c, l; while ((c = getopt(argc, argv, "idn:l:s:")) != EOF) { switch(c) { case 'i': ignoreflg++; break; case 'd': debugflg++; break; case 'n': numrecs = atoi(optarg); numrecs = (numrecs < 1) ? DBRECS : numrecs; break; case 'l': loops = atoi(optarg); loops = (loops < 1) ? LOOPS : loops; break; case 's': randseed = atoi(optarg); randseed = (randseed < 0) ? 0 : randseed; break; case '?': errflg++; break; } } if (errflg) { printf("Usage: dbtest [-di] [-n number] [-l loop] [-s randseed]\n"); exit(0); } if (optind > argc) { printf("Extra arguments ignored\n"); for ( ; optindchecksum, KeyArray[j]); fflush(stdout); } if (content.dsize == 0) { printf("\nrec #%-8d: key = %4x (%d)\n", i, KeyArray[j], j); fflush(stdout); DoSysError("\ndbm_fetch", content.dsize); } if (dbp->checksum != KeyArray[j]) CkSumError("KeySequential", dbp->checksum, KeyArray[j]); if ((tmpck = calccksum(dbp->data, sizeof(dbp->data))) != KeyArray[j]) CkSumError("DataSequential", tmpck, KeyArray[j]); if (++j >= keyIdx) j = 0; } printf("\n\n\tRandom lookups...\n"); fflush(stdout); for(i=0; ichecksum, KeyArray[n]); fflush(stdout); } if (content.dsize == 0) DoSysError("\ndbm_fetch", content.dsize); if (dbp->checksum != KeyArray[n]) CkSumError("KeyRand", dbp->checksum, KeyArray[n]); if ((tmpck = calccksum(dbp->data, sizeof(dbp->data))) != KeyArray[n]) CkSumError("DataRand", tmpck, KeyArray[n]); } return i; } void CleanupDbmLookup(void) { char filename[100]; int rc; if (debugflg) { printf("dbm_close(dbm)\n"); fflush(stdout); } dbm_close(dbm); sprintf(filename, "%s-%d.dir", DBNAME, (int)getpid()); rc = unlink(filename); if (rc) DoSysError("\nunlink", rc); sprintf(filename, "%s-%d.pag", DBNAME, (int)getpid()); rc = unlink(filename); if (rc) DoSysError("\nunlink", rc); } void DoSysError(char *msg, int rc) { perror(msg); fprintf(stderr, "Bailing out! status = %d\n", rc); exit(-1); } int creatDbRec(myDB *dbp) { static int once = 0; int i, j; long *ptr; long timeseed; if (!once) { once++; if ( !randseed ) { timeseed = time(0); printf("\tusing %ld as seed for srandom()...\n\n", timeseed); srandom(timeseed); } else srandom(randseed); } ptr = (long *)&(dbp->data); j = sizeof(dbp->data) / sizeof(long); for (i=0; i < j; i++, ptr++) { *ptr = random(); } for (i=(j*sizeof(long)); idata); i++) dbp->data[i] = (char)time(0); dbp->checksum = calccksum(dbp->data, sizeof(dbp->data)); return 0; } unsigned short calccksum(char *ptr, int size) { unsigned short sum; int i, n; sum = 0; n = ((size > 100) ? 100 : size); for (i=0; i> 1) + 0x8000; else sum >>= 1; sum += (unsigned short)*ptr; sum &= 0xffff; } return sum; } /*ARGSUSED*/ void CkSumError(char *msg, unsigned short ck1, unsigned short ck2) { Errors++; printf("%s\n\tChecksum error, %u != %u, Total errors = %d\n", msg, ck1, ck2, Errors); exit(1); } int InsertKey(unsigned short *k, int idx, unsigned short val) { /* int i, found=0; */ return( (k[idx] = val) ); /* for (i=0; i