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