This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perl5.000 patch.0i: fix glaring mistakes in patches a-h
[perl5.git] / ext / ODBM_File / ODBM_File.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #ifdef NULL
6 #undef NULL
7 #endif
8 #include <dbm.h>
9
10 #include <fcntl.h>
11
12 typedef void* ODBM_File;
13
14 #define odbm_FETCH(db,key)                      fetch(key)
15 #define odbm_STORE(db,key,value,flags)          store(key,value)
16 #define odbm_DELETE(db,key)                     delete(key)
17 #define odbm_FIRSTKEY(db)                       firstkey()
18 #define odbm_NEXTKEY(db,key)                    nextkey(key)
19
20 static int dbmrefcnt;
21
22 #ifndef DBM_REPLACE
23 #define DBM_REPLACE 0
24 #endif
25
26 MODULE = ODBM_File      PACKAGE = ODBM_File     PREFIX = odbm_
27
28 ODBM_File
29 odbm_TIEHASH(dbtype, filename, flags, mode)
30         char *          dbtype
31         char *          filename
32         int             flags
33         int             mode
34         CODE:
35         {
36             char tmpbuf[1025];
37             if (dbmrefcnt++)
38                 croak("Old dbm can only open one database");
39             sprintf(tmpbuf,"%s.dir",filename);
40             if (stat(tmpbuf, &statbuf) < 0) {
41                 if (flags & O_CREAT) {
42                     if (mode < 0 || close(creat(tmpbuf,mode)) < 0)
43                         croak("ODBM_File: Can't create %s", filename);
44                     sprintf(tmpbuf,"%s.pag",filename);
45                     if (close(creat(tmpbuf,mode)) < 0)
46                         croak("ODBM_File: Can't create %s", filename);
47                 }
48                 else
49                     croak("ODBM_FILE: Can't open %s", filename);
50             }
51             RETVAL = (void*)(dbminit(filename) >= 0 ? &dbmrefcnt : 0);
52             ST(0) = sv_mortalcopy(&sv_undef);
53             sv_setptrobj(ST(0), RETVAL, "ODBM_File");
54         }
55
56 void
57 DESTROY(db)
58         ODBM_File       db
59         CODE:
60         dbmrefcnt--;
61         dbmclose();
62
63 datum
64 odbm_FETCH(db, key)
65         ODBM_File       db
66         datum           key
67
68 int
69 odbm_STORE(db, key, value, flags = DBM_REPLACE)
70         ODBM_File       db
71         datum           key
72         datum           value
73         int             flags
74     CLEANUP:
75         if (RETVAL) {
76             if (RETVAL < 0 && errno == EPERM)
77                 croak("No write permission to odbm file");
78             warn("odbm store returned %d, errno %d, key \"%s\"",
79                         RETVAL,errno,key.dptr);
80         }
81
82 int
83 odbm_DELETE(db, key)
84         ODBM_File       db
85         datum           key
86
87 datum
88 odbm_FIRSTKEY(db)
89         ODBM_File       db
90
91 datum
92 odbm_NEXTKEY(db, key)
93         ODBM_File       db
94         datum           key
95