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