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