]> git.saurik.com Git - apple/network_cmds.git/blob - makedbm.tproj/ypdb.c
network_cmds-176.2.1.tar.gz
[apple/network_cmds.git] / makedbm.tproj / ypdb.c
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
74 extern DBM *__hash_open();
75 #else
76 extern DBM *__bt_open();
77 #endif
78
79 /*
80 * Returns:
81 * *DBM on success
82 * NULL on failure
83 */
84
85 extern DBM *
86 ypdb_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
127 extern DBM *
128 ypdb_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
159 extern void
160 ypdb_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
172 extern datum
173 ypdb_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
194 extern datum
195 ypdb_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
213 extern datum
214 ypdb_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
232 extern datum
233 ypdb_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
267 int
268 ypdb_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
288 int
289 ypdb_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