6 #undef NULL /* XXX Why? */
12 # include <rpcsvc/dbm.h>
16 #ifdef DBM_BUG_DUPLICATE_FREE
18 * DBM on at least Ultrix and HPUX call dbmclose() from dbminit(),
19 * resulting in duplicate free() because dbmclose() does *not*
20 * check if it has already been called for this DBM.
21 * If some malloc/free calls have been done between dbmclose() and
22 * the next dbminit(), the memory might be used for something else when
24 * Verified to work on ultrix4.3. Probably will work on HP/UX.
25 * Set DBM_BUG_DUPLICATE_FREE in the extension hint file.
27 /* Close the previous dbm, and fail to open a new dbm */
28 #define dbmclose() ((void) dbminit("/tmp/x/y/z/z/y"))
33 typedef void* ODBM_File;
35 #define odbm_FETCH(db,key) fetch(key)
36 #define odbm_STORE(db,key,value,flags) store(key,value)
37 #define odbm_DELETE(db,key) delete(key)
38 #define odbm_FIRSTKEY(db) firstkey()
39 #define odbm_NEXTKEY(db,key) nextkey(key)
47 MODULE = ODBM_File PACKAGE = ODBM_File PREFIX = odbm_
54 odbm_TIEHASH(dbtype, filename, flags, mode)
63 croak("Old dbm can only open one database");
64 New(0, tmpbuf, strlen(filename) + 5, char);
66 sprintf(tmpbuf,"%s.dir",filename);
67 if (stat(tmpbuf, &statbuf) < 0) {
68 if (flags & O_CREAT) {
69 if (mode < 0 || close(creat(tmpbuf,mode)) < 0)
70 croak("ODBM_File: Can't create %s", filename);
71 sprintf(tmpbuf,"%s.pag",filename);
72 if (close(creat(tmpbuf,mode)) < 0)
73 croak("ODBM_File: Can't create %s", filename);
76 croak("ODBM_FILE: Can't open %s", filename);
78 RETVAL = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
79 ST(0) = sv_mortalcopy(&sv_undef);
80 sv_setptrobj(ST(0), RETVAL, dbtype);
96 odbm_STORE(db, key, value, flags = DBM_REPLACE)
103 if (RETVAL < 0 && errno == EPERM)
104 croak("No write permission to odbm file");
105 croak("odbm store returned %d, errno %d, key \"%s\"",
106 RETVAL,errno,key.dptr);
119 odbm_NEXTKEY(db, key)