File: tdb.h

package info (click to toggle)
samba-doc-ja 2.2.8a%2Bja1.0-0.1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 34,192 kB
  • ctags: 22,693
  • sloc: ansic: 197,587; sh: 8,073; perl: 5,377; makefile: 1,489; awk: 1,146; exp: 1,143; csh: 216
file content (162 lines) | stat: -rw-r--r-- 5,322 bytes parent folder | download
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 */