1 /* 2 * Copyright (c) 1989 Jan-Simon Pendry 3 * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 4 * Copyright (c) 1989, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Jan-Simon Pendry at Imperial College, London. 9 * 10 * %sccs.include.redist.c% 11 * 12 * @(#)info_ndbm.c 8.1 (Berkeley) 06/06/93 13 * 14 * $Id: info_ndbm.c,v 5.2.2.1 1992/02/09 15:08:31 jsp beta $ 15 * 16 */ 17 18 /* 19 * Get info from NDBM map 20 */ 21 22 #include "am.h" 23 24 #ifdef HAS_NDBM_MAPS 25 26 #include <ndbm.h> 27 #include <fcntl.h> 28 #include <sys/stat.h> 29 30 static int search_ndbm P((DBM *db, char *key, char **val)); 31 static int search_ndbm(db, key, val) 32 DBM *db; 33 char *key; 34 char **val; 35 { 36 datum k, v; 37 k.dptr = key; 38 k.dsize = strlen(key) + 1; 39 v = dbm_fetch(db, k); 40 if (v.dptr) { 41 *val = strdup(v.dptr); 42 return 0; 43 } 44 return ENOENT; 45 } 46 47 int ndbm_search P((mnt_map *m, char *map, char *key, char **pval, time_t *tp)); 48 int ndbm_search(m, map, key, pval, tp) 49 mnt_map *m; 50 char *map; 51 char *key; 52 char **pval; 53 time_t *tp; 54 { 55 DBM *db; 56 57 db = dbm_open(map, O_RDONLY, 0); 58 if (db) { 59 struct stat stb; 60 int error; 61 error = fstat(dbm_pagfno(db), &stb); 62 if (!error && *tp < stb.st_mtime) { 63 *tp = stb.st_mtime; 64 error = -1; 65 } else { 66 error = search_ndbm(db, key, pval); 67 } 68 (void) dbm_close(db); 69 return error; 70 } 71 72 return errno; 73 } 74 75 int ndbm_init P((char *map, time_t *tp)); 76 int ndbm_init(map, tp) 77 char *map; 78 time_t *tp; 79 { 80 DBM *db; 81 82 db = dbm_open(map, O_RDONLY, 0); 83 if (db) { 84 struct stat stb; 85 86 if (fstat(dbm_pagfno(db), &stb) < 0) 87 *tp = clocktime(); 88 else 89 *tp = stb.st_mtime; 90 dbm_close(db); 91 return 0; 92 } 93 94 return errno; 95 } 96 97 #endif /* HAS_NDBM_MAPS */ 98