mirror of
https://github.com/samba-team/samba.git
synced 2024-12-24 21:34:56 +03:00
tdb2: save openhook, allow tdb_get_attribute() on it.
This makes it easy to call it again after a fork(), such as for re-establishing the CLEAR_IF_FIRST files locks. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (Imported from CCAN commit 937d0babe99dcd315040a9e48430140e63e4a7df)
This commit is contained in:
parent
73e4f35e3d
commit
617c1fcfa4
@ -270,11 +270,11 @@ enum TDB_ERROR tdb_get_attribute(struct tdb_context *tdb,
|
||||
attr->seed.seed = tdb->hash_seed;
|
||||
break;
|
||||
case TDB_ATTRIBUTE_OPENHOOK:
|
||||
return tdb->last_error
|
||||
= tdb_logerr(tdb, TDB_ERR_EINVAL,
|
||||
TDB_LOG_USE_ERROR,
|
||||
"tdb_get_attribute:"
|
||||
" cannot get TDB_ATTRIBUTE_OPENHOOK");
|
||||
if (!tdb->openhook)
|
||||
return tdb->last_error = TDB_ERR_NOEXIST;
|
||||
attr->openhook.fn = tdb->openhook;
|
||||
attr->openhook.data = tdb->openhook_data;
|
||||
break;
|
||||
case TDB_ATTRIBUTE_STATS: {
|
||||
size_t size = attr->stats.size;
|
||||
if (size > tdb->stats.size)
|
||||
@ -306,16 +306,16 @@ void tdb_unset_attribute(struct tdb_context *tdb,
|
||||
case TDB_ATTRIBUTE_LOG:
|
||||
tdb->log_fn = NULL;
|
||||
break;
|
||||
case TDB_ATTRIBUTE_OPENHOOK:
|
||||
tdb->openhook = NULL;
|
||||
break;
|
||||
case TDB_ATTRIBUTE_HASH:
|
||||
case TDB_ATTRIBUTE_SEED:
|
||||
case TDB_ATTRIBUTE_OPENHOOK:
|
||||
tdb_logerr(tdb, TDB_ERR_EINVAL, TDB_LOG_USE_ERROR,
|
||||
"tdb_unset_attribute: cannot unset %s after opening",
|
||||
type == TDB_ATTRIBUTE_HASH
|
||||
? "TDB_ATTRIBUTE_HASH"
|
||||
: type == TDB_ATTRIBUTE_SEED
|
||||
? "TDB_ATTRIBUTE_SEED"
|
||||
: "TDB_ATTRIBUTE_OPENHOOK");
|
||||
: "TDB_ATTRIBUTE_SEED");
|
||||
break;
|
||||
case TDB_ATTRIBUTE_STATS:
|
||||
tdb_logerr(tdb, TDB_ERR_EINVAL,
|
||||
@ -347,7 +347,6 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
|
||||
ssize_t rlen;
|
||||
struct tdb_header hdr;
|
||||
struct tdb_attribute_seed *seed = NULL;
|
||||
struct tdb_attribute_openhook *openhook = NULL;
|
||||
tdb_bool_err berr;
|
||||
enum TDB_ERROR ecode;
|
||||
int openlock;
|
||||
@ -372,6 +371,7 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
|
||||
tdb->open_flags = open_flags;
|
||||
tdb->last_error = TDB_SUCCESS;
|
||||
tdb->file = NULL;
|
||||
tdb->openhook = NULL;
|
||||
tdb->lock_fn = tdb_fcntl_lock;
|
||||
tdb->unlock_fn = tdb_fcntl_unlock;
|
||||
tdb->hash_fn = jenkins_hash;
|
||||
@ -390,7 +390,8 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
|
||||
seed = &attr->seed;
|
||||
break;
|
||||
case TDB_ATTRIBUTE_OPENHOOK:
|
||||
openhook = &attr->openhook;
|
||||
tdb->openhook = attr->openhook.fn;
|
||||
tdb->openhook_data = attr->openhook.data;
|
||||
break;
|
||||
default:
|
||||
/* These are set as normal. */
|
||||
@ -498,8 +499,8 @@ struct tdb_context *tdb_open(const char *name, int tdb_flags,
|
||||
}
|
||||
|
||||
/* call their open hook if they gave us one. */
|
||||
if (openhook) {
|
||||
ecode = openhook->fn(tdb->file->fd, openhook->data);
|
||||
if (tdb->openhook) {
|
||||
ecode = tdb->openhook(tdb->file->fd, tdb->openhook_data);
|
||||
if (ecode != TDB_SUCCESS) {
|
||||
tdb_logerr(tdb, ecode, TDB_LOG_ERROR,
|
||||
"tdb_open: open hook failed");
|
||||
|
@ -374,6 +374,10 @@ struct tdb_context {
|
||||
tdb_off_t ftable_off;
|
||||
unsigned int ftable;
|
||||
|
||||
/* Our open hook, if any. */
|
||||
enum TDB_ERROR (*openhook)(int fd, void *data);
|
||||
void *openhook_data;
|
||||
|
||||
/* IO methods: changes for transactions. */
|
||||
const struct tdb_methods *methods;
|
||||
|
||||
|
@ -619,8 +619,6 @@ enum tdb_attribute_type {
|
||||
* This gets an attribute from a TDB which has previously been set (or
|
||||
* may return the default values). Set @attr.base.attr to the
|
||||
* attribute type you want get.
|
||||
*
|
||||
* Currently this does not work for TDB_ATTRIBUTE_OPENHOOK.
|
||||
*/
|
||||
enum TDB_ERROR tdb_get_attribute(struct tdb_context *tdb,
|
||||
union tdb_attribute *attr);
|
||||
|
@ -4,9 +4,9 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
/* FIXME: Check these! */
|
||||
#define INITIAL_TDB_MALLOC "open.c", 338, FAILTEST_MALLOC
|
||||
#define URANDOM_OPEN "open.c", 45, FAILTEST_OPEN
|
||||
#define URANDOM_READ "open.c", 25, FAILTEST_READ
|
||||
#define INITIAL_TDB_MALLOC "open.c", 354, FAILTEST_MALLOC
|
||||
#define URANDOM_OPEN "open.c", 62, FAILTEST_OPEN
|
||||
#define URANDOM_READ "open.c", 42, FAILTEST_READ
|
||||
|
||||
bool exit_check_log(struct failtest_call *history, unsigned num);
|
||||
bool failmatch(const struct failtest_call *call,
|
||||
|
Loading…
Reference in New Issue
Block a user