1/* $NetBSD: info_ndbm.c,v 1.1.1.2 2009/03/20 20:26:49 christos Exp $ */ 2 3/* 4 * Copyright (c) 1997-2009 Erez Zadok 5 * Copyright (c) 1989 Jan-Simon Pendry 6 * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 7 * Copyright (c) 1989 The Regents of the University of California. 8 * All rights reserved. 9 * 10 * This code is derived from software contributed to Berkeley by 11 * Jan-Simon Pendry at Imperial College, London. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. All advertising materials mentioning features or use of this software 22 * must display the following acknowledgment: 23 * This product includes software developed by the University of 24 * California, Berkeley and its contributors. 25 * 4. Neither the name of the University nor the names of its contributors 26 * may be used to endorse or promote products derived from this software 27 * without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * SUCH DAMAGE. 40 * 41 * 42 * File: am-utils/amd/info_ndbm.c 43 * 44 */ 45 46/* 47 * Get info from NDBM map 48 */ 49 50#ifdef HAVE_CONFIG_H 51# include <config.h> 52#endif /* HAVE_CONFIG_H */ 53#include <am_defs.h> 54#include <amd.h> 55#include <sun_map.h> 56 57/* forward declarations */ 58int ndbm_init(mnt_map *m, char *map, time_t *tp); 59int ndbm_mtime(mnt_map *m, char *map, time_t *tp); 60int ndbm_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp); 61 62 63static int 64search_ndbm(mnt_map *m, DBM *db, char *key, char **val) 65{ 66 datum k, v; 67 68 k.dptr = key; 69 k.dsize = strlen(key) + 1; 70 v = dbm_fetch(db, k); 71 if (v.dptr) { 72 if (m->cfm && (m->cfm->cfm_flags & CFM_SUN_MAP_SYNTAX)) 73 *val = sun_entry2amd(key, v.dptr); 74 else 75 *val = strdup(v.dptr); 76 return 0; 77 } 78 return ENOENT; 79} 80 81 82int 83ndbm_search(mnt_map *m, char *map, char *key, char **pval, time_t *tp) 84{ 85 DBM *db; 86 87 db = dbm_open(map, O_RDONLY, 0); 88 if (db) { 89 struct stat stb; 90 int error; 91#ifdef DBM_SUFFIX 92 char dbfilename[256]; 93 94 xstrlcpy(dbfilename, map, sizeof(dbfilename)); 95 xstrlcat(dbfilename, DBM_SUFFIX, sizeof(dbfilename)); 96 error = stat(dbfilename, &stb); 97#else /* not DBM_SUFFIX */ 98 error = fstat(dbm_pagfno(db), &stb); 99#endif /* not DBM_SUFFIX */ 100 if (!error && *tp < stb.st_mtime) { 101 *tp = stb.st_mtime; 102 error = -1; 103 } else { 104 error = search_ndbm(m, db, key, pval); 105 } 106 (void) dbm_close(db); 107 return error; 108 } 109 return errno; 110} 111 112 113int 114ndbm_init(mnt_map *m, char *map, time_t *tp) 115{ 116 DBM *db; 117 118 db = dbm_open(map, O_RDONLY, 0); 119 if (db) { 120 struct stat stb; 121 int error; 122#ifdef DBM_SUFFIX 123 char dbfilename[256]; 124 125 xstrlcpy(dbfilename, map, sizeof(dbfilename)); 126 xstrlcat(dbfilename, DBM_SUFFIX, sizeof(dbfilename)); 127 error = stat(dbfilename, &stb); 128#else /* not DBM_SUFFIX */ 129 error = fstat(dbm_pagfno(db), &stb); 130#endif /* not DBM_SUFFIX */ 131 if (error < 0) 132 *tp = clocktime(NULL); 133 else 134 *tp = stb.st_mtime; 135 dbm_close(db); 136 return 0; 137 } 138 return errno; 139} 140 141 142int 143ndbm_mtime(mnt_map *m, char *map, time_t *tp) 144{ 145 return ndbm_init(m,map, tp); 146} 147