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_ */