aboutsummaryrefslogtreecommitdiff
path: root/lang/siod/files/patch-ndbm
blob: f6d240858752f888c393870e719c695b3bf4bc37 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
--- ndbm.c	2014-03-25 04:10:42.000000000 -0400
+++ ndbm.c	2021-02-16 21:28:56.638550000 -0500
@@ -7,5 +7,9 @@
 #include <sys/types.h>
 #endif
-
+#ifdef dbm_pagfno
+#include <fcntl.h>
+#undef dbm_pagfno
+#define dbm_pagfno dbm_dirfno
+#endif
 
 static void init_ndbm_version(void)
@@ -14,11 +18,11 @@
 	NIL);}
 
-long tc_dbm = 0;
+static long tc_dbm = 0;
 
-DBM *get_DBM(LISP ptr,int errflg)
+static DBM *get_DBM(LISP ptr,int errflg)
 {DBM *p;
  if (NTYPEP(ptr,tc_dbm))
    err("not a DBM",ptr);
- if ((p = (DBM *) ptr->storage_as.string.data))
+ if ((p = (DBM *)(void *)ptr->storage_as.string.data))
    return(p);
  else if (errflg)
@@ -26,8 +30,8 @@
  return(NULL);}
 
-LISP ldbm_open(LISP lfname,LISP lflags,LISP lmode)
+static LISP ldbm_open(LISP lfname,LISP lflags,LISP lmode)
 {mode_t mode;
  int flags;
- char *fname;
+ const char *fname;
  long iflag;
  LISP result;
@@ -45,5 +49,5 @@
  return(result);}
 
-LISP ldbm_close(LISP ldbm)
+static LISP ldbm_close(LISP ldbm)
 {long iflag;
  DBM *db;
@@ -64,14 +68,11 @@
     return(result);}}
 
-LISP ldbm_fetch(LISP ldbm,LISP lkey)
+static LISP ldbm_fetch(LISP ldbm, LISP lkey)
 {long iflag;
  DBM *db;
- char *key;
- long keysize;
  datum dat1,dat2;
  db = get_DBM(ldbm,1);
- key = get_c_string_dim(lkey,&keysize);
- dat1.dptr = key;
- dat1.dsize = keysize;
+ dat1.dptr = get_string_data(lkey);
+ dat1.dsize = lkey->storage_as.string.dim;
  iflag = no_interrupt(1);
  dat2 = dbm_fetch(db,dat1);
@@ -79,5 +80,5 @@
  return(cons_from_datum(&dat2));}
 
-LISP ldbm_firstkey(LISP ldbm)
+static LISP ldbm_firstkey(LISP ldbm)
 {long iflag;
  DBM *db;
@@ -89,5 +90,5 @@
  return(cons_from_datum(&dat));}
 
-LISP ldbm_nextkey(LISP ldbm)
+static LISP ldbm_nextkey(LISP ldbm)
 {long iflag;
  DBM *db;
@@ -99,14 +100,11 @@
  return(cons_from_datum(&dat));}
 
-LISP ldbm_delete(LISP ldbm,LISP lkey)
+static LISP ldbm_delete(LISP ldbm, LISP lkey)
 {long iflag,status;
  DBM *db;
- char *key;
- long keysize;
  datum dat;
  db = get_DBM(ldbm,1);
- key = get_c_string_dim(lkey,&keysize);
- dat.dptr = key;
- dat.dsize = keysize;
+ dat.dptr = get_string_data(lkey);
+ dat.dsize = lkey->storage_as.string.dim;
  iflag = no_interrupt(1);
  status = dbm_delete(db,dat);
@@ -116,19 +114,15 @@
  return(NIL);}
 
-LISP ldbm_store(LISP ldb,LISP lkey,LISP ldata,LISP lflags)
+static LISP ldbm_store(LISP ldb, LISP lkey, LISP ldata, LISP lflags)
 {long iflag,status;
  DBM *db;
- char *key,*data;
- long keysize,datasize;
  datum dat1,dat2;
  int flags;
  db = get_DBM(ldb,1);
- key = get_c_string_dim(lkey,&keysize);
- data = get_c_string_dim(ldata,&datasize);
  flags = NULLP(lflags) ? 0 : get_c_long(lflags);
- dat1.dptr = key;
- dat1.dsize = keysize;
- dat2.dptr = data;
- dat2.dsize = datasize;
+ dat1.dptr = get_string_data(lkey);
+ dat1.dsize = lkey->storage_as.string.dim;
+ dat2.dptr = get_string_data(ldata);
+ dat2.dsize = ldata->storage_as.string.dim;
  iflag = no_interrupt(1);
  status = dbm_store(db,dat1,dat2,flags);
@@ -141,11 +135,11 @@
    return(a_true_value());}
 
-LISP ldbm_dirfno(LISP ldb)
+static LISP ldbm_dirfno(LISP ldb)
 {return(flocons(dbm_dirfno(get_DBM(ldb,1))));}
 
-LISP ldbm_pagfno(LISP ldb)
+static LISP ldbm_pagfno(LISP ldb)
 {return(flocons(dbm_pagfno(get_DBM(ldb,1))));}
 
-void dbm_gc_free(LISP ptr)
+static void dbm_gc_free(LISP ptr)
 {DBM *p;
  if ((p = get_DBM(ptr,0)))
@@ -153,5 +147,5 @@
  ptr->storage_as.string.data = NULL;}
 
-void dbm_prin1(LISP ptr,struct gen_printio *f)
+static void dbm_prin1(LISP ptr,struct gen_printio *f)
 {char buff[256];
  DBM *p;
@@ -160,10 +154,26 @@
  gput_st(f,buff);}
 
-LISP ldbm_rdonly(LISP ldb)
-{return((dbm_rdonly(get_DBM(ldb,1))) ? a_true_value() : NIL);}
+static LISP ldbm_rdonly(LISP ldb)
+{
+#ifdef dbm_pagfno
+	/*
+	 * On BSD, for example, ndbm is emulated using db,
+	 * and does not provide dbm_rdonly(). We emulate
+	 * it by looking at the database's file-descriptor.
+	 * XXX Untested!
+	 */
+	int fd = dbm_dirfno(get_DBM(ldb, 1));
+	return (fcntl(fd, F_GETFL) & O_ACCMODE) == O_RDONLY ?
+	    a_true_value() : NIL;
+#else
+	return((dbm_rdonly(get_DBM(ldb,1))) ? a_true_value() : NIL);
+#endif
+}
 
-LISP ldbm_error(LISP ldb)
+static LISP ldbm_error(LISP ldb)
 {return((dbm_error(get_DBM(ldb,1))) ? a_true_value() : NIL);}
 
+void init_ndbm(void);	/* init_FOO is the only symbol exported by a module */
+
 void init_ndbm(void)
 {long j;