|
|
1.1 ! root 1: /* ! 2: * $Source: /afs/athena.mit.edu/astaff/project/kerberos/src/lib/kdb/RCS/krb_lib.c,v $ ! 3: * $Author: jtkohl $ ! 4: * ! 5: * Copyright 1988 by the Massachusetts Institute of Technology. ! 6: * ! 7: * For copying and distribution information, please see the file ! 8: * <mit-copyright.h>. ! 9: */ ! 10: ! 11: #ifndef lint ! 12: static char rcsid_krb_lib_c[] = ! 13: "$Id: krb_lib.c,v 4.7 89/12/14 16:05:00 jtkohl Exp $"; ! 14: #endif lint ! 15: ! 16: #include <mit-copyright.h> ! 17: #include <stdio.h> ! 18: #include <sys/types.h> ! 19: #include <netinet/in.h> ! 20: #include <sys/uio.h> ! 21: #include <sys/time.h> ! 22: #include <sys/resource.h> ! 23: #include <strings.h> ! 24: #include <des.h> ! 25: #include <krb.h> ! 26: #include <krb_db.h> ! 27: ! 28: #ifdef DEBUG ! 29: extern int debug; ! 30: extern char *progname; ! 31: long kerb_debug; ! 32: #endif ! 33: ! 34: extern char *strncpy(); ! 35: extern char *ctime(); ! 36: extern char *getenv(); ! 37: ! 38: static init = 0; ! 39: ! 40: /* ! 41: * initialization routine for data base ! 42: */ ! 43: ! 44: int ! 45: kerb_init() ! 46: { ! 47: #ifdef DEBUG ! 48: if (!init) { ! 49: char *dbg = getenv("KERB_DBG"); ! 50: if (dbg) ! 51: sscanf(dbg, "%d", &kerb_debug); ! 52: init = 1; ! 53: } ! 54: #endif ! 55: kerb_db_init(); ! 56: ! 57: #ifdef CACHE ! 58: kerb_cache_init(); ! 59: #endif ! 60: ! 61: /* successful init, return 0, else errcode */ ! 62: return (0); ! 63: } ! 64: ! 65: /* ! 66: * finalization routine for database -- NOTE: MUST be called by any ! 67: * program using kerb_init. ALSO will have to be modified to finalize ! 68: * caches, if they're ever really implemented. ! 69: */ ! 70: ! 71: int ! 72: kerb_fini() ! 73: { ! 74: kerb_db_fini(); ! 75: } ! 76: ! 77: /* ! 78: * look up a principal in the cache or data base returns number of ! 79: * principals found ! 80: */ ! 81: ! 82: int ! 83: kerb_get_principal(name, inst, principal, max, more) ! 84: char *name; /* could have wild card */ ! 85: char *inst; /* could have wild card */ ! 86: Principal *principal; ! 87: unsigned int max; /* max number of name structs to return */ ! 88: int *more; /* more tuples than room for */ ! 89: ! 90: { ! 91: int found = 0; ! 92: #ifdef CACHE ! 93: static int wild = 0; ! 94: #endif ! 95: if (!init) ! 96: kerb_init(); ! 97: ! 98: #ifdef DEBUG ! 99: if (kerb_debug & 1) ! 100: fprintf(stderr, "\n%s: kerb_get_principal for %s %s max = %d\n", ! 101: progname, name, inst, max); ! 102: #endif ! 103: ! 104: /* ! 105: * if this is a request including a wild card, have to go to db ! 106: * since the cache may not be exhaustive. ! 107: */ ! 108: ! 109: /* clear the principal area */ ! 110: bzero((char *) principal, max * sizeof(Principal)); ! 111: ! 112: #ifdef CACHE ! 113: /* ! 114: * so check to see if the name contains a wildcard "*" or "?", not ! 115: * preceeded by a backslash. ! 116: */ ! 117: wild = 0; ! 118: if (index(name, '*') || index(name, '?') || ! 119: index(inst, '*') || index(inst, '?')) ! 120: wild = 1; ! 121: ! 122: if (!wild) { ! 123: /* try the cache first */ ! 124: found = kerb_cache_get_principal(name, inst, principal, max, more); ! 125: if (found) ! 126: return (found); ! 127: } ! 128: #endif ! 129: /* If we didn't try cache, or it wasn't there, try db */ ! 130: found = kerb_db_get_principal(name, inst, principal, max, more); ! 131: /* try to insert principal(s) into cache if it was found */ ! 132: #ifdef CACHE ! 133: if (found) { ! 134: kerb_cache_put_principal(principal, found); ! 135: } ! 136: #endif ! 137: return (found); ! 138: } ! 139: ! 140: /* principals */ ! 141: kerb_put_principal(principal, n) ! 142: Principal *principal; ! 143: unsigned int n; /* number of principal structs to write */ ! 144: { ! 145: long time(); ! 146: struct tm *tp, *localtime(); ! 147: ! 148: /* set mod date */ ! 149: principal->mod_date = time((long *)0); ! 150: /* and mod date string */ ! 151: ! 152: tp = localtime(&principal->mod_date); ! 153: (void) sprintf(principal->mod_date_txt, "%4d-%2d-%2d", ! 154: tp->tm_year > 1900 ? tp->tm_year : tp->tm_year + 1900, ! 155: tp->tm_mon + 1, tp->tm_mday); /* January is 0, not 1 */ ! 156: #ifdef DEBUG ! 157: if (kerb_debug & 1) { ! 158: int i; ! 159: fprintf(stderr, "\nkerb_put_principal..."); ! 160: for (i = 0; i < n; i++) { ! 161: krb_print_principal(&principal[i]); ! 162: } ! 163: } ! 164: #endif ! 165: /* write database */ ! 166: if (kerb_db_put_principal(principal, n) < 0) { ! 167: #ifdef DEBUG ! 168: if (kerb_debug & 1) ! 169: fprintf(stderr, "\n%s: kerb_db_put_principal err", progname); ! 170: /* watch out for cache */ ! 171: #endif ! 172: return -1; ! 173: } ! 174: #ifdef CACHE ! 175: /* write cache */ ! 176: if (!kerb_cache_put_principal(principal, n)) { ! 177: #ifdef DEBUG ! 178: if (kerb_debug & 1) ! 179: fprintf(stderr, "\n%s: kerb_cache_put_principal err", progname); ! 180: #endif ! 181: return -1; ! 182: } ! 183: #endif ! 184: return 0; ! 185: } ! 186: ! 187: int ! 188: kerb_get_dba(name, inst, dba, max, more) ! 189: char *name; /* could have wild card */ ! 190: char *inst; /* could have wild card */ ! 191: Dba *dba; ! 192: unsigned int max; /* max number of name structs to return */ ! 193: int *more; /* more tuples than room for */ ! 194: ! 195: { ! 196: int found = 0; ! 197: #ifdef CACHE ! 198: static int wild = 0; ! 199: #endif ! 200: if (!init) ! 201: kerb_init(); ! 202: ! 203: #ifdef DEBUG ! 204: if (kerb_debug & 1) ! 205: fprintf(stderr, "\n%s: kerb_get_dba for %s %s max = %d\n", ! 206: progname, name, inst, max); ! 207: #endif ! 208: /* ! 209: * if this is a request including a wild card, have to go to db ! 210: * since the cache may not be exhaustive. ! 211: */ ! 212: ! 213: /* clear the dba area */ ! 214: bzero((char *) dba, max * sizeof(Dba)); ! 215: ! 216: #ifdef CACHE ! 217: /* ! 218: * so check to see if the name contains a wildcard "*" or "?", not ! 219: * preceeded by a backslash. ! 220: */ ! 221: ! 222: wild = 0; ! 223: if (index(name, '*') || index(name, '?') || ! 224: index(inst, '*') || index(inst, '?')) ! 225: wild = 1; ! 226: ! 227: if (!wild) { ! 228: /* try the cache first */ ! 229: found = kerb_cache_get_dba(name, inst, dba, max, more); ! 230: if (found) ! 231: return (found); ! 232: } ! 233: #endif ! 234: /* If we didn't try cache, or it wasn't there, try db */ ! 235: found = kerb_db_get_dba(name, inst, dba, max, more); ! 236: #ifdef CACHE ! 237: /* try to insert dba(s) into cache if it was found */ ! 238: if (found) { ! 239: kerb_cache_put_dba(dba, found); ! 240: } ! 241: #endif ! 242: return (found); ! 243: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.