off, rec->next));
goto corrupt;
}
- if (tdb->methods->tdb_oob(tdb, rec->next, sizeof(*rec), 0))
+ if (tdb_oob(tdb, rec->next, sizeof(*rec), 0))
goto corrupt;
/* Check rec_len: similar to rec->next, implies next record. */
goto corrupt;
}
/* OOB allows "right at the end" access, so this works for last rec. */
- if (tdb->methods->tdb_oob(tdb, off, sizeof(*rec)+rec->rec_len, 0))
+ if (tdb_oob(tdb, off, sizeof(*rec)+rec->rec_len, 0))
goto corrupt;
/* Check tailer. */
}
/* Make sure we know true size of the underlying file. */
- tdb->methods->tdb_oob(tdb, tdb->map_size, 1, 1);
+ tdb_oob(tdb, tdb->map_size, 1, 1);
/* Header must be OK: also gets us the recovery ptr, if any. */
if (!tdb_check_header(tdb, &recovery_start))
rec->magic, off));
return -1;
}
- if (tdb->methods->tdb_oob(tdb, rec->next, sizeof(*rec), 0) != 0)
+ if (tdb_oob(tdb, rec->next, sizeof(*rec), 0) != 0)
return -1;
return 0;
}
return -1;
}
- if (tdb->methods->tdb_oob(tdb, off, len, 0) != 0)
+ if (tdb_oob(tdb, off, len, 0) != 0)
return -1;
if (tdb->map_ptr) {
static int tdb_read(struct tdb_context *tdb, tdb_off_t off, void *buf,
tdb_len_t len, int cv)
{
- if (tdb->methods->tdb_oob(tdb, off, len, 0) != 0) {
+ if (tdb_oob(tdb, off, len, 0) != 0) {
return -1;
}
}
/* must know about any previous expansions by another process */
- tdb->methods->tdb_oob(tdb, tdb->map_size, 1, 1);
+ tdb_oob(tdb, tdb->map_size, 1, 1);
/*
* Note: that we don't care about tdb->hdr_ofs != 0 here
return -1;
}
+int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe)
+{
+ int ret = tdb->methods->tdb_oob(tdb, off, len, probe);
+ return ret;
+}
+
/* read/write a tdb_off_t */
int tdb_ofs_read(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d)
{
* Optimize by avoiding the malloc/memcpy/free, point the
* parser directly at the mmap area.
*/
- if (tdb->methods->tdb_oob(tdb, offset, len, 0) != 0) {
+ if (tdb_oob(tdb, offset, len, 0) != 0) {
return -1;
}
data.dptr = offset + (unsigned char *)tdb->map_ptr;
return -1;
}
- ret = tdb->methods->tdb_oob(tdb, offset, rec->key_len, 1);
+ ret = tdb_oob(tdb, offset, rec->key_len, 1);
if (ret == -1) {
return -1;
}
- ret = tdb->methods->tdb_oob(tdb, offset, rec->data_len, 1);
+ ret = tdb_oob(tdb, offset, rec->data_len, 1);
if (ret == -1) {
return -1;
}
- ret = tdb->methods->tdb_oob(tdb, offset, rec->rec_len, 1);
+ ret = tdb_oob(tdb, offset, rec->rec_len, 1);
if (ret == -1) {
return -1;
}
- return tdb->methods->tdb_oob(tdb, rec->next, sizeof(*rec), 0);
+ return tdb_oob(tdb, rec->next, sizeof(*rec), 0);
}
int tdb_rec_write(struct tdb_context *tdb, tdb_off_t offset, struct tdb_record *rec)
* As this skips tdb->hdr_ofs.
*/
tdb->map_size = 0;
- ret = tdb->methods->tdb_oob(tdb, 0, 1, 0);
+ ret = tdb_oob(tdb, 0, 1, 0);
if (ret == -1) {
errno = EIO;
goto fail;
goto fail;
}
- ret = tdb->methods->tdb_oob(tdb, FREELIST_TOP, 4*tdb->hash_size, 1);
+ ret = tdb_oob(tdb, FREELIST_TOP, 4*tdb->hash_size, 1);
if (ret == -1) {
TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_open_ex: "
"hash size %"PRIu32" does not fit\n", tdb->hash_size));
* As this skips tdb->hdr_ofs.
*/
tdb->map_size = 0;
- if (tdb->methods->tdb_oob(tdb, 0, 1, 0) != 0) {
+ if (tdb_oob(tdb, 0, 1, 0) != 0) {
goto fail;
}
#endif /* fake pread or pwrite */
if (rec->next > 0 && rec->next < TDB_DATA_START(tdb->hash_size))
return false;
- if (tdb->methods->tdb_oob(tdb, rec->next, sizeof(*rec), 1))
+ if (tdb_oob(tdb, rec->next, sizeof(*rec), 1))
return false;
key->dsize = rec->key_len;
}
/* Make sure we know true size of the underlying file. */
- tdb->methods->tdb_oob(tdb, tdb->map_size, 1, 1);
+ tdb_oob(tdb, tdb->map_size, 1, 1);
/* Suppress logging, since we anticipate errors. */
tdb->log.log_fn = logging_suppressed;
int tdb_free(struct tdb_context *tdb, tdb_off_t offset, struct tdb_record *rec);
tdb_off_t tdb_allocate(struct tdb_context *tdb, int hash, tdb_len_t length,
struct tdb_record *rec);
+int tdb_oob(struct tdb_context *tdb, tdb_off_t off, tdb_len_t len, int probe);
int tdb_ofs_read(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d);
int tdb_ofs_write(struct tdb_context *tdb, tdb_off_t offset, tdb_off_t *d);
int tdb_lock_record(struct tdb_context *tdb, tdb_off_t off);
/* make sure we know about any file expansions already done by
anyone else */
- tdb->methods->tdb_oob(tdb, tdb->map_size, 1, 1);
+ tdb_oob(tdb, tdb->map_size, 1, 1);
tdb->transaction->old_map_size = tdb->map_size;
/* finally hook the io methods, replacing them with
if ((tdb->transaction == NULL) &&
(tdb->map_ptr != NULL)) {
- ret = tdb->methods->tdb_oob(
- tdb, key_ofs, full_len, 0);
+ ret = tdb_oob(tdb, key_ofs, full_len, 0);
if (ret == -1) {
goto fail;
}