1 /*
2  * Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers.
3  *	All rights reserved.
4  *
5  * By using this file, you agree to the terms and conditions set
6  * forth in the LICENSE file which can be found at the top level of
7  * the sendmail distribution.
8  *
9  *	$Id: smdb.h,v 8.40.2.1 2002/10/05 17:04:51 ca Exp $
10  *
11  */
12 
13 #pragma ident	"%Z%%M%	%I%	%E% SMI"
14 
15 #ifndef _SMDB_H_
16 # define _SMDB_H_
17 
18 # include <sys/types.h>
19 # include <sys/stat.h>
20 # include <sm/gen.h>
21 # include <sm/errstring.h>
22 
23 # ifdef NDBM
24 #  include <ndbm.h>
25 # endif /* NDBM */
26 
27 # ifdef NEWDB
28 #  include "sm/bdb.h"
29 # endif /* NEWDB */
30 
31 /*
32 **  Some size constants
33 */
34 
35 #define SMDB_MAX_USER_NAME_LEN	1024
36 
37 /*
38 **  This file defines the abstraction for database lookups. It is pretty
39 **  much a copy of the db2 interface with the exception that every function
40 **  returns 0 on success and non-zero on failure. The non-zero return code
41 **  is meaningful.
42 **
43 **  I'm going to put the function comments in this file since the interface
44 **  MUST be the same for all inheritors of this interface.
45 */
46 
47 typedef struct database_struct SMDB_DATABASE;
48 typedef struct cursor_struct SMDB_CURSOR;
49 typedef struct entry_struct SMDB_DBENT;
50 
51 /*
52 **  DB_CLOSE_FUNC -- close the database
53 **
54 **	Parameters:
55 **		db -- The database to close.
56 **
57 **	Returns:
58 **		0 - Success, otherwise errno.
59 **
60 */
61 
62 typedef int (*db_close_func) __P((SMDB_DATABASE *db));
63 
64 /*
65 **  DB_DEL_FUNC -- removes a key and data pair from the database
66 **
67 **	Parameters:
68 **		db -- The database to close.
69 **		key -- The key to remove.
70 **		flags -- delete options. There are currently no defined
71 **			 flags for delete.
72 **
73 **	Returns:
74 **		0 - Success, otherwise errno.
75 **
76 */
77 
78 typedef int (*db_del_func) __P((SMDB_DATABASE *db,
79 			   SMDB_DBENT *key, unsigned int flags));
80 
81 /*
82 **  DB_FD_FUNC -- Returns a pointer to a file used for the database.
83 **
84 **	Parameters:
85 **		db -- The database to close.
86 **		fd -- A pointer to store the returned fd in.
87 **
88 **	Returns:
89 **		0 - Success, otherwise errno.
90 **
91 */
92 
93 typedef int (*db_fd_func) __P((SMDB_DATABASE *db, int* fd));
94 
95 /*
96 **  DB_GET_FUNC -- Gets the data associated with a key.
97 **
98 **	Parameters:
99 **		db -- The database to close.
100 **		key -- The key to access.
101 **		data -- A place to store the returned data.
102 **		flags -- get options. There are currently no defined
103 **			 flags for get.
104 **
105 **	Returns:
106 **		0 - Success, otherwise errno.
107 **
108 */
109 
110 typedef int (*db_get_func) __P((SMDB_DATABASE *db,
111 			   SMDB_DBENT *key,
112 			   SMDB_DBENT *data, unsigned int flags));
113 
114 /*
115 **  DB_PUT_FUNC -- Sets some data according to the key.
116 **
117 **	Parameters:
118 **		db -- The database to close.
119 **		key -- The key to use.
120 **		data -- The data to store.
121 **		flags -- put options:
122 **			SMDBF_NO_OVERWRITE - Return an error if key alread
123 **					     exists.
124 **			SMDBF_ALLOW_DUP - Allow duplicates in btree maps.
125 **
126 **	Returns:
127 **		0 - Success, otherwise errno.
128 **
129 */
130 
131 typedef int (*db_put_func) __P((SMDB_DATABASE *db,
132 			   SMDB_DBENT *key,
133 			   SMDB_DBENT *data, unsigned int flags));
134 
135 /*
136 **  DB_SYNC_FUNC -- Flush any cached information to disk.
137 **
138 **	Parameters:
139 **		db -- The database to sync.
140 **		flags -- sync options:
141 **
142 **	Returns:
143 **		0 - Success, otherwise errno.
144 **
145 */
146 
147 typedef int (*db_sync_func) __P((SMDB_DATABASE *db, unsigned int flags));
148 
149 /*
150 **  DB_SET_OWNER_FUNC -- Set the owner and group of the database files.
151 **
152 **	Parameters:
153 **		db -- The database to set.
154 **		uid -- The UID for the new owner (-1 for no change)
155 **		gid -- The GID for the new owner (-1 for no change)
156 **
157 **	Returns:
158 **		0 - Success, otherwise errno.
159 **
160 */
161 
162 typedef int (*db_set_owner_func) __P((SMDB_DATABASE *db, uid_t uid, gid_t gid));
163 
164 /*
165 **  DB_CURSOR -- Obtain a cursor for sequential access
166 **
167 **	Parameters:
168 **		db -- The database to use.
169 **		cursor -- The address of a cursor pointer.
170 **		flags -- sync options:
171 **
172 **	Returns:
173 **		0 - Success, otherwise errno.
174 **
175 */
176 
177 typedef int (*db_cursor_func) __P((SMDB_DATABASE *db,
178 			      SMDB_CURSOR **cursor, unsigned int flags));
179 
180 typedef int (*db_lockfd_func) __P((SMDB_DATABASE *db));
181 
182 struct database_struct
183 {
184 	db_close_func		smdb_close;
185 	db_del_func		smdb_del;
186 	db_fd_func		smdb_fd;
187 	db_get_func		smdb_get;
188 	db_put_func		smdb_put;
189 	db_sync_func		smdb_sync;
190 	db_set_owner_func	smdb_set_owner;
191 	db_cursor_func		smdb_cursor;
192 	db_lockfd_func		smdb_lockfd;
193 	void			*smdb_impl;
194 };
195 /*
196 **  DB_CURSOR_CLOSE -- Close a cursor
197 **
198 **	Parameters:
199 **		cursor -- The cursor to close.
200 **
201 **	Returns:
202 **		0 - Success, otherwise errno.
203 **
204 */
205 
206 typedef int (*db_cursor_close_func) __P((SMDB_CURSOR *cursor));
207 
208 /*
209 **  DB_CURSOR_DEL -- Delete the key/value pair of this cursor
210 **
211 **	Parameters:
212 **		cursor -- The cursor.
213 **		flags -- flags
214 **
215 **	Returns:
216 **		0 - Success, otherwise errno.
217 **
218 */
219 
220 typedef int (*db_cursor_del_func) __P((SMDB_CURSOR *cursor,
221 					unsigned int flags));
222 
223 /*
224 **  DB_CURSOR_GET -- Get the key/value of this cursor.
225 **
226 **	Parameters:
227 **		cursor -- The cursor.
228 **		key -- The current key.
229 **		value -- The current value
230 **		flags -- flags
231 **
232 **	Returns:
233 **		0 - Success, otherwise errno.
234 **		SMDBE_LAST_ENTRY - This is a success condition that
235 **				   gets returned when the end of the
236 **				   database is hit.
237 **
238 */
239 
240 typedef int (*db_cursor_get_func) __P((SMDB_CURSOR *cursor,
241 				  SMDB_DBENT *key,
242 				  SMDB_DBENT *data,
243 				  unsigned int flags));
244 
245 /*
246 **  Flags for DB_CURSOR_GET
247 */
248 
249 #define SMDB_CURSOR_GET_FIRST	0
250 #define SMDB_CURSOR_GET_LAST	1
251 #define SMDB_CURSOR_GET_NEXT	2
252 #define SMDB_CURSOR_GET_RANGE	3
253 
254 /*
255 **  DB_CURSOR_PUT -- Put the key/value at this cursor.
256 **
257 **	Parameters:
258 **		cursor -- The cursor.
259 **		key -- The current key.
260 **		value -- The current value
261 **		flags -- flags
262 **
263 **	Returns:
264 **		0 - Success, otherwise errno.
265 **
266 */
267 
268 typedef int (*db_cursor_put_func) __P((SMDB_CURSOR *cursor,
269 				  SMDB_DBENT *key,
270 				  SMDB_DBENT *data,
271 				  unsigned int flags));
272 
273 
274 
275 struct cursor_struct
276 {
277 	db_cursor_close_func	smdbc_close;
278 	db_cursor_del_func	smdbc_del;
279 	db_cursor_get_func	smdbc_get;
280 	db_cursor_put_func	smdbc_put;
281 	void			*smdbc_impl;
282 };
283 
284 
285 struct database_params_struct
286 {
287 	unsigned int	smdbp_num_elements;
288 	unsigned int	smdbp_cache_size;
289 	bool		smdbp_allow_dup;
290 };
291 
292 typedef struct database_params_struct SMDB_DBPARAMS;
293 
294 struct database_user_struct
295 {
296 	uid_t	smdbu_id;
297 	gid_t	smdbu_group_id;
298 	char	smdbu_name[SMDB_MAX_USER_NAME_LEN];
299 };
300 
301 typedef struct database_user_struct SMDB_USER_INFO;
302 
303 struct entry_struct
304 {
305 	void	*data;
306 	size_t	size;
307 };
308 
309 typedef char *SMDB_DBTYPE;
310 typedef unsigned int SMDB_FLAG;
311 
312 /*
313 **  These are types of databases.
314 */
315 
316 # define SMDB_TYPE_DEFAULT	NULL
317 # define SMDB_TYPE_DEFAULT_LEN	0
318 # define SMDB_TYPE_HASH		"hash"
319 # define SMDB_TYPE_HASH_LEN	5
320 # define SMDB_TYPE_BTREE	"btree"
321 # define SMDB_TYPE_BTREE_LEN	6
322 # define SMDB_TYPE_NDBM		"dbm"
323 # define SMDB_TYPE_NDBM_LEN	4
324 
325 /*
326 **  These are flags
327 */
328 
329 /* Flags for put */
330 # define SMDBF_NO_OVERWRITE	0x00000001
331 # define SMDBF_ALLOW_DUP	0x00000002
332 
333 
334 extern SMDB_DATABASE	*smdb_malloc_database __P((void));
335 extern void		smdb_free_database __P((SMDB_DATABASE *));
336 extern int		smdb_open_database __P((SMDB_DATABASE **, char *, int,
337 						int, long, SMDB_DBTYPE,
338 						SMDB_USER_INFO *,
339 						SMDB_DBPARAMS *));
340 # ifdef NEWDB
341 extern int		smdb_db_open __P((SMDB_DATABASE **, char *, int, int,
342 					  long, SMDB_DBTYPE, SMDB_USER_INFO *,
343 					  SMDB_DBPARAMS *));
344 # endif /* NEWDB */
345 # ifdef NDBM
346 extern int		smdb_ndbm_open __P((SMDB_DATABASE **, char *, int, int,
347 					    long, SMDB_DBTYPE,
348 					    SMDB_USER_INFO *,
349 					    SMDB_DBPARAMS *));
350 # endif /* NDBM */
351 extern int		smdb_add_extension __P((char *, int, char *, char *));
352 extern int		smdb_setup_file __P((char *, char *, int, long,
353 					     SMDB_USER_INFO *, struct stat *));
354 extern int		smdb_lock_file __P((int *, char *, int, long, char *));
355 extern int		smdb_unlock_file __P((int));
356 extern int		smdb_filechanged __P((char *, char *, int,
357 					      struct stat *));
358 extern void		smdb_print_available_types __P((void));
359 extern char		*smdb_db_definition __P((SMDB_DBTYPE));
360 extern int		smdb_lock_map __P((SMDB_DATABASE *, int));
361 extern int		smdb_unlock_map __P((SMDB_DATABASE *));
362 #endif /* ! _SMDB_H_ */
363