in src/hashwriter.c [315:351]
static sparkey_returncode fill_hash(uint8_t *hashtable, const char *hash_filename, sparkey_hashheader *old_header, sparkey_hashheader *new_header) {
int fd = open(hash_filename, O_RDONLY);
if (fd < 0) {
return sparkey_open_returncode(errno);
}
lseek(fd, old_header->header_size, SEEK_SET);
int slot_size = old_header->address_size + old_header->hash_size;
uint64_t buffer_size = slot_size * 1024;
uint8_t *buf = malloc(buffer_size);
if (buf == NULL) {
fprintf(stderr, "fill_hash():%d bug: could not malloc %"PRIu64" bytes\n", __LINE__, buffer_size);
return SPARKEY_INTERNAL_ERROR;
}
sparkey_returncode returncode = SPARKEY_SUCCESS;
uint64_t remaining = old_header->hash_capacity * slot_size;
while (buffer_size <= remaining) {
TRY(read_fully(fd, buf, buffer_size), free);
TRY(hash_copy(hashtable, buf, buffer_size, old_header, new_header), free);
remaining -= buffer_size;
}
TRY(read_fully(fd, buf, remaining), free);
TRY(hash_copy(hashtable, buf, remaining, old_header, new_header), free);
free:
free(buf);
if (close(fd) < 0) {
if (returncode == SPARKEY_SUCCESS) {
fprintf(stderr, "fill_hash():%d bug: could not close file. errno = %d\n", __LINE__, errno);
returncode = SPARKEY_INTERNAL_ERROR;
}
}
return returncode;
}