Licensing Information

Open Source Used In Cisco FXOS 1.1(3) 857
if necessary */
static int tdb_oob(TDB_CONTEXT *tdb, tdb_off offset)
{
struct stat st;
if ((offset <= tdb->map_size) || (tdb->fd == -1)) return 0;
fstat(tdb->fd, &st);
if (st.st_size <= (ssize_t)offset) {
tdb->ecode = TDB_ERR_IO;
return -1;
}
#if HAVE_MMAP
if (tdb->map_ptr) {
munmap(tdb->map_ptr, tdb->map_size);
tdb->map_ptr = NULL;
}
#endif
tdb->map_size = st.st_size;
#if HAVE_MMAP
tdb->map_ptr = (void *)mmap(NULL, tdb->map_size,
 tdb->read_only?PROT_READ:PROT_READ|PROT_WRITE,
 MAP_SHARED | MAP_FILE, tdb->fd, 0);
#endif
return 0;
}
/* write a lump of data at a specified offset */
static int tdb_write(TDB_CONTEXT *tdb, tdb_off offset, const char *buf, tdb_len len)
{
if (tdb_oob(tdb, offset + len) != 0) {
/* oops - trying to write beyond the end of the database! */
return -1;
}
if (tdb->map_ptr) {
memcpy(offset + (char *)tdb->map_ptr, buf, len);
} else {
if (lseek(tdb->fd, offset, SEEK_SET) != offset ||
 write(tdb->fd, buf, len) != (ssize_t)len) {
tdb->ecode = TDB_ERR_IO;
return -1;
}
}
return 0;
}