#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <rpcsvc/yp.h>
#include "ypdb.h"
extern DBM *
ypdb_open(const char *file, int flags, int mode)
{
BTREEINFO info;
char path[PATH_MAX];
DBM *db;
memset(&info, 0, sizeof info);
info.flags = 0;
info.cachesize = 0;
info.maxkeypage = 0;
info.minkeypage = 0;
info.psize = 0;
info.compare = NULL;
info.prefix = NULL;
info.lorder = 0;
snprintf(path, sizeof(path), "%s%s", file, YPDB_SUFFIX);
db = (DBM *)dbopen(path, flags, mode, DB_BTREE, (void *)&info);
return (db);
}
extern DBM *
ypdb_open_suf(const char *file, int flags, int mode)
{
BTREEINFO info;
DBM *db;
memset(&info, 0, sizeof info);
info.flags = 0;
info.cachesize = 0;
info.maxkeypage = 0;
info.minkeypage = 0;
info.psize = 0;
info.compare = NULL;
info.prefix = NULL;
info.lorder = 0;
db = (DBM *)dbopen(file, flags, mode, DB_BTREE, (void *)&info);
return (db);
}
extern void
ypdb_close(DBM *db)
{
(void)(db->close)(db);
}
extern datum
ypdb_fetch(DBM *db, datum key)
{
datum retval;
DBT nk, nd;
int status;
nk.data = key.dptr;
nk.size = key.dsize;
status = (db->get)(db, &nk, &nd, 0);
if (status) {
retval.dptr = NULL;
retval.dsize = 0;
} else {
retval.dptr = nd.data;
retval.dsize = nd.size;
}
return (retval);
}
extern datum
ypdb_firstkey(DBM *db)
{
int status;
datum retkey;
DBT nk, nd;
status = (db->seq)(db, &nk, &nd, R_FIRST);
if (status) {
retkey.dptr = NULL;
retkey.dsize = 0;
} else {
retkey.dptr = nk.data;
retkey.dsize = nk.size;
}
return (retkey);
}
extern datum
ypdb_nextkey(DBM *db)
{
int status;
datum retkey;
DBT nk, nd;
status = (db->seq)(db, &nk, &nd, R_NEXT);
if (status) {
retkey.dptr = NULL;
retkey.dsize = 0;
} else {
retkey.dptr = nk.data;
retkey.dsize = nk.size;
}
return (retkey);
}
extern datum
ypdb_setkey(DBM *db, datum key)
{
int status;
DBT nk, nd;
nk.data = key.dptr;
nk.size = key.dsize;
status = (db->seq)(db, &nk, &nd, R_CURSOR);
if (status) {
key.dptr = NULL;
key.dsize = 0;
}
return (key);
}
int
ypdb_store(DBM *db, datum key, datum content, int flags)
{
DBT nk, nd;
if (key.dsize > YPMAXRECORD || content.dsize > YPMAXRECORD)
return -1;
nk.data = key.dptr;
nk.size = key.dsize;
nd.data = content.dptr;
nd.size = content.dsize;
return ((db->put)(db, &nk, &nd,
(flags == YPDB_INSERT) ? R_NOOVERWRITE : 0));
}