1*b9fc9a72Sderaadt /* $OpenBSD: ypdb.c,v 1.12 2015/01/16 06:40:22 deraadt Exp $ */
2bbfaf3a3Sderaadt
314c399efSderaadt /*
414c399efSderaadt * Copyright (c) 1990, 1993
514c399efSderaadt * The Regents of the University of California. All rights reserved.
614c399efSderaadt * All rights reserved.
714c399efSderaadt *
814c399efSderaadt * This code is derived from software contributed to Berkeley by
914c399efSderaadt * Margo Seltzer.
1014c399efSderaadt *
1114c399efSderaadt * This code is derived from ndbm module of BSD4.4 db (hash) by
1214c399efSderaadt * Mats O Jansson
1314c399efSderaadt *
1414c399efSderaadt * Redistribution and use in source and binary forms, with or without
1514c399efSderaadt * modification, are permitted provided that the following conditions
1614c399efSderaadt * are met:
1714c399efSderaadt * 1. Redistributions of source code must retain the above copyright
1814c399efSderaadt * notice, this list of conditions and the following disclaimer.
1914c399efSderaadt * 2. Redistributions in binary form must reproduce the above copyright
2014c399efSderaadt * notice, this list of conditions and the following disclaimer in the
2114c399efSderaadt * documentation and/or other materials provided with the distribution.
220404cd96Sderaadt * 3. Neither the name of the University nor the names of its contributors
2314c399efSderaadt * may be used to endorse or promote products derived from this software
2414c399efSderaadt * without specific prior written permission.
2514c399efSderaadt *
2614c399efSderaadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
2714c399efSderaadt * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2814c399efSderaadt * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2914c399efSderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
3014c399efSderaadt * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3114c399efSderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3214c399efSderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3314c399efSderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3414c399efSderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3514c399efSderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3614c399efSderaadt * SUCH DAMAGE.
3714c399efSderaadt */
3814c399efSderaadt
3914c399efSderaadt #include <sys/types.h>
4014c399efSderaadt #include <stdio.h>
4114c399efSderaadt #include <string.h>
4214c399efSderaadt
43559011faSmaja #include <rpcsvc/yp.h>
4414c399efSderaadt
45559011faSmaja #include "ypdb.h"
4614c399efSderaadt
4714c399efSderaadt /*
4814c399efSderaadt * Returns:
4914c399efSderaadt * *DBM on success
5014c399efSderaadt * NULL on failure
5114c399efSderaadt */
5214c399efSderaadt extern DBM *
ypdb_open(const char * file,int flags,int mode)5333dd5606Sderaadt ypdb_open(const char *file, int flags, int mode)
5414c399efSderaadt {
5514c399efSderaadt BTREEINFO info;
56*b9fc9a72Sderaadt char path[PATH_MAX];
5714c399efSderaadt DBM *db;
5814c399efSderaadt
598ceb539dSderaadt memset(&info, 0, sizeof info);
6014c399efSderaadt info.flags = 0;
6114c399efSderaadt info.cachesize = 0;
6214c399efSderaadt info.maxkeypage = 0;
6314c399efSderaadt info.minkeypage = 0;
6414c399efSderaadt info.psize = 0;
6514c399efSderaadt info.compare = NULL;
6614c399efSderaadt info.prefix = NULL;
6714c399efSderaadt info.lorder = 0;
68bd5a5e59Schuck snprintf(path, sizeof(path), "%s%s", file, YPDB_SUFFIX);
69559011faSmaja db = (DBM *)dbopen(path, flags, mode, DB_BTREE, (void *)&info);
7014c399efSderaadt return (db);
7114c399efSderaadt }
7214c399efSderaadt
7395a355d8Smaja /*
7495a355d8Smaja * Returns:
7595a355d8Smaja * *DBM on success
7695a355d8Smaja * NULL on failure
7795a355d8Smaja */
7895a355d8Smaja extern DBM *
ypdb_open_suf(const char * file,int flags,int mode)7933dd5606Sderaadt ypdb_open_suf(const char *file, int flags, int mode)
8095a355d8Smaja {
8195a355d8Smaja BTREEINFO info;
8295a355d8Smaja DBM *db;
8395a355d8Smaja
848ceb539dSderaadt memset(&info, 0, sizeof info);
8595a355d8Smaja info.flags = 0;
8695a355d8Smaja info.cachesize = 0;
8795a355d8Smaja info.maxkeypage = 0;
8895a355d8Smaja info.minkeypage = 0;
8995a355d8Smaja info.psize = 0;
9095a355d8Smaja info.compare = NULL;
9195a355d8Smaja info.prefix = NULL;
9295a355d8Smaja info.lorder = 0;
93559011faSmaja db = (DBM *)dbopen(file, flags, mode, DB_BTREE, (void *)&info);
9495a355d8Smaja return (db);
9595a355d8Smaja }
9695a355d8Smaja
9714c399efSderaadt extern void
ypdb_close(DBM * db)9833dd5606Sderaadt ypdb_close(DBM *db)
9914c399efSderaadt {
10014c399efSderaadt (void)(db->close)(db);
10114c399efSderaadt }
10214c399efSderaadt
10314c399efSderaadt /*
10414c399efSderaadt * Returns:
10514c399efSderaadt * DATUM on success
10614c399efSderaadt * NULL on failure
10714c399efSderaadt */
10814c399efSderaadt extern datum
ypdb_fetch(DBM * db,datum key)10933dd5606Sderaadt ypdb_fetch(DBM *db, datum key)
11014c399efSderaadt {
11114c399efSderaadt datum retval;
112559011faSmaja DBT nk, nd;
11314c399efSderaadt int status;
11414c399efSderaadt
115559011faSmaja nk.data = key.dptr;
116559011faSmaja nk.size = key.dsize;
117559011faSmaja
118559011faSmaja status = (db->get)(db, &nk, &nd, 0);
11914c399efSderaadt if (status) {
12014c399efSderaadt retval.dptr = NULL;
12114c399efSderaadt retval.dsize = 0;
122559011faSmaja } else {
123559011faSmaja retval.dptr = nd.data;
124559011faSmaja retval.dsize = nd.size;
12514c399efSderaadt }
12614c399efSderaadt return (retval);
12714c399efSderaadt }
12814c399efSderaadt
12914c399efSderaadt /*
13014c399efSderaadt * Returns:
13114c399efSderaadt * DATUM on success
13214c399efSderaadt * NULL on failure
13314c399efSderaadt */
13414c399efSderaadt
13514c399efSderaadt extern datum
ypdb_firstkey(DBM * db)13633dd5606Sderaadt ypdb_firstkey(DBM *db)
13714c399efSderaadt {
13814c399efSderaadt int status;
139559011faSmaja datum retkey;
140559011faSmaja DBT nk, nd;
14114c399efSderaadt
142559011faSmaja status = (db->seq)(db, &nk, &nd, R_FIRST);
143559011faSmaja if (status) {
14414c399efSderaadt retkey.dptr = NULL;
145559011faSmaja retkey.dsize = 0;
146559011faSmaja } else {
147559011faSmaja retkey.dptr = nk.data;
148559011faSmaja retkey.dsize = nk.size;
149559011faSmaja }
15014c399efSderaadt return (retkey);
15114c399efSderaadt }
15214c399efSderaadt
15314c399efSderaadt /*
15414c399efSderaadt * Returns:
15514c399efSderaadt * DATUM on success
15614c399efSderaadt * NULL on failure
15714c399efSderaadt */
15814c399efSderaadt
15914c399efSderaadt extern datum
ypdb_nextkey(DBM * db)16033dd5606Sderaadt ypdb_nextkey(DBM *db)
16114c399efSderaadt {
16214c399efSderaadt int status;
163559011faSmaja datum retkey;
164559011faSmaja DBT nk, nd;
16514c399efSderaadt
166559011faSmaja status = (db->seq)(db, &nk, &nd, R_NEXT);
167559011faSmaja if (status) {
16814c399efSderaadt retkey.dptr = NULL;
169559011faSmaja retkey.dsize = 0;
170559011faSmaja } else {
171559011faSmaja retkey.dptr = nk.data;
172559011faSmaja retkey.dsize = nk.size;
173559011faSmaja }
17414c399efSderaadt return (retkey);
17514c399efSderaadt }
17614c399efSderaadt
17714c399efSderaadt /*
17814c399efSderaadt * Returns:
17914c399efSderaadt * DATUM on success
18014c399efSderaadt * NULL on failure
18114c399efSderaadt */
18214c399efSderaadt
18314c399efSderaadt extern datum
ypdb_setkey(DBM * db,datum key)18433dd5606Sderaadt ypdb_setkey(DBM *db, datum key)
18514c399efSderaadt {
18614c399efSderaadt int status;
187559011faSmaja DBT nk, nd;
18814c399efSderaadt
189559011faSmaja nk.data = key.dptr;
190559011faSmaja nk.size = key.dsize;
191559011faSmaja status = (db->seq)(db, &nk, &nd, R_CURSOR);
192559011faSmaja if (status) {
19314c399efSderaadt key.dptr = NULL;
194559011faSmaja key.dsize = 0;
195559011faSmaja }
19614c399efSderaadt return (key);
19714c399efSderaadt }
19814c399efSderaadt
19914c399efSderaadt /*
20014c399efSderaadt * Returns:
20114c399efSderaadt * 0 on success
20214c399efSderaadt * <0 failure
20314c399efSderaadt * 1 if YPDB_INSERT and entry exists
20414c399efSderaadt */
20514c399efSderaadt int
ypdb_store(DBM * db,datum key,datum content,int flags)20633dd5606Sderaadt ypdb_store(DBM *db, datum key, datum content, int flags)
20714c399efSderaadt {
208559011faSmaja DBT nk, nd;
209559011faSmaja
210559011faSmaja if (key.dsize > YPMAXRECORD || content.dsize > YPMAXRECORD)
211559011faSmaja return -1;
212559011faSmaja nk.data = key.dptr;
213559011faSmaja nk.size = key.dsize;
214559011faSmaja nd.data = content.dptr;
215559011faSmaja nd.size = content.dsize;
216559011faSmaja return ((db->put)(db, &nk, &nd,
21714c399efSderaadt (flags == YPDB_INSERT) ? R_NOOVERWRITE : 0));
21814c399efSderaadt }
219