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