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