ia64/xen-unstable

view tools/xenstore/tdb.h @ 7238:971e7c7411b3

Raise an exception if an error appears on the pipes to our children, and make
sure that the child's pipes are closed even under that exception. Move the
handling of POLLHUP to the end of the loop, so that we guarantee to read any
remaining data from the child if POLLHUP and POLLIN appear at the same time.

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