smdb.h revision 66494
164562Sgshapiro/*
264562Sgshapiro** Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
364562Sgshapiro**	All rights reserved.
464562Sgshapiro**
564562Sgshapiro** By using this file, you agree to the terms and conditions set
664562Sgshapiro** forth in the LICENSE file which can be found at the top level of
764562Sgshapiro** the sendmail distribution.
864562Sgshapiro**
966494Sgshapiro** $Id: smdb.h,v 8.29.2.1.2.1 2000/08/24 17:08:00 gshapiro Exp $
1064562Sgshapiro*/
1164562Sgshapiro
1264562Sgshapiro#ifndef _SMDB_H_
1364562Sgshapiro# define _SMDB_H_
1464562Sgshapiro
1564562Sgshapiro# include <sys/types.h>
1664562Sgshapiro# include <sys/stat.h>
1764562Sgshapiro# ifndef __P
1864562Sgshapiro#  include "sendmail/cdefs.h"
1964562Sgshapiro# endif /* __P */
2064562Sgshapiro
2164562Sgshapiro# ifndef NDBM
2264562Sgshapiro#  ifndef NEWDB
2364562SgshapiroERROR	NDBM or NEWDB must be defined.
2464562Sgshapiro#  endif /* ! NEWDB */
2564562Sgshapiro# endif /* ! NDBM */
2664562Sgshapiro
2764562Sgshapiro# ifdef NDBM
2864562Sgshapiro#  include <ndbm.h>
2964562Sgshapiro# endif /* NDBM */
3064562Sgshapiro
3164562Sgshapiro# ifdef NEWDB
3264562Sgshapiro#  include <db.h>
3364562Sgshapiro#  ifndef DB_VERSION_MAJOR
3464562Sgshapiro#   define DB_VERSION_MAJOR 1
3564562Sgshapiro#  endif /* ! DB_VERSION_MAJOR */
3664562Sgshapiro# endif /* NEWDB */
3764562Sgshapiro
3864562Sgshapiro/*
3964562Sgshapiro** Some size constants
4064562Sgshapiro*/
4164562Sgshapiro#define SMDB_MAX_USER_NAME_LEN	1024
4264562Sgshapiro#define SMDB_MAX_NAME_LEN	1024
4364562Sgshapiro
4464562Sgshapiro/*
4564562Sgshapiro** This file defines the abstraction for database lookups. It is pretty
4664562Sgshapiro** much a copy of the db2 interface with the exception that every function
4764562Sgshapiro** returns 0 on success and non-zero on failure. The non-zero return code
4864562Sgshapiro** is meaningful.
4964562Sgshapiro**
5064562Sgshapiro** I'm going to put the function comments in this file since the interface
5164562Sgshapiro** MUST be the same for all inheritors of this interface.
5264562Sgshapiro*/
5364562Sgshapiro
5464562Sgshapirotypedef struct database_struct SMDB_DATABASE;
5564562Sgshapirotypedef struct cursor_struct SMDB_CURSOR;
5664562Sgshapirotypedef union database_entity_union SMDB_DBENT;
5764562Sgshapiro
5864562Sgshapiro
5964562Sgshapiro/*
6064562Sgshapiro** DB_CLOSE_FUNC -- close the database
6164562Sgshapiro**
6264562Sgshapiro**	Parameters:
6364562Sgshapiro**		db -- The database to close.
6464562Sgshapiro**
6564562Sgshapiro**	Returns:
6664562Sgshapiro**		0 - Success, otherwise errno.
6764562Sgshapiro**
6864562Sgshapiro*/
6964562Sgshapirotypedef int (*db_close_func) __P((SMDB_DATABASE *db));
7064562Sgshapiro
7164562Sgshapiro
7264562Sgshapiro
7364562Sgshapiro/*
7464562Sgshapiro** DB_DEL_FUNC -- removes a key and data pair from the database
7564562Sgshapiro**
7664562Sgshapiro**	Parameters:
7764562Sgshapiro**		db -- The database to close.
7864562Sgshapiro**		key -- The key to remove.
7964562Sgshapiro**		flags -- delete options. There are currently no defined
8064562Sgshapiro**			 flags for delete.
8164562Sgshapiro**
8264562Sgshapiro**	Returns:
8364562Sgshapiro**		0 - Success, otherwise errno.
8464562Sgshapiro**
8564562Sgshapiro*/
8664562Sgshapirotypedef int (*db_del_func) __P((SMDB_DATABASE *db,
8764562Sgshapiro			   SMDB_DBENT *key, u_int flags));
8864562Sgshapiro
8964562Sgshapiro
9064562Sgshapiro
9164562Sgshapiro/*
9264562Sgshapiro** DB_FD_FUNC -- Returns a pointer to a file used for the database.
9364562Sgshapiro**
9464562Sgshapiro**	Parameters:
9564562Sgshapiro**		db -- The database to close.
9664562Sgshapiro**		fd -- A pointer to store the returned fd in.
9764562Sgshapiro**
9864562Sgshapiro**	Returns:
9964562Sgshapiro**		0 - Success, otherwise errno.
10064562Sgshapiro**
10164562Sgshapiro*/
10264562Sgshapirotypedef int (*db_fd_func) __P((SMDB_DATABASE *db, int* fd));
10364562Sgshapiro
10464562Sgshapiro
10564562Sgshapiro
10664562Sgshapiro/*
10764562Sgshapiro** DB_GET_FUNC -- Gets the data associated with a key.
10864562Sgshapiro**
10964562Sgshapiro**	Parameters:
11064562Sgshapiro**		db -- The database to close.
11164562Sgshapiro**		key -- The key to access.
11264562Sgshapiro**		data -- A place to store the returned data.
11364562Sgshapiro**		flags -- get options. There are currently no defined
11464562Sgshapiro**			 flags for get.
11564562Sgshapiro**
11664562Sgshapiro**	Returns:
11764562Sgshapiro**		0 - Success, otherwise errno.
11864562Sgshapiro**
11964562Sgshapiro*/
12064562Sgshapirotypedef int (*db_get_func) __P((SMDB_DATABASE *db,
12164562Sgshapiro			   SMDB_DBENT *key,
12264562Sgshapiro			   SMDB_DBENT *data, u_int flags));
12364562Sgshapiro
12464562Sgshapiro
12564562Sgshapiro
12664562Sgshapiro/*
12764562Sgshapiro** DB_PUT_FUNC -- Sets some data according to the key.
12864562Sgshapiro**
12964562Sgshapiro**	Parameters:
13064562Sgshapiro**		db -- The database to close.
13164562Sgshapiro**		key -- The key to use.
13264562Sgshapiro**		data -- The data to store.
13364562Sgshapiro**		flags -- put options:
13464562Sgshapiro**			SMDBF_NO_OVERWRITE - Return an error if key alread
13564562Sgshapiro**					     exists.
13664562Sgshapiro**			SMDBF_ALLOW_DUP - Allow duplicates in btree maps.
13764562Sgshapiro**
13864562Sgshapiro**	Returns:
13964562Sgshapiro**		0 - Success, otherwise errno.
14064562Sgshapiro**
14164562Sgshapiro*/
14264562Sgshapirotypedef int (*db_put_func) __P((SMDB_DATABASE *db,
14364562Sgshapiro			   SMDB_DBENT *key,
14464562Sgshapiro			   SMDB_DBENT *data, u_int flags));
14564562Sgshapiro
14664562Sgshapiro
14764562Sgshapiro/*
14864562Sgshapiro** DB_SYNC_FUNC -- Flush any cached information to disk.
14964562Sgshapiro**
15064562Sgshapiro**	Parameters:
15164562Sgshapiro**		db -- The database to sync.
15264562Sgshapiro**		flags -- sync options:
15364562Sgshapiro**
15464562Sgshapiro**	Returns:
15564562Sgshapiro**		0 - Success, otherwise errno.
15664562Sgshapiro**
15764562Sgshapiro*/
15864562Sgshapirotypedef int (*db_sync_func) __P((SMDB_DATABASE *db, u_int flags));
15964562Sgshapiro
16064562Sgshapiro
16164562Sgshapiro/*
16264562Sgshapiro** DB_SET_OWNER_FUNC -- Set the owner and group of the database files.
16364562Sgshapiro**
16464562Sgshapiro**	Parameters:
16564562Sgshapiro**		db -- The database to set.
16664562Sgshapiro**		uid -- The UID for the new owner (-1 for no change)
16764562Sgshapiro**		gid -- The GID for the new owner (-1 for no change)
16864562Sgshapiro**
16964562Sgshapiro**	Returns:
17064562Sgshapiro**		0 - Success, otherwise errno.
17164562Sgshapiro**
17264562Sgshapiro*/
17364562Sgshapirotypedef int (*db_set_owner_func) __P((SMDB_DATABASE *db, uid_t uid,
17464562Sgshapiro				 gid_t gid));
17564562Sgshapiro
17664562Sgshapiro
17764562Sgshapiro/*
17864562Sgshapiro** DB_CURSOR -- Obtain a cursor for sequential access
17964562Sgshapiro**
18064562Sgshapiro**	Parameters:
18164562Sgshapiro**		db -- The database to use.
18264562Sgshapiro**		cursor -- The address of a cursor pointer.
18364562Sgshapiro**		flags -- sync options:
18464562Sgshapiro**
18564562Sgshapiro**	Returns:
18664562Sgshapiro**		0 - Success, otherwise errno.
18764562Sgshapiro**
18864562Sgshapiro*/
18964562Sgshapirotypedef int (*db_cursor_func) __P((SMDB_DATABASE *db,
19064562Sgshapiro			      SMDB_CURSOR **cursor, u_int flags));
19164562Sgshapiro
19266494Sgshapirotypedef int (*db_lockfd_func) __P((SMDB_DATABASE *db));
19364562Sgshapiro
19464562Sgshapirostruct database_struct
19564562Sgshapiro{
19664562Sgshapiro	db_close_func		smdb_close;
19764562Sgshapiro	db_del_func		smdb_del;
19864562Sgshapiro	db_fd_func		smdb_fd;
19964562Sgshapiro	db_get_func		smdb_get;
20064562Sgshapiro	db_put_func		smdb_put;
20164562Sgshapiro	db_sync_func		smdb_sync;
20264562Sgshapiro	db_set_owner_func	smdb_set_owner;
20364562Sgshapiro	db_cursor_func		smdb_cursor;
20466494Sgshapiro	db_lockfd_func		smdb_lockfd;
20564562Sgshapiro	void			*smdb_impl;
20664562Sgshapiro};
20764562Sgshapiro
20864562Sgshapiro
20964562Sgshapiro
21064562Sgshapiro/*
21164562Sgshapiro** DB_CURSOR_CLOSE -- Close a cursor
21264562Sgshapiro**
21364562Sgshapiro**	Parameters:
21464562Sgshapiro**		cursor -- The cursor to close.
21564562Sgshapiro**
21664562Sgshapiro**	Returns:
21764562Sgshapiro**		0 - Success, otherwise errno.
21864562Sgshapiro**
21964562Sgshapiro*/
22064562Sgshapirotypedef int (*db_cursor_close_func) __P((SMDB_CURSOR *cursor));
22164562Sgshapiro
22264562Sgshapiro
22364562Sgshapiro/*
22464562Sgshapiro** DB_CURSOR_DEL -- Delete the key/value pair of this cursor
22564562Sgshapiro**
22664562Sgshapiro**	Parameters:
22764562Sgshapiro**		cursor -- The cursor.
22864562Sgshapiro**		flags -- flags
22964562Sgshapiro**
23064562Sgshapiro**	Returns:
23164562Sgshapiro**		0 - Success, otherwise errno.
23264562Sgshapiro**
23364562Sgshapiro*/
23464562Sgshapirotypedef int (*db_cursor_del_func) __P((SMDB_CURSOR *cursor, u_int flags));
23564562Sgshapiro
23664562Sgshapiro
23764562Sgshapiro/*
23864562Sgshapiro** DB_CURSOR_GET -- Get the key/value of this cursor.
23964562Sgshapiro**
24064562Sgshapiro**	Parameters:
24164562Sgshapiro**		cursor -- The cursor.
24264562Sgshapiro**		key -- The current key.
24364562Sgshapiro**		value -- The current value
24464562Sgshapiro**		flags -- flags
24564562Sgshapiro**
24664562Sgshapiro**	Returns:
24764562Sgshapiro**		0 - Success, otherwise errno.
24864562Sgshapiro**		SMDBE_LAST_ENTRY - This is a success condition that
24964562Sgshapiro**				   gets returned when the end of the
25064562Sgshapiro**				   database is hit.
25164562Sgshapiro**
25264562Sgshapiro*/
25364562Sgshapirotypedef int (*db_cursor_get_func) __P((SMDB_CURSOR *cursor,
25464562Sgshapiro				  SMDB_DBENT *key,
25564562Sgshapiro				  SMDB_DBENT *data,
25664562Sgshapiro				  u_int flags));
25764562Sgshapiro
25864562Sgshapiro/*
25964562Sgshapiro** Flags for DB_CURSOR_GET
26064562Sgshapiro*/
26164562Sgshapiro#define SMDB_CURSOR_GET_FIRST	0
26264562Sgshapiro#define SMDB_CURSOR_GET_LAST	1
26364562Sgshapiro#define SMDB_CURSOR_GET_NEXT	2
26464562Sgshapiro#define SMDB_CURSOR_GET_RANGE	3
26564562Sgshapiro
26664562Sgshapiro
26764562Sgshapiro/*
26864562Sgshapiro** DB_CURSOR_PUT -- Put the key/value at this cursor.
26964562Sgshapiro**
27064562Sgshapiro**	Parameters:
27164562Sgshapiro**		cursor -- The cursor.
27264562Sgshapiro**		key -- The current key.
27364562Sgshapiro**		value -- The current value
27464562Sgshapiro**		flags -- flags
27564562Sgshapiro**
27664562Sgshapiro**	Returns:
27764562Sgshapiro**		0 - Success, otherwise errno.
27864562Sgshapiro**
27964562Sgshapiro*/
28064562Sgshapirotypedef int (*db_cursor_put_func) __P((SMDB_CURSOR *cursor,
28164562Sgshapiro				  SMDB_DBENT *key,
28264562Sgshapiro				  SMDB_DBENT *data,
28364562Sgshapiro				  u_int flags));
28464562Sgshapiro
28564562Sgshapiro
28664562Sgshapiro
28764562Sgshapirostruct cursor_struct
28864562Sgshapiro{
28964562Sgshapiro	db_cursor_close_func	smdbc_close;
29064562Sgshapiro	db_cursor_del_func	smdbc_del;
29164562Sgshapiro	db_cursor_get_func	smdbc_get;
29264562Sgshapiro	db_cursor_put_func	smdbc_put;
29364562Sgshapiro	void			*smdbc_impl;
29464562Sgshapiro};
29564562Sgshapiro
29664562Sgshapiro
29764562Sgshapirostruct database_params_struct
29864562Sgshapiro{
29964562Sgshapiro	u_int	smdbp_num_elements;
30064562Sgshapiro	u_int	smdbp_cache_size;
30164562Sgshapiro	bool	smdbp_allow_dup;
30264562Sgshapiro};
30364562Sgshapiro
30464562Sgshapirotypedef struct database_params_struct SMDB_DBPARAMS;
30564562Sgshapiro
30664562Sgshapirostruct database_user_struct
30764562Sgshapiro{
30864562Sgshapiro	uid_t	smdbu_id;
30964562Sgshapiro	gid_t	smdbu_group_id;
31064562Sgshapiro	char	smdbu_name[SMDB_MAX_USER_NAME_LEN];
31164562Sgshapiro};
31264562Sgshapiro
31364562Sgshapirotypedef struct database_user_struct SMDB_USER_INFO;
31464562Sgshapiro
31564562Sgshapirounion database_entity_union
31664562Sgshapiro{
31764562Sgshapiro# ifdef NDBM
31864562Sgshapiro	datum	dbm;
31964562Sgshapiro# endif /* NDBM */
32064562Sgshapiro# ifdef NEWDB
32164562Sgshapiro	DBT	db;
32264562Sgshapiro# endif /* NEWDB */
32364562Sgshapiro	struct
32464562Sgshapiro	{
32564562Sgshapiro		char	*data;
32664562Sgshapiro		size_t	size;
32764562Sgshapiro	} data;
32864562Sgshapiro};
32964562Sgshapiro
33064562Sgshapiro
33164562Sgshapirotypedef char *SMDB_DBTYPE;
33264562Sgshapirotypedef u_int SMDB_FLAG;
33364562Sgshapiro
33464562Sgshapiro/*
33564562Sgshapiro** These are types of databases.
33664562Sgshapiro*/
33764562Sgshapiro
33864562Sgshapiro# define SMDB_TYPE_DEFAULT	NULL
33964562Sgshapiro# define SMDB_TYPE_DEFAULT_LEN	0
34064562Sgshapiro# define SMDB_TYPE_HASH		"hash"
34164562Sgshapiro# define SMDB_TYPE_HASH_LEN	5
34264562Sgshapiro# define SMDB_TYPE_BTREE	"btree"
34364562Sgshapiro# define SMDB_TYPE_BTREE_LEN	6
34464562Sgshapiro# define SMDB_TYPE_NDBM		"dbm"
34564562Sgshapiro# define SMDB_TYPE_NDBM_LEN	4
34664562Sgshapiro
34764562Sgshapiro/*
34864562Sgshapiro** These are flags
34964562Sgshapiro*/
35064562Sgshapiro/* Flags for put */
35164562Sgshapiro# define SMDBF_NO_OVERWRITE	0x00000001
35264562Sgshapiro# define SMDBF_ALLOW_DUP	0x00000002
35364562Sgshapiro
35464562Sgshapiro
35564562Sgshapiroextern SMDB_DATABASE	*smdb_malloc_database __P((void));
35664562Sgshapiroextern void		smdb_free_database __P((SMDB_DATABASE *));
35764562Sgshapiroextern int		smdb_open_database __P((SMDB_DATABASE **, char *, int,
35864562Sgshapiro						int, long, SMDB_DBTYPE,
35964562Sgshapiro						SMDB_USER_INFO *,
36064562Sgshapiro						SMDB_DBPARAMS *));
36164562Sgshapiro# ifdef NEWDB
36264562Sgshapiroextern int		smdb_db_open __P((SMDB_DATABASE **, char *, int, int,
36364562Sgshapiro					  long, SMDB_DBTYPE, SMDB_USER_INFO *,
36464562Sgshapiro					  SMDB_DBPARAMS *));
36564562Sgshapiro# endif /* NEWDB */
36664562Sgshapiro# ifdef NDBM
36764562Sgshapiroextern int		smdb_ndbm_open __P((SMDB_DATABASE **, char *, int, int,
36864562Sgshapiro					    long, SMDB_DBTYPE,
36964562Sgshapiro					    SMDB_USER_INFO *,
37064562Sgshapiro					    SMDB_DBPARAMS *));
37164562Sgshapiro# endif /* NDBM */
37264562Sgshapiroextern int		smdb_add_extension __P((char *, int, char *, char *));
37364562Sgshapiroextern int		smdb_setup_file __P((char *, char *, int, long,
37464562Sgshapiro					     SMDB_USER_INFO *, struct stat *));
37564562Sgshapiroextern int		smdb_lock_file __P((int *, char *, int, long, char *));
37664562Sgshapiroextern int		smdb_unlock_file __P((int));
37764562Sgshapiroextern int		smdb_filechanged __P((char *, char *, int,
37864562Sgshapiro					      struct stat *));
37964562Sgshapiroextern void		smdb_print_available_types __P((void));
38064562Sgshapiroextern char		*smdb_db_definition __P((SMDB_DBTYPE));
38166494Sgshapiroextern int		smdb_lock_map __P((SMDB_DATABASE *, int));
38266494Sgshapiroextern int		smdb_unlock_map __P((SMDB_DATABASE *));
38364562Sgshapiro#endif /* ! _SMDB_H_ */
384