Licensing Information
Open Source Used In Cisco FXOS 1.1(3) 877
/* leave this lock in place */
tdb_brlock(&tdb, ACTIVE_LOCK, LOCK_SET, F_RDLCK, F_SETLKW);
if (read(tdb.fd, &tdb.header, sizeof(tdb.header)) != sizeof(tdb.header) ||
strcmp(tdb.header.magic_food, TDB_MAGIC_FOOD) != 0 ||
tdb.header.version != TDB_VERSION) {
/* its not a valid database - possibly initialise it */
if (!(open_flags & O_CREAT)) {
goto fail;
}
if (tdb_new_database(&tdb, hash_size) == -1) goto fail;
lseek(tdb.fd, 0, SEEK_SET);
if (tdb.fd != -1 && read(tdb.fd, &tdb.header,
sizeof(tdb.header)) !=
sizeof(tdb.header))
goto fail;
}
if (tdb.fd != -1) {
fstat(tdb.fd, &st);
/* map the database and fill in the return structure */
tdb.name = (char *)strdup(name);
tdb.map_size = st.st_size;
}
tdb.locked = (int *)calloc(tdb.header.hash_size+1,
sizeof(tdb.locked[0]));
if (!tdb.locked) {
goto fail;
}
#if HAVE_MMAP
if (tdb.fd != -1) {
tdb.map_ptr = (void *)mmap(NULL, st.st_size,
tdb.read_only? PROT_READ : PROT_READ|PROT_WRITE,
MAP_SHARED | MAP_FILE, tdb.fd, 0);
}
#endif
ret = (TDB_CONTEXT *)malloc(sizeof(tdb));
if (!ret) goto fail;
*ret = tdb;
#if TDB_DEBUG
printf("mapped database of hash_size %u map_size=%u\n",