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));
search_ndbm(db,key,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));
ndbm_search(m,map,key,pval,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));
ndbm_init(map,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