Licensing Information
Open Source Used In Cisco FXOS 1.1(4) 956
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;
}
/* read a lump of data at a specified offset */
static int tdb_read(TDB_CONTEXT *tdb, tdb_off offset, char *buf, tdb_len len)
{
if (tdb_oob(tdb, offset + len) != 0) {
/* oops - trying to read beyond the end of the database! */
return -1;
}
if (tdb->map_ptr) {
memcpy(buf, offset + (char *)tdb->map_ptr, len);
} else {
if (lseek(tdb->fd, offset, SEEK_SET) != offset ||
read(tdb->fd, buf, len) != (ssize_t)len) {
tdb->ecode = TDB_ERR_IO;
return -1;
}
}
return 0;