}
}
-void tdb_mmap(struct tdb_context *tdb)
+enum TDB_ERROR tdb_mmap(struct tdb_context *tdb)
{
int mmap_flags;
if (tdb->flags & TDB_INTERNAL)
- return;
+ return TDB_SUCCESS;
+#ifndef HAVE_INCOHERENT_MMAP
if (tdb->flags & TDB_NOMMAP)
- return;
+ return TDB_SUCCESS;
+#endif
if ((tdb->open_flags & O_ACCMODE) == O_RDONLY)
mmap_flags = PROT_READ;
*/
if (tdb->file->map_ptr == MAP_FAILED) {
tdb->file->map_ptr = NULL;
+#ifdef HAVE_INCOHERENT_MMAP
+ /* Incoherent mmap means everyone must mmap! */
+ return tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
+ "tdb_mmap failed for size %lld (%s)",
+ (long long)tdb->file->map_size,
+ strerror(errno));
+#else
tdb_logerr(tdb, TDB_SUCCESS, TDB_LOG_WARNING,
"tdb_mmap failed for size %lld (%s)",
(long long)tdb->file->map_size, strerror(errno));
+#endif
}
+ return TDB_SUCCESS;
}
/* check for an out of bounds access - if it is out of bounds then
tdb_munmap(tdb->file);
tdb->file->map_size = st.st_size;
- tdb_mmap(tdb);
- return TDB_SUCCESS;
+ return tdb_mmap(tdb);
}
/* Endian conversion: we only ever deal with 8 byte quantities */
if (tdb->file->map_ptr) {
memcpy(off + (char *)tdb->file->map_ptr, buf, len);
} else {
+#ifdef HAVE_INCOHERENT_MMAP
+ return TDB_ERR_IO;
+#else
ssize_t ret;
ret = pwrite(tdb->file->fd, buf, len, off);
if (ret != len) {
ret, (size_t)off, (size_t)len,
strerror(errno));
}
+#endif
}
return TDB_SUCCESS;
}
if (tdb->file->map_ptr) {
memcpy(buf, off + (char *)tdb->file->map_ptr, len);
} else {
+#ifdef HAVE_INCOHERENT_MMAP
+ return TDB_ERR_IO;
+#else
ssize_t r = pread(tdb->file->fd, buf, len, off);
if (r != len) {
return tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
strerror(errno),
(size_t)tdb->file->map_size);
}
+#endif
}
return TDB_SUCCESS;
}
}
tdb->file->map_ptr = new;
tdb->file->map_size += addition;
+ return TDB_SUCCESS;
} else {
/* Unmap before trying to write; old TDB claimed OpenBSD had
* problem with this otherwise. */
if (ecode != TDB_SUCCESS)
return ecode;
tdb->file->map_size += addition;
- tdb_mmap(tdb);
+ return tdb_mmap(tdb);
}
- return TDB_SUCCESS;
}
const void *tdb_access_read(struct tdb_context *tdb,