1/* 2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights 7 * Reserved. This file contains Original Code and/or Modifications of 8 * Original Code as defined in and that are subject to the Apple Public 9 * Source License Version 1.0 (the 'License'). You may not use this file 10 * except in compliance with the License. Please obtain a copy of the 11 * License at http://www.apple.com/publicsource and read it before using 12 * this file. 13 * 14 * The Original Code and all software distributed under the License are 15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 19 * License for the specific language governing rights and limitations 20 * under the License." 21 * 22 * @APPLE_LICENSE_HEADER_END@ 23 */ 24/* $OpenBSD: ypdb.c,v 1.5 1997/02/09 09:49:36 maja Exp $ */ 25 26/* 27 * Copyright (c) 1990, 1993 28 * The Regents of the University of California. All rights reserved. 29 * All rights reserved. 30 * 31 * This code is derived from software contributed to Berkeley by 32 * Margo Seltzer. 33 * 34 * This code is derived from ndbm module of BSD4.4 db (hash) by 35 * Mats O Jansson 36 * 37 * Redistribution and use in source and binary forms, with or without 38 * modification, are permitted provided that the following conditions 39 * are met: 40 * 1. Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * 2. Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in the 44 * documentation and/or other materials provided with the distribution. 45 * 3. All advertising materials mentioning features or use of this software 46 * must display the following acknowledgement: 47 * This product includes software developed by the University of 48 * California, Berkeley and its contributors. 49 * 4. Neither the name of the University nor the names of its contributors 50 * may be used to endorse or promote products derived from this software 51 * without specific prior written permission. 52 * 53 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 54 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 55 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 56 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 57 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 58 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 59 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 60 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 61 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 62 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 63 * SUCH DAMAGE. 64 */ 65 66#include <sys/param.h> 67#include <sys/types.h> 68#include <stdio.h> 69#include <string.h> 70 71#include "ypdb.h" 72 73#ifdef YPDB_PATCH 74extern DBM *__hash_open(); 75#else 76extern DBM *__bt_open(); 77#endif 78 79/* 80 * Returns: 81 * *DBM on success 82 * NULL on failure 83 */ 84 85extern DBM * 86ypdb_open(file, flags, mode) 87 const char *file; 88 int flags, mode; 89{ 90#ifdef YPDB_PATCH 91 HASHINFO info; 92 char path[MAXPATHLEN]; 93 94 info.bsize = 4096; 95 info.ffactor = 40; 96 info.nelem = 1; 97 info.cachesize = NULL; 98 info.hash = NULL; 99 info.lorder = 0; 100 snprintf(path, sizeof(path), "%s%s", file, YPDB_SUFFIX); 101 return ((DBM *)__hash_open(path, flags, mode, &info, 0)); 102#else 103 BTREEINFO info; 104 char path[MAXPATHLEN]; 105 DBM *db; 106 107 info.flags = 0; 108 info.cachesize = 0; 109 info.maxkeypage = 0; 110 info.minkeypage = 0; 111 info.psize = 0; 112 info.compare = NULL; 113 info.prefix = NULL; 114 info.lorder = 0; 115 snprintf(path, sizeof(path), "%s%s", file, YPDB_SUFFIX); 116 db = (DBM *)__bt_open(path, flags, mode, &info, 0); 117 return (db); 118#endif 119} 120 121/* 122 * Returns: 123 * *DBM on success 124 * NULL on failure 125 */ 126 127extern DBM * 128ypdb_open_suf(file, flags, mode) 129 const char *file; 130 int flags, mode; 131{ 132#ifdef YPDB_PATCH 133 HASHINFO info; 134 135 info.bsize = 4096; 136 info.ffactor = 40; 137 info.nelem = 1; 138 info.cachesize = NULL; 139 info.hash = NULL; 140 info.lorder = 0; 141 return ((DBM *)__hash_open(file, flags, mode, &info, 0)); 142#else 143 BTREEINFO info; 144 DBM *db; 145 146 info.flags = 0; 147 info.cachesize = 0; 148 info.maxkeypage = 0; 149 info.minkeypage = 0; 150 info.psize = 0; 151 info.compare = NULL; 152 info.prefix = NULL; 153 info.lorder = 0; 154 db = (DBM *)__bt_open(file, flags, mode, &info, 0); 155 return (db); 156#endif 157} 158 159extern void 160ypdb_close(db) 161 DBM *db; 162{ 163 (void)(db->close)(db); 164} 165 166/* 167 * Returns: 168 * DATUM on success 169 * NULL on failure 170 */ 171 172extern datum 173ypdb_fetch(db, key) 174 DBM *db; 175 datum key; 176{ 177 datum retval; 178 int status; 179 180 status = (db->get)(db, (DBT *)&key, (DBT *)&retval, 0); 181 if (status) { 182 retval.dptr = NULL; 183 retval.dsize = 0; 184 } 185 return (retval); 186} 187 188/* 189 * Returns: 190 * DATUM on success 191 * NULL on failure 192 */ 193 194extern datum 195ypdb_firstkey(db) 196 DBM *db; 197{ 198 int status; 199 datum retdata, retkey; 200 201 status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_FIRST); 202 if (status) 203 retkey.dptr = NULL; 204 return (retkey); 205} 206 207/* 208 * Returns: 209 * DATUM on success 210 * NULL on failure 211 */ 212 213extern datum 214ypdb_nextkey(db) 215 DBM *db; 216{ 217 int status; 218 datum retdata, retkey; 219 220 status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_NEXT); 221 if (status) 222 retkey.dptr = NULL; 223 return (retkey); 224} 225 226/* 227 * Returns: 228 * DATUM on success 229 * NULL on failure 230 */ 231 232extern datum 233ypdb_setkey(db, key) 234 DBM *db; 235 datum key; 236{ 237 int status; 238 datum retdata; 239#ifdef YPDB_PATCH 240 datum retkey; 241 242 status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_FIRST); 243 if (status) 244 retkey.dptr = NULL; 245 while ((retkey.dptr != NULL) && 246 ((retkey.dsize != key.dsize) || 247 (strncmp(key.dptr,retkey.dptr,retkey.dsize) != 0))) { 248 status = (db->seq)(db, (DBT *)&retkey, (DBT *)&retdata, R_NEXT); 249 if (status) 250 retkey.dptr = NULL; 251 }; 252 return (retkey); 253#else 254 status = (db->seq)(db, (DBT *)&key, (DBT *)&retdata, R_CURSOR); 255 if (status) 256 key.dptr = NULL; 257 return (key); 258#endif 259} 260 261/* 262 * Returns: 263 * 0 on success 264 * <0 failure 265 */ 266 267int 268ypdb_delete(db, key) 269 DBM *db; 270 datum key; 271{ 272 int status; 273 274 status = (db->del)(db, (DBT *)&key, 0); 275 if (status) 276 return (-1); 277 else 278 return (0); 279} 280 281/* 282 * Returns: 283 * 0 on success 284 * <0 failure 285 * 1 if YPDB_INSERT and entry exists 286 */ 287 288int 289ypdb_store(db, key, content, flags) 290 DBM *db; 291 datum key, content; 292 int flags; 293{ 294 return ((db->put)(db, (DBT *)&key, (DBT *)&content, 295 (flags == YPDB_INSERT) ? R_NOOVERWRITE : 0)); 296} 297 298