It's more consistent with what tdb1 does, and slightly more encapsulated.
void tdb_mmap(struct tdb_context *tdb)
{
void tdb_mmap(struct tdb_context *tdb)
{
if (tdb->flags & TDB_INTERNAL)
return;
if (tdb->flags & TDB_NOMMAP)
return;
if (tdb->flags & TDB_INTERNAL)
return;
if (tdb->flags & TDB_NOMMAP)
return;
+ if ((tdb->open_flags & O_ACCMODE) == O_RDONLY)
+ mmap_flags = PROT_READ;
+ else
+ mmap_flags = PROT_READ | PROT_WRITE;
+
/* size_t can be smaller than off_t. */
if ((size_t)tdb->file->map_size == tdb->file->map_size) {
tdb->file->map_ptr = mmap(NULL, tdb->file->map_size,
/* size_t can be smaller than off_t. */
if ((size_t)tdb->file->map_size == tdb->file->map_size) {
tdb->file->map_ptr = mmap(NULL, tdb->file->map_size,
MAP_SHARED, tdb->file->fd, 0);
} else
tdb->file->map_ptr = MAP_FAILED;
MAP_SHARED, tdb->file->fd, 0);
} else
tdb->file->map_ptr = MAP_FAILED;
tdb->log_fn = NULL;
tdb->transaction = NULL;
tdb->access = NULL;
tdb->log_fn = NULL;
tdb->transaction = NULL;
tdb->access = NULL;
+ tdb->open_flags = open_flags;
tdb->last_error = TDB_SUCCESS;
tdb->file = NULL;
tdb->lock_fn = tdb_fcntl_lock;
tdb->last_error = TDB_SUCCESS;
tdb->file = NULL;
tdb->lock_fn = tdb_fcntl_lock;
if ((open_flags & O_ACCMODE) == O_RDONLY) {
tdb->read_only = true;
if ((open_flags & O_ACCMODE) == O_RDONLY) {
tdb->read_only = true;
- tdb->mmap_flags = PROT_READ;
openlock = F_RDLCK;
} else {
tdb->read_only = false;
openlock = F_RDLCK;
} else {
tdb->read_only = false;
- tdb->mmap_flags = PROT_READ | PROT_WRITE;
/* Operating read-only? (Opened O_RDONLY, or in traverse_read) */
bool read_only;
/* Operating read-only? (Opened O_RDONLY, or in traverse_read) */
bool read_only;
- /* mmap read only? */
- int mmap_flags;
+ /* Open flags passed to tdb_open. */
+ int open_flags;
/* the flags passed to tdb_open, for tdb_reopen. */
uint32_t flags;
/* the flags passed to tdb_open, for tdb_reopen. */
uint32_t flags;