1#ifndef __TDB_H__ 2#define __TDB_H__ 3 4/* 5 Unix SMB/CIFS implementation. 6 Samba database functions 7 Copyright (C) Andrew Tridgell 1999 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 2 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 22*/ 23 24#ifdef __cplusplus 25extern "C" { 26#endif 27 28 29/* flags to tdb_store() */ 30#define TDB_REPLACE 1 31#define TDB_INSERT 2 32#define TDB_MODIFY 3 33 34/* flags for tdb_open() */ 35#define TDB_DEFAULT 0 /* just a readability place holder */ 36#define TDB_CLEAR_IF_FIRST 1 37#define TDB_INTERNAL 2 /* don't store on disk */ 38#define TDB_NOLOCK 4 /* don't do any locking */ 39#define TDB_NOMMAP 8 /* don't use mmap */ 40#define TDB_CONVERT 16 /* convert endian (internal use) */ 41#define TDB_BIGENDIAN 32 /* header is big-endian (internal use) */ 42 43#define TDB_ERRCODE(code, ret) ((tdb->ecode = (code)), ret) 44 45/* error codes */ 46enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK, 47 TDB_ERR_OOM, TDB_ERR_EXISTS, TDB_ERR_NOEXIST, TDB_ERR_NOLOCK, TDB_ERR_LOCK_TIMEOUT }; 48 49#ifndef u32 50#define u32 unsigned 51#endif 52 53typedef struct { 54 char *dptr; 55 size_t dsize; 56} TDB_DATA; 57 58typedef u32 tdb_len; 59typedef u32 tdb_off; 60 61/* this is stored at the front of every database */ 62struct tdb_header { 63 char magic_food[32]; /* for /etc/magic */ 64 u32 version; /* version of the code */ 65 u32 hash_size; /* number of hash entries */ 66 tdb_off rwlocks; 67 tdb_off reserved[31]; 68}; 69 70struct tdb_lock_type { 71 u32 count; 72 u32 ltype; 73}; 74 75struct tdb_traverse_lock { 76 struct tdb_traverse_lock *next; 77 u32 off; 78 u32 hash; 79}; 80 81/* this is the context structure that is returned from a db open */ 82typedef struct tdb_context { 83 char *name; /* the name of the database */ 84 void *map_ptr; /* where it is currently mapped */ 85 int fd; /* open file descriptor for the database */ 86 tdb_len map_size; /* how much space has been mapped */ 87 int read_only; /* opened read-only */ 88 struct tdb_lock_type *locked; /* array of chain locks */ 89 enum TDB_ERROR ecode; /* error code for last tdb error */ 90 struct tdb_header header; /* a cached copy of the header */ 91 u32 flags; /* the flags passed to tdb_open */ 92 u32 *lockedkeys; /* array of locked keys: first is #keys */ 93 struct tdb_traverse_lock travlocks; /* current traversal locks */ 94 struct tdb_context *next; /* all tdbs to avoid multiple opens */ 95 dev_t device; /* uniquely identifies this tdb */ 96 ino_t inode; /* uniquely identifies this tdb */ 97 void (*log_fn)(struct tdb_context *tdb, int level, const char *, ...); /* logging function */ 98 int open_flags; /* flags used in the open - needed by reopen */ 99} TDB_CONTEXT; 100 101typedef int (*tdb_traverse_func)(TDB_CONTEXT *, TDB_DATA, TDB_DATA, void *); 102typedef void (*tdb_log_func)(TDB_CONTEXT *, int , const char *, ...); 103 104TDB_CONTEXT *tdb_open(const char *name, int hash_size, int tdb_flags, 105 int open_flags, mode_t mode); 106TDB_CONTEXT *tdb_open_ex(const char *name, int hash_size, int tdb_flags, 107 int open_flags, mode_t mode, 108 tdb_log_func log_fn); 109 110int tdb_reopen(TDB_CONTEXT *tdb); 111int tdb_reopen_all(void); 112void tdb_logging_function(TDB_CONTEXT *tdb, tdb_log_func); 113enum TDB_ERROR tdb_error(TDB_CONTEXT *tdb); 114const char *tdb_errorstr(TDB_CONTEXT *tdb); 115TDB_DATA tdb_fetch(TDB_CONTEXT *tdb, TDB_DATA key); 116int tdb_delete(TDB_CONTEXT *tdb, TDB_DATA key); 117int tdb_store(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, int flag); 118int tdb_append(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA new_dbuf); 119int tdb_close(TDB_CONTEXT *tdb); 120TDB_DATA tdb_firstkey(TDB_CONTEXT *tdb); 121TDB_DATA tdb_nextkey(TDB_CONTEXT *tdb, TDB_DATA key); 122int tdb_traverse(TDB_CONTEXT *tdb, tdb_traverse_func fn, void *state); 123int tdb_exists(TDB_CONTEXT *tdb, TDB_DATA key); 124int tdb_lockkeys(TDB_CONTEXT *tdb, u32 number, TDB_DATA keys[]); 125void tdb_unlockkeys(TDB_CONTEXT *tdb); 126int tdb_lockall(TDB_CONTEXT *tdb); 127void tdb_unlockall(TDB_CONTEXT *tdb); 128 129/* Low level locking functions: use with care */ 130void tdb_set_lock_alarm(sig_atomic_t *palarm); 131int tdb_chainlock(TDB_CONTEXT *tdb, TDB_DATA key); 132int tdb_chainunlock(TDB_CONTEXT *tdb, TDB_DATA key); 133 134/* Debug functions. Not used in production. */ 135void tdb_dump_all(TDB_CONTEXT *tdb); 136int tdb_printfreelist(TDB_CONTEXT *tdb); 137 138extern TDB_DATA tdb_null; 139 140#ifdef __cplusplus 141} 142#endif 143 144#endif /* tdb.h */ 145