164562Sgshapiro/*
298121Sgshapiro * Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers.
390792Sgshapiro *	All rights reserved.
490792Sgshapiro *
590792Sgshapiro * By using this file, you agree to the terms and conditions set
690792Sgshapiro * forth in the LICENSE file which can be found at the top level of
790792Sgshapiro * the sendmail distribution.
890792Sgshapiro *
9132943Sgshapiro *	$Id: smdb.h,v 8.41 2002/09/24 19:53:28 ca Exp $
1090792Sgshapiro *
1190792Sgshapiro */
1264562Sgshapiro
1364562Sgshapiro#ifndef _SMDB_H_
1464562Sgshapiro# define _SMDB_H_
1564562Sgshapiro
1664562Sgshapiro# include <sys/types.h>
1764562Sgshapiro# include <sys/stat.h>
1890792Sgshapiro# include <sm/gen.h>
1990792Sgshapiro# include <sm/errstring.h>
2064562Sgshapiro
2164562Sgshapiro# ifdef NDBM
2264562Sgshapiro#  include <ndbm.h>
2364562Sgshapiro# endif /* NDBM */
2464562Sgshapiro
2564562Sgshapiro# ifdef NEWDB
26110560Sgshapiro#  include "sm/bdb.h"
2764562Sgshapiro# endif /* NEWDB */
2864562Sgshapiro
2964562Sgshapiro/*
3090792Sgshapiro**  Some size constants
3164562Sgshapiro*/
3290792Sgshapiro
3364562Sgshapiro#define SMDB_MAX_USER_NAME_LEN	1024
3464562Sgshapiro
3564562Sgshapiro/*
3690792Sgshapiro**  This file defines the abstraction for database lookups. It is pretty
3790792Sgshapiro**  much a copy of the db2 interface with the exception that every function
3890792Sgshapiro**  returns 0 on success and non-zero on failure. The non-zero return code
3990792Sgshapiro**  is meaningful.
4064562Sgshapiro**
4190792Sgshapiro**  I'm going to put the function comments in this file since the interface
4290792Sgshapiro**  MUST be the same for all inheritors of this interface.
4364562Sgshapiro*/
4464562Sgshapiro
4564562Sgshapirotypedef struct database_struct SMDB_DATABASE;
4664562Sgshapirotypedef struct cursor_struct SMDB_CURSOR;
4771345Sgshapirotypedef struct entry_struct SMDB_DBENT;
4864562Sgshapiro
4964562Sgshapiro/*
5090792Sgshapiro**  DB_CLOSE_FUNC -- close the database
5164562Sgshapiro**
5264562Sgshapiro**	Parameters:
5364562Sgshapiro**		db -- The database to close.
5464562Sgshapiro**
5564562Sgshapiro**	Returns:
5664562Sgshapiro**		0 - Success, otherwise errno.
5764562Sgshapiro**
5864562Sgshapiro*/
5990792Sgshapiro
6064562Sgshapirotypedef int (*db_close_func) __P((SMDB_DATABASE *db));
6164562Sgshapiro
6264562Sgshapiro/*
6390792Sgshapiro**  DB_DEL_FUNC -- removes a key and data pair from the database
6464562Sgshapiro**
6564562Sgshapiro**	Parameters:
6664562Sgshapiro**		db -- The database to close.
6764562Sgshapiro**		key -- The key to remove.
6864562Sgshapiro**		flags -- delete options. There are currently no defined
6964562Sgshapiro**			 flags for delete.
7064562Sgshapiro**
7164562Sgshapiro**	Returns:
7264562Sgshapiro**		0 - Success, otherwise errno.
7364562Sgshapiro**
7464562Sgshapiro*/
7590792Sgshapiro
7664562Sgshapirotypedef int (*db_del_func) __P((SMDB_DATABASE *db,
7790792Sgshapiro			   SMDB_DBENT *key, unsigned int flags));
7864562Sgshapiro
7964562Sgshapiro/*
8090792Sgshapiro**  DB_FD_FUNC -- Returns a pointer to a file used for the database.
8164562Sgshapiro**
8264562Sgshapiro**	Parameters:
8364562Sgshapiro**		db -- The database to close.
8464562Sgshapiro**		fd -- A pointer to store the returned fd in.
8564562Sgshapiro**
8664562Sgshapiro**	Returns:
8764562Sgshapiro**		0 - Success, otherwise errno.
8864562Sgshapiro**
8964562Sgshapiro*/
9090792Sgshapiro
9164562Sgshapirotypedef int (*db_fd_func) __P((SMDB_DATABASE *db, int* fd));
9264562Sgshapiro
9364562Sgshapiro/*
9490792Sgshapiro**  DB_GET_FUNC -- Gets the data associated with a key.
9564562Sgshapiro**
9664562Sgshapiro**	Parameters:
9764562Sgshapiro**		db -- The database to close.
9864562Sgshapiro**		key -- The key to access.
9964562Sgshapiro**		data -- A place to store the returned data.
10064562Sgshapiro**		flags -- get options. There are currently no defined
10164562Sgshapiro**			 flags for get.
10264562Sgshapiro**
10364562Sgshapiro**	Returns:
10464562Sgshapiro**		0 - Success, otherwise errno.
10564562Sgshapiro**
10664562Sgshapiro*/
10790792Sgshapiro
10864562Sgshapirotypedef int (*db_get_func) __P((SMDB_DATABASE *db,
10964562Sgshapiro			   SMDB_DBENT *key,
11090792Sgshapiro			   SMDB_DBENT *data, unsigned int flags));
11164562Sgshapiro
11264562Sgshapiro/*
11390792Sgshapiro**  DB_PUT_FUNC -- Sets some data according to the key.
11464562Sgshapiro**
11564562Sgshapiro**	Parameters:
11664562Sgshapiro**		db -- The database to close.
11764562Sgshapiro**		key -- The key to use.
11864562Sgshapiro**		data -- The data to store.
11964562Sgshapiro**		flags -- put options:
12064562Sgshapiro**			SMDBF_NO_OVERWRITE - Return an error if key alread
12164562Sgshapiro**					     exists.
12264562Sgshapiro**			SMDBF_ALLOW_DUP - Allow duplicates in btree maps.
12364562Sgshapiro**
12464562Sgshapiro**	Returns:
12564562Sgshapiro**		0 - Success, otherwise errno.
12664562Sgshapiro**
12764562Sgshapiro*/
12890792Sgshapiro
12964562Sgshapirotypedef int (*db_put_func) __P((SMDB_DATABASE *db,
13064562Sgshapiro			   SMDB_DBENT *key,
13190792Sgshapiro			   SMDB_DBENT *data, unsigned int flags));
13264562Sgshapiro
13364562Sgshapiro/*
13490792Sgshapiro**  DB_SYNC_FUNC -- Flush any cached information to disk.
13564562Sgshapiro**
13664562Sgshapiro**	Parameters:
13764562Sgshapiro**		db -- The database to sync.
13864562Sgshapiro**		flags -- sync options:
13964562Sgshapiro**
14064562Sgshapiro**	Returns:
14164562Sgshapiro**		0 - Success, otherwise errno.
14264562Sgshapiro**
14364562Sgshapiro*/
14464562Sgshapiro
14590792Sgshapirotypedef int (*db_sync_func) __P((SMDB_DATABASE *db, unsigned int flags));
14690792Sgshapiro
14764562Sgshapiro/*
14890792Sgshapiro**  DB_SET_OWNER_FUNC -- Set the owner and group of the database files.
14964562Sgshapiro**
15064562Sgshapiro**	Parameters:
15164562Sgshapiro**		db -- The database to set.
15264562Sgshapiro**		uid -- The UID for the new owner (-1 for no change)
15364562Sgshapiro**		gid -- The GID for the new owner (-1 for no change)
15464562Sgshapiro**
15564562Sgshapiro**	Returns:
15664562Sgshapiro**		0 - Success, otherwise errno.
15764562Sgshapiro**
15864562Sgshapiro*/
15964562Sgshapiro
16090792Sgshapirotypedef int (*db_set_owner_func) __P((SMDB_DATABASE *db, uid_t uid, gid_t gid));
16190792Sgshapiro
16264562Sgshapiro/*
16390792Sgshapiro**  DB_CURSOR -- Obtain a cursor for sequential access
16464562Sgshapiro**
16564562Sgshapiro**	Parameters:
16664562Sgshapiro**		db -- The database to use.
16764562Sgshapiro**		cursor -- The address of a cursor pointer.
16864562Sgshapiro**		flags -- sync options:
16964562Sgshapiro**
17064562Sgshapiro**	Returns:
17164562Sgshapiro**		0 - Success, otherwise errno.
17264562Sgshapiro**
17364562Sgshapiro*/
17490792Sgshapiro
17564562Sgshapirotypedef int (*db_cursor_func) __P((SMDB_DATABASE *db,
17690792Sgshapiro			      SMDB_CURSOR **cursor, unsigned int flags));
17764562Sgshapiro
17866494Sgshapirotypedef int (*db_lockfd_func) __P((SMDB_DATABASE *db));
17964562Sgshapiro
18064562Sgshapirostruct database_struct
18164562Sgshapiro{
18264562Sgshapiro	db_close_func		smdb_close;
18364562Sgshapiro	db_del_func		smdb_del;
18464562Sgshapiro	db_fd_func		smdb_fd;
18564562Sgshapiro	db_get_func		smdb_get;
18664562Sgshapiro	db_put_func		smdb_put;
18764562Sgshapiro	db_sync_func		smdb_sync;
18864562Sgshapiro	db_set_owner_func	smdb_set_owner;
18964562Sgshapiro	db_cursor_func		smdb_cursor;
19066494Sgshapiro	db_lockfd_func		smdb_lockfd;
19164562Sgshapiro	void			*smdb_impl;
19264562Sgshapiro};
19364562Sgshapiro/*
19490792Sgshapiro**  DB_CURSOR_CLOSE -- Close a cursor
19564562Sgshapiro**
19664562Sgshapiro**	Parameters:
19764562Sgshapiro**		cursor -- The cursor to close.
19864562Sgshapiro**
19964562Sgshapiro**	Returns:
20064562Sgshapiro**		0 - Success, otherwise errno.
20164562Sgshapiro**
20264562Sgshapiro*/
20390792Sgshapiro
20464562Sgshapirotypedef int (*db_cursor_close_func) __P((SMDB_CURSOR *cursor));
20564562Sgshapiro
20664562Sgshapiro/*
20790792Sgshapiro**  DB_CURSOR_DEL -- Delete the key/value pair of this cursor
20864562Sgshapiro**
20964562Sgshapiro**	Parameters:
21064562Sgshapiro**		cursor -- The cursor.
21164562Sgshapiro**		flags -- flags
21264562Sgshapiro**
21364562Sgshapiro**	Returns:
21464562Sgshapiro**		0 - Success, otherwise errno.
21564562Sgshapiro**
21664562Sgshapiro*/
21764562Sgshapiro
21890792Sgshapirotypedef int (*db_cursor_del_func) __P((SMDB_CURSOR *cursor,
21990792Sgshapiro					unsigned int flags));
22090792Sgshapiro
22164562Sgshapiro/*
22290792Sgshapiro**  DB_CURSOR_GET -- Get the key/value of this cursor.
22364562Sgshapiro**
22464562Sgshapiro**	Parameters:
22564562Sgshapiro**		cursor -- The cursor.
22664562Sgshapiro**		key -- The current key.
22764562Sgshapiro**		value -- The current value
22864562Sgshapiro**		flags -- flags
22964562Sgshapiro**
23064562Sgshapiro**	Returns:
23164562Sgshapiro**		0 - Success, otherwise errno.
23264562Sgshapiro**		SMDBE_LAST_ENTRY - This is a success condition that
23364562Sgshapiro**				   gets returned when the end of the
23464562Sgshapiro**				   database is hit.
23564562Sgshapiro**
23664562Sgshapiro*/
23790792Sgshapiro
23864562Sgshapirotypedef int (*db_cursor_get_func) __P((SMDB_CURSOR *cursor,
23964562Sgshapiro				  SMDB_DBENT *key,
24064562Sgshapiro				  SMDB_DBENT *data,
24190792Sgshapiro				  unsigned int flags));
24264562Sgshapiro
24364562Sgshapiro/*
24490792Sgshapiro**  Flags for DB_CURSOR_GET
24564562Sgshapiro*/
24690792Sgshapiro
24764562Sgshapiro#define SMDB_CURSOR_GET_FIRST	0
24864562Sgshapiro#define SMDB_CURSOR_GET_LAST	1
24964562Sgshapiro#define SMDB_CURSOR_GET_NEXT	2
25064562Sgshapiro#define SMDB_CURSOR_GET_RANGE	3
25164562Sgshapiro
25264562Sgshapiro/*
25390792Sgshapiro**  DB_CURSOR_PUT -- Put the key/value at this cursor.
25464562Sgshapiro**
25564562Sgshapiro**	Parameters:
25664562Sgshapiro**		cursor -- The cursor.
25764562Sgshapiro**		key -- The current key.
25864562Sgshapiro**		value -- The current value
25964562Sgshapiro**		flags -- flags
26064562Sgshapiro**
26164562Sgshapiro**	Returns:
26264562Sgshapiro**		0 - Success, otherwise errno.
26364562Sgshapiro**
26464562Sgshapiro*/
26590792Sgshapiro
26664562Sgshapirotypedef int (*db_cursor_put_func) __P((SMDB_CURSOR *cursor,
26764562Sgshapiro				  SMDB_DBENT *key,
26864562Sgshapiro				  SMDB_DBENT *data,
26990792Sgshapiro				  unsigned int flags));
27064562Sgshapiro
27164562Sgshapiro
27264562Sgshapiro
27364562Sgshapirostruct cursor_struct
27464562Sgshapiro{
27564562Sgshapiro	db_cursor_close_func	smdbc_close;
27664562Sgshapiro	db_cursor_del_func	smdbc_del;
27764562Sgshapiro	db_cursor_get_func	smdbc_get;
27864562Sgshapiro	db_cursor_put_func	smdbc_put;
27964562Sgshapiro	void			*smdbc_impl;
28064562Sgshapiro};
28164562Sgshapiro
28264562Sgshapiro
28364562Sgshapirostruct database_params_struct
28464562Sgshapiro{
28590792Sgshapiro	unsigned int	smdbp_num_elements;
28690792Sgshapiro	unsigned int	smdbp_cache_size;
28790792Sgshapiro	bool		smdbp_allow_dup;
28864562Sgshapiro};
28964562Sgshapiro
29064562Sgshapirotypedef struct database_params_struct SMDB_DBPARAMS;
29164562Sgshapiro
29264562Sgshapirostruct database_user_struct
29364562Sgshapiro{
29464562Sgshapiro	uid_t	smdbu_id;
29564562Sgshapiro	gid_t	smdbu_group_id;
29664562Sgshapiro	char	smdbu_name[SMDB_MAX_USER_NAME_LEN];
29764562Sgshapiro};
29864562Sgshapiro
29964562Sgshapirotypedef struct database_user_struct SMDB_USER_INFO;
30064562Sgshapiro
30171345Sgshapirostruct entry_struct
30264562Sgshapiro{
30371345Sgshapiro	void	*data;
30471345Sgshapiro	size_t	size;
30564562Sgshapiro};
30664562Sgshapiro
30764562Sgshapirotypedef char *SMDB_DBTYPE;
30890792Sgshapirotypedef unsigned int SMDB_FLAG;
30964562Sgshapiro
31064562Sgshapiro/*
31190792Sgshapiro**  These are types of databases.
31264562Sgshapiro*/
31364562Sgshapiro
31464562Sgshapiro# define SMDB_TYPE_DEFAULT	NULL
31564562Sgshapiro# define SMDB_TYPE_DEFAULT_LEN	0
31664562Sgshapiro# define SMDB_TYPE_HASH		"hash"
31764562Sgshapiro# define SMDB_TYPE_HASH_LEN	5
31864562Sgshapiro# define SMDB_TYPE_BTREE	"btree"
31964562Sgshapiro# define SMDB_TYPE_BTREE_LEN	6
32064562Sgshapiro# define SMDB_TYPE_NDBM		"dbm"
32164562Sgshapiro# define SMDB_TYPE_NDBM_LEN	4
32264562Sgshapiro
32364562Sgshapiro/*
32490792Sgshapiro**  These are flags
32564562Sgshapiro*/
32690792Sgshapiro
32764562Sgshapiro/* Flags for put */
32864562Sgshapiro# define SMDBF_NO_OVERWRITE	0x00000001
32964562Sgshapiro# define SMDBF_ALLOW_DUP	0x00000002
33064562Sgshapiro
33164562Sgshapiro
33264562Sgshapiroextern SMDB_DATABASE	*smdb_malloc_database __P((void));
33364562Sgshapiroextern void		smdb_free_database __P((SMDB_DATABASE *));
33464562Sgshapiroextern int		smdb_open_database __P((SMDB_DATABASE **, char *, int,
33564562Sgshapiro						int, long, SMDB_DBTYPE,
33664562Sgshapiro						SMDB_USER_INFO *,
33764562Sgshapiro						SMDB_DBPARAMS *));
33864562Sgshapiro# ifdef NEWDB
33964562Sgshapiroextern int		smdb_db_open __P((SMDB_DATABASE **, char *, int, int,
34064562Sgshapiro					  long, SMDB_DBTYPE, SMDB_USER_INFO *,
34164562Sgshapiro					  SMDB_DBPARAMS *));
34264562Sgshapiro# endif /* NEWDB */
34364562Sgshapiro# ifdef NDBM
34464562Sgshapiroextern int		smdb_ndbm_open __P((SMDB_DATABASE **, char *, int, int,
34564562Sgshapiro					    long, SMDB_DBTYPE,
34664562Sgshapiro					    SMDB_USER_INFO *,
34764562Sgshapiro					    SMDB_DBPARAMS *));
34864562Sgshapiro# endif /* NDBM */
34964562Sgshapiroextern int		smdb_add_extension __P((char *, int, char *, char *));
35064562Sgshapiroextern int		smdb_setup_file __P((char *, char *, int, long,
35164562Sgshapiro					     SMDB_USER_INFO *, struct stat *));
35264562Sgshapiroextern int		smdb_lock_file __P((int *, char *, int, long, char *));
35364562Sgshapiroextern int		smdb_unlock_file __P((int));
35464562Sgshapiroextern int		smdb_filechanged __P((char *, char *, int,
35564562Sgshapiro					      struct stat *));
35664562Sgshapiroextern void		smdb_print_available_types __P((void));
35764562Sgshapiroextern char		*smdb_db_definition __P((SMDB_DBTYPE));
35866494Sgshapiroextern int		smdb_lock_map __P((SMDB_DATABASE *, int));
35966494Sgshapiroextern int		smdb_unlock_map __P((SMDB_DATABASE *));
36064562Sgshapiro#endif /* ! _SMDB_H_ */
361