in src/logwriter.c [122:171]
sparkey_returncode sparkey_logwriter_append(sparkey_logwriter **log_ref, const char *filename) {
sparkey_returncode returncode;
int fd = 0;
sparkey_logwriter *log = malloc(sizeof(sparkey_logwriter));
if (log == NULL) {
TRY(SPARKEY_INTERNAL_ERROR, error);
}
TRY(sparkey_load_logheader(&log->header, filename), error);
if (log->header.major_version != LOG_MAJOR_VERSION) {
TRY(SPARKEY_WRONG_LOG_MAJOR_VERSION, error);
}
if (log->header.minor_version != LOG_MINOR_VERSION) {
TRY(SPARKEY_UNSUPPORTED_LOG_MINOR_VERSION, error);
}
if (sparkey_uses_compressor(log->header.compression_type)) {
if (log->header.compression_block_size < 10) {
TRY(SPARKEY_INVALID_COMPRESSION_BLOCK_SIZE, error);
}
log->max_compressed_size = sparkey_compressors[log->header.compression_type].max_compressed_size(
log->header.compression_block_size);
log->compressed = malloc(log->max_compressed_size);
} else {
log->header.compression_block_size = 0;
log->compressed = NULL;
}
fd = open(filename, O_WRONLY, 00644);
if (fd == -1) {
int e = errno;
TRY(sparkey_create_returncode(e), error);
}
log->fd = fd;
lseek(fd, log->header.data_end, SEEK_SET);
TRY(buf_init(&log->file_buf, 1024*1024), error);
TRY(buf_init(&log->block_buf, log->header.compression_block_size), error);
log->entry_count = 0;
log->open_status = MAGIC_VALUE_LOGWRITER;
*log_ref = log;
return SPARKEY_SUCCESS;
error:
free(log);
if (fd > 0) close(fd);
return returncode;
}