case HASHTABLE:
len = hashtable_len(&e->hashtable);
break;
+ default:
+ abort();
}
off += len;
assert(zone_left >= len);
zone_left -= len;
}
- /* Fill final zone with free record. */
- if (zone_left != 0) {
- tdb_layout_add_free(layout,
- zone_left
- - sizeof(struct tdb_used_record));
- layout->elem[layout->num_elems-1].base.off = off;
- off += zone_left;
- }
-
- mem = malloc(off+1);
+ mem = malloc(off);
/* Now populate our header, cribbing from a real TDB header. */
tdb = tdb_open(NULL, TDB_INTERNAL, O_RDWR, 0, &tap_log_attr);
memcpy(mem, tdb->map_ptr, sizeof(struct tdb_header));
/* Mug the tdb we have to make it use this. */
free(tdb->map_ptr);
tdb->map_ptr = mem;
- tdb->map_size = off+1;
+ tdb->map_size = off;
for (i = 0; i < layout->num_elems; i++) {
union tdb_layout_elem *e = &layout->elem[i];
}
}
- /* Write tailer. */
- ((uint8_t *)tdb->map_ptr)[tdb->map_size-1] = last_zone->zone_bits;
-
/* Get physical if they asked for it. */
if (layout->filename) {
int fd = open(layout->filename, O_WRONLY|O_TRUNC|O_CREAT,
0600);
if (fd < 0)
err(1, "opening %s for writing", layout->filename);
- write(fd, tdb->map_ptr, tdb->map_size);
+ if (write(fd, tdb->map_ptr, tdb->map_size) != tdb->map_size)
+ err(1, "writing %s", layout->filename);
close(fd);
tdb_close(tdb);
/* NOMMAP is for lockcheck. */
tdb = tdb_open(layout->filename, TDB_NOMMAP, O_RDWR, 0,
&tap_log_attr);
}
+
return tdb;
}