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