smdb.h revision 71345
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** 971345Sgshapiro** $Id: smdb.h,v 8.29.2.1.2.2 2000/10/05 22:23:55 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; 5671345Sgshapirotypedef struct entry_struct 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 31571345Sgshapirostruct entry_struct 31664562Sgshapiro{ 31771345Sgshapiro void *data; 31871345Sgshapiro size_t size; 31964562Sgshapiro}; 32064562Sgshapiro 32164562Sgshapirotypedef char *SMDB_DBTYPE; 32264562Sgshapirotypedef u_int SMDB_FLAG; 32364562Sgshapiro 32464562Sgshapiro/* 32564562Sgshapiro** These are types of databases. 32664562Sgshapiro*/ 32764562Sgshapiro 32864562Sgshapiro# define SMDB_TYPE_DEFAULT NULL 32964562Sgshapiro# define SMDB_TYPE_DEFAULT_LEN 0 33064562Sgshapiro# define SMDB_TYPE_HASH "hash" 33164562Sgshapiro# define SMDB_TYPE_HASH_LEN 5 33264562Sgshapiro# define SMDB_TYPE_BTREE "btree" 33364562Sgshapiro# define SMDB_TYPE_BTREE_LEN 6 33464562Sgshapiro# define SMDB_TYPE_NDBM "dbm" 33564562Sgshapiro# define SMDB_TYPE_NDBM_LEN 4 33664562Sgshapiro 33764562Sgshapiro/* 33864562Sgshapiro** These are flags 33964562Sgshapiro*/ 34064562Sgshapiro/* Flags for put */ 34164562Sgshapiro# define SMDBF_NO_OVERWRITE 0x00000001 34264562Sgshapiro# define SMDBF_ALLOW_DUP 0x00000002 34364562Sgshapiro 34464562Sgshapiro 34564562Sgshapiroextern SMDB_DATABASE *smdb_malloc_database __P((void)); 34664562Sgshapiroextern void smdb_free_database __P((SMDB_DATABASE *)); 34764562Sgshapiroextern int smdb_open_database __P((SMDB_DATABASE **, char *, int, 34864562Sgshapiro int, long, SMDB_DBTYPE, 34964562Sgshapiro SMDB_USER_INFO *, 35064562Sgshapiro SMDB_DBPARAMS *)); 35164562Sgshapiro# ifdef NEWDB 35264562Sgshapiroextern int smdb_db_open __P((SMDB_DATABASE **, char *, int, int, 35364562Sgshapiro long, SMDB_DBTYPE, SMDB_USER_INFO *, 35464562Sgshapiro SMDB_DBPARAMS *)); 35564562Sgshapiro# endif /* NEWDB */ 35664562Sgshapiro# ifdef NDBM 35764562Sgshapiroextern int smdb_ndbm_open __P((SMDB_DATABASE **, char *, int, int, 35864562Sgshapiro long, SMDB_DBTYPE, 35964562Sgshapiro SMDB_USER_INFO *, 36064562Sgshapiro SMDB_DBPARAMS *)); 36164562Sgshapiro# endif /* NDBM */ 36264562Sgshapiroextern int smdb_add_extension __P((char *, int, char *, char *)); 36364562Sgshapiroextern int smdb_setup_file __P((char *, char *, int, long, 36464562Sgshapiro SMDB_USER_INFO *, struct stat *)); 36564562Sgshapiroextern int smdb_lock_file __P((int *, char *, int, long, char *)); 36664562Sgshapiroextern int smdb_unlock_file __P((int)); 36764562Sgshapiroextern int smdb_filechanged __P((char *, char *, int, 36864562Sgshapiro struct stat *)); 36964562Sgshapiroextern void smdb_print_available_types __P((void)); 37064562Sgshapiroextern char *smdb_db_definition __P((SMDB_DBTYPE)); 37166494Sgshapiroextern int smdb_lock_map __P((SMDB_DATABASE *, int)); 37266494Sgshapiroextern int smdb_unlock_map __P((SMDB_DATABASE *)); 37364562Sgshapiro#endif /* ! _SMDB_H_ */ 374