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