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 45 typedef struct database_struct SMDB_DATABASE; 46 typedef struct cursor_struct SMDB_CURSOR; 47 typedef 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 60 typedef 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 76 typedef 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 91 typedef 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 108 typedef 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 129 typedef 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 145 typedef 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 160 typedef 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 175 typedef int (*db_cursor_func) __P((SMDB_DATABASE *db, 176 SMDB_CURSOR **cursor, unsigned int flags)); 177 178 typedef int (*db_lockfd_func) __P((SMDB_DATABASE *db)); 179 180 struct 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 204 typedef 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 218 typedef 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 238 typedef 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 266 typedef int (*db_cursor_put_func) __P((SMDB_CURSOR *cursor, 267 SMDB_DBENT *key, 268 SMDB_DBENT *data, 269 unsigned int flags)); 270 271 272 273 struct 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 283 struct database_params_struct 284 { 285 unsigned int smdbp_num_elements; 286 unsigned int smdbp_cache_size; 287 bool smdbp_allow_dup; 288 }; 289 290 typedef struct database_params_struct SMDB_DBPARAMS; 291 292 struct 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 299 typedef struct database_user_struct SMDB_USER_INFO; 300 301 struct entry_struct 302 { 303 void *data; 304 size_t size; 305 }; 306 307 typedef char *SMDB_DBTYPE; 308 typedef 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 332 extern SMDB_DATABASE *smdb_malloc_database __P((void)); 333 extern void smdb_free_database __P((SMDB_DATABASE *)); 334 extern int smdb_open_database __P((SMDB_DATABASE **, char *, int, 335 int, long, SMDB_DBTYPE, 336 SMDB_USER_INFO *, 337 SMDB_DBPARAMS *)); 338 # ifdef NEWDB 339 extern 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 344 extern int smdb_ndbm_open __P((SMDB_DATABASE **, char *, int, int, 345 long, SMDB_DBTYPE, 346 SMDB_USER_INFO *, 347 SMDB_DBPARAMS *)); 348 # endif /* NDBM */ 349 extern int smdb_add_extension __P((char *, int, char *, char *)); 350 extern int smdb_setup_file __P((char *, char *, int, long, 351 SMDB_USER_INFO *, struct stat *)); 352 extern int smdb_lock_file __P((int *, char *, int, long, char *)); 353 extern int smdb_unlock_file __P((int)); 354 extern int smdb_filechanged __P((char *, char *, int, 355 struct stat *)); 356 extern void smdb_print_available_types __P((void)); 357 extern char *smdb_db_definition __P((SMDB_DBTYPE)); 358 extern int smdb_lock_map __P((SMDB_DATABASE *, int)); 359 extern int smdb_unlock_map __P((SMDB_DATABASE *)); 360 #endif /* ! _SMDB_H_ */ 361