return 0;
}
-int read_buf_full_from_fd(FILE *fd, char *read_buf, const size_t read_buf_size,
- const size_t amount_total, char *dst_buf) {
+SDArchiverStateReturns read_buf_full_from_fd(FILE *fd,
+ char *read_buf,
+ const size_t read_buf_size,
+ const size_t amount_total,
+ char *dst_buf) {
size_t amount = amount_total;
while (amount != 0) {
if (amount >= read_buf_size) {
return SDAS_SUCCESS;
}
-int read_fd_to_out_fd(FILE *in_fd, FILE *out_fd, char *read_buf,
- const size_t read_buf_size, const size_t amount_total) {
+SDArchiverStateReturns read_fd_to_out_fd(FILE *in_fd,
+ FILE *out_fd,
+ char *read_buf,
+ const size_t read_buf_size,
+ const size_t amount_total) {
size_t amount = amount_total;
while (amount != 0) {
if (amount >= read_buf_size) {
return SDAS_SUCCESS;
}
-int try_write_to_decomp(int *to_dec_pipe, uint64_t *chunk_remaining, FILE *in_f,
- char *buf, const size_t buf_size, char *hold_buf,
- ssize_t *has_hold) {
+SDArchiverStateReturns try_write_to_decomp(int *to_dec_pipe,
+ uint64_t *chunk_remaining,
+ FILE *in_f,
+ char *buf,
+ const size_t buf_size,
+ char *hold_buf,
+ ssize_t *has_hold) {
if (*to_dec_pipe >= 0) {
if (*chunk_remaining > 0) {
if (*chunk_remaining > buf_size) {
}
/// Returns SDAS_SUCCESS on success.
-int read_decomp_to_out_file(const char *out_filename, int in_pipe,
- char *read_buf, const size_t read_buf_size,
- const uint64_t file_size, int *to_dec_pipe,
- uint64_t *chunk_remaining, FILE *in_f,
- char *hold_buf, ssize_t *has_hold) {
+SDArchiverStateReturns read_decomp_to_out_file(const char *out_filename,
+ int in_pipe,
+ char *read_buf,
+ const size_t read_buf_size,
+ const uint64_t file_size,
+ int *to_dec_pipe,
+ uint64_t *chunk_remaining,
+ FILE *in_f,
+ char *hold_buf,
+ ssize_t *has_hold) {
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE))) FILE *out_fd =
NULL;
if (out_filename) {
fprintf(stderr, "ERROR: SIGPIPE while decompressing!\n");
return SDAS_INTERNAL_ERROR;
}
- int ret = try_write_to_decomp(to_dec_pipe, chunk_remaining, in_f, read_buf,
- read_buf_size, hold_buf, has_hold);
+ SDArchiverStateReturns ret =
+ try_write_to_decomp(to_dec_pipe,
+ chunk_remaining,
+ in_f,
+ read_buf,
+ read_buf_size,
+ hold_buf,
+ has_hold);
if (ret != SDAS_SUCCESS) {
return ret;
} else if (is_sig_pipe_occurred) {
}
}
-int simple_archiver_write_all(FILE *out_f, SDArchiverState *state,
- const SDArchiverLinkedList *filenames) {
+SDArchiverStateRetStruct simple_archiver_write_all(
+ FILE *out_f,
+ SDArchiverState *state,
+ const SDArchiverLinkedList *filenames) {
signal(SIGINT, handle_sig_int);
switch (state->parsed->write_version) {
case 0:
default:
fprintf(stderr, "ERROR: Unsupported write version %" PRIu32 "!\n",
state->parsed->write_version);
- return SDAS_INVALID_WRITE_VERSION;
+ return SDA_RET_STRUCT(SDAS_INVALID_WRITE_VERSION);
}
}
-int simple_archiver_write_v0(FILE *out_f, SDArchiverState *state,
- const SDArchiverLinkedList *filenames) {
+SDArchiverStateRetStruct simple_archiver_write_v0(
+ FILE *out_f,
+ SDArchiverState *state,
+ const SDArchiverLinkedList *filenames) {
fprintf(stderr, "Writing archive of file format 0\n");
// Prune filenames based on white/black-lists.
simple_archiver_internal_prune_filenames_v0,
ptr_array)) {
free(ptr_array);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptr_array);
}
filenames_to_abs_map_fn,
ptr_array)) {
free(ptr_array);
- return SDAS_FAILED_TO_CREATE_MAP;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CREATE_MAP);
}
free(ptr_array);
}
if (fwrite("SIMPLE_ARCHIVE_VER", 1, 18, out_f) != 18) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
uint16_t u16 = 0;
// simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
if (state->parsed->compressor && !state->parsed->decompressor) {
- return SDAS_NO_DECOMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_DECOMPRESSOR);
} else if (!state->parsed->compressor && state->parsed->decompressor) {
- return SDAS_NO_COMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_COMPRESSOR);
} else if (state->parsed->compressor && state->parsed->decompressor) {
// Write the four flag bytes with first bit set.
uint8_t c = 1;
if (fwrite(&c, 1, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
c = 0;
for (size_t i = 0; i < 3; ++i) {
if (fwrite(&c, 1, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
size_t temp_size = strlen(state->parsed->compressor);
if (temp_size > 0xFFFF) {
fprintf(stderr, "ERROR: Compressor cmd string is too large!\n");
- return SDAS_NO_COMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_COMPRESSOR);
}
u16 = (uint16_t)temp_size;
// To big-endian.
simple_archiver_helper_16_bit_be(&u16);
// Write the size in big-endian.
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// From big-endian.
simple_archiver_helper_16_bit_be(&u16);
// Write the compressor cmd including the NULL at the end of the string.
if (fwrite(state->parsed->compressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
temp_size = strlen(state->parsed->decompressor);
if (temp_size > 0xFFFF) {
fprintf(stderr, "ERROR: Decompressor cmd string is too large!\n");
- return SDAS_NO_DECOMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_DECOMPRESSOR);
}
u16 = (uint16_t)temp_size;
// To big-endian.
simple_archiver_helper_16_bit_be(&u16);
// Write the size in big-endian.
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// From big-endian.
simple_archiver_helper_16_bit_be(&u16);
// Write the decompressor cmd including the NULL at the end of the string.
if (fwrite(state->parsed->decompressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
// Write the four flag bytes with first bit NOT set.
uint8_t c = 0;
for (size_t i = 0; i < 4; ++i) {
if (fwrite(&c, 1, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
{
if (filenames_pruned->count > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: Filenames count is too large!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
uint32_t u32 = (uint32_t)filenames_pruned->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
// Iterate over files in list to write.
if (state->parsed->user_cwd) {
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
- return 1;
+ return SDA_RET_STRUCT(1);
}
}
char format_str[64];
write_files_fn_file_v0,
state)) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
// Error occurred.
fprintf(stderr, "Error ocurred writing file(s) to archive.\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
state->out_f = NULL;
fprintf(stderr, "End archiving.\n");
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_write_v1(FILE *out_f, SDArchiverState *state,
- const SDArchiverLinkedList *filenames) {
+SDArchiverStateRetStruct simple_archiver_write_v1(
+ FILE *out_f,
+ SDArchiverState *state,
+ const SDArchiverLinkedList *filenames) {
fprintf(stderr, "Writing archive of file format 1\n");
// First create a "set" of absolute paths to given filenames.
__attribute__((cleanup(simple_archiver_hash_map_free)))
ptr_array[1] = (void *)state->parsed->user_cwd;
if (simple_archiver_list_get(filenames, filenames_to_abs_map_fn, ptr_array)) {
free(ptr_array);
- return SDAS_FAILED_TO_CREATE_MAP;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CREATE_MAP);
}
free(ptr_array);
if (simple_archiver_list_get(filenames, symlinks_and_files_from_files,
ptr_array)) {
free(ptr_array);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptr_array);
fprintf(stderr,
"ERROR: Count mismatch between files and symlinks and files from "
"parser!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (fwrite("SIMPLE_ARCHIVE_VER", 1, 18, out_f) != 18) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
char buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
if (state->parsed->compressor && !state->parsed->decompressor) {
- return SDAS_NO_DECOMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_DECOMPRESSOR);
} else if (!state->parsed->compressor && state->parsed->decompressor) {
- return SDAS_NO_COMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_COMPRESSOR);
} else if (state->parsed->compressor && state->parsed->decompressor) {
// 4 bytes flags, using de/compressor.
memset(buf, 0, 4);
buf[0] |= 1;
if (fwrite(buf, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
size_t len = strlen(state->parsed->compressor);
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Compressor cmd is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->compressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
len = strlen(state->parsed->decompressor);
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Decompressor cmd is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->decompressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
// 4 bytes flags, not using de/compressor.
memset(buf, 0, 4);
if (fwrite(buf, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (symlinks_list->count > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: Too many symlinks!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
uint32_t u32 = (uint32_t)symlinks_list->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_32_bit_be(&u32);
if (state->parsed->user_cwd) {
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
int stat_status =
fstatat(AT_FDCWD, node->data, &stat_buf, AT_SYMLINK_NOFOLLOW);
if (stat_status != 0) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if ((stat_buf.st_mode & S_IRUSR) != 0) {
}
if (fwrite(buf, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
const size_t link_length = strlen(node->data);
}
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Link name is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (state->parsed->prefix) {
out_f);
fwrite_ret += fwrite(node->data, 1, link_length + 1, out_f);
if (fwrite_ret != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else if (fwrite(node->data, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
if (abs_path && (state->parsed->flags & 0x20) == 0 && !is_invalid) {
if (!abs_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to add prefix to abs symlink!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t abs_path_pref_length = strlen(abs_path_prefixed);
if (abs_path_pref_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination absolute path with prefix is "
"too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)abs_path_pref_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(abs_path_prefixed, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
const size_t abs_path_length = strlen(abs_path);
if (abs_path_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination absolute path is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)abs_path_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(abs_path, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (!rel_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to add prefix to relative symlink!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t rel_path_pref_length = strlen(rel_path_prefixed);
if (rel_path_pref_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination relative path with prefix is "
"too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)rel_path_pref_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(rel_path_prefixed, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
len = strlen(rel_path);
if (len >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination relative path is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(rel_path, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
"ERROR: Iterated through %" PRIu32 " symlinks out of %" PRIu64
" total!\n",
u32, symlinks_list->count);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
__attribute__((cleanup(simple_archiver_list_free)))
if (simple_archiver_list_get(files_list, files_to_chunk_count, ptrs)) {
free(ptrs);
fprintf(stderr, "ERROR: Internal error calculating chunk counts!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptrs);
if ((chunk_counts->count == 0 || current_size > 0) && current_count > 0) {
node != chunk_counts->tail; node = node->next) {
if (*((uint64_t *)node->data) > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: file count in chunk is too large!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
count += *((uint64_t *)node->data);
// fprintf(stderr, "DEBUG: chunk count %4llu\n",
fprintf(stderr,
"ERROR: Internal error calculating chunk counts (invalid number "
"of files)!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
// Write number of chunks.
if (chunk_counts->count > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: Too many chunks!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u32 = (uint32_t)chunk_counts->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
__attribute__((cleanup(simple_archiver_helper_cleanup_malloced))) void
for (SDArchiverLLNode *chunk_c_node = chunk_counts->head->next;
chunk_c_node != chunk_counts->tail; chunk_c_node = chunk_c_node->next) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
fprintf(stderr,
"CHUNK %3" PRIu64 " of %3" PRIu64 "\n",
u32 = (uint32_t)(*((uint64_t *)chunk_c_node->data));
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
SDArchiverLLNode *saved_node = file_node;
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
if (non_c_chunk_size) {
const size_t total_length = filename_len + prefix_length;
if (total_length >= 0xFFFF) {
fprintf(stderr, "ERROR: Filename with prefix is too large!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
u16 = (uint16_t)total_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->prefix, 1, prefix_length, out_f)
!= prefix_length) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
} else if (fwrite(file_info_struct->filename,
1,
filename_len + 1,
out_f)
!= filename_len + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
if (filename_len >= 0xFFFF) {
fprintf(stderr, "ERROR: Filename is too large!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
u16 = (uint16_t)filename_len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(file_info_struct->filename, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (fwrite(file_info_struct->bit_flags, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// UID and GID.
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = file_info_struct->gid;
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
uint64_t u64 = file_info_struct->file_size;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (!temp_fd) {
fprintf(stderr,
"ERROR: Failed to create a temporary file for archival!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
if (pipe(pipe_into_cmd) != 0) {
// Unable to create pipes.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (pipe(pipe_outof_cmd) != 0) {
// Unable to create second set of pipes.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_into_cmd[1], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on into-write-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_outof_cmd[0], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on outof-read-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
state->parsed->compressor,
&compressor_pid) != 0) {
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start compressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Close unnecessary pipe fds on this end of the transfer.
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
fprintf(stderr,
while (!to_comp_finished) {
if (is_sig_pipe_occurred) {
fprintf(stderr, "ERROR: SIGPIPE while compressing!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (!to_comp_finished) {
// Write to compressor.
if (ferror(fd)) {
fprintf(stderr, "ERROR: Writing to chunk, file read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (has_hold < 0) {
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, fd);
fprintf(
stderr,
"ERROR: Writing to compressor, pipe write error!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else if (write_ret == 0) {
fprintf(
stderr,
"ERROR: Writing to compressor, unable to write bytes!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
} else if ((size_t)write_ret < fread_ret) {
has_hold = (ssize_t)fread_ret - write_ret;
memcpy(hold_buf, buf + write_ret, (size_t)has_hold);
// Non-blocking write.
nanosleep(&nonblock_sleep, NULL);
} else {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (write_ret < has_hold) {
memcpy(buf, hold_buf + write_ret,
memcpy(hold_buf, buf, (size_t)(has_hold - write_ret));
has_hold = has_hold - write_ret;
} else if (write_ret != has_hold) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else {
has_hold = -1;
}
} else {
fprintf(stderr,
"ERROR: Reading from compressor, pipe read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"ERROR: Reading from compressor, failed to write to "
"temporary file!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
while (1) {
if (is_sig_pipe_occurred) {
fprintf(stderr, "ERROR: SIGPIPE while compressing!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
ssize_t read_ret =
read(pipe_outof_read, buf, SIMPLE_ARCHIVER_BUFFER_SIZE);
} else {
fprintf(stderr,
"ERROR: Reading from compressor, pipe read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"ERROR: Reading from compressor, failed to write to "
"temporary file!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
if (comp_chunk_size < 0) {
fprintf(stderr,
"ERROR: Temp file reported negative size after compression!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Write compressed chunk size.
uint64_t u64 = (uint64_t)comp_chunk_size;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
rewind(temp_fd);
// Write compressed chunk.
while (!feof(temp_fd)) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
} else if (ferror(temp_fd)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, temp_fd);
if (fread_ret > 0) {
fprintf(stderr,
"ERROR: Partial write of read bytes from temp file to "
"output file!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
if (written_size != (size_t)comp_chunk_size) {
fprintf(stderr,
"ERROR: Written chunk size is not actual chunk size!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// Cleanup and remove temp_fd.
} else {
// Is NOT compressing.
if (!non_c_chunk_size) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
simple_archiver_helper_64_bit_be(non_c_chunk_size);
fwrite(non_c_chunk_size, 8, 1, out_f);
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
fprintf(stderr,
while (!feof(fd)) {
if (ferror(fd)) {
fprintf(stderr, "ERROR: Writing to chunk, file read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, fd);
if (fread_ret > 0) {
size_t fwrite_ret = fwrite(buf, 1, fread_ret, out_f);
if (fwrite_ret != fread_ret) {
fprintf(stderr, "ERROR: Writing to chunk, file write error!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
}
}
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_write_v2(FILE *out_f, SDArchiverState *state,
- const SDArchiverLinkedList *filenames) {
+SDArchiverStateRetStruct simple_archiver_write_v2(
+ FILE *out_f,
+ SDArchiverState *state,
+ const SDArchiverLinkedList *filenames) {
fprintf(stderr, "Writing archive of file format 2\n");
// Because of some differences between version 1 and version 2, version 1's
// write function cannot be called directly, so there will be some duplicate
ptr_array[1] = (void *)state->parsed->user_cwd;
if (simple_archiver_list_get(filenames, filenames_to_abs_map_fn, ptr_array)) {
free(ptr_array);
- return SDAS_FAILED_TO_CREATE_MAP;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CREATE_MAP);
}
free(ptr_array);
if (simple_archiver_list_get(filenames, symlinks_and_files_from_files,
ptr_array)) {
free(ptr_array);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptr_array);
// files_list->count,
// dirs_list->count,
// filenames->count);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (fwrite("SIMPLE_ARCHIVE_VER", 1, 18, out_f) != 18) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
const size_t prefix_length = state->parsed->prefix
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
if (state->parsed->compressor && !state->parsed->decompressor) {
- return SDAS_NO_DECOMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_DECOMPRESSOR);
} else if (!state->parsed->compressor && state->parsed->decompressor) {
- return SDAS_NO_COMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_COMPRESSOR);
} else if (state->parsed->compressor && state->parsed->decompressor) {
// 4 bytes flags, using de/compressor.
memset(buf, 0, 4);
buf[0] |= 1;
if (fwrite(buf, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
size_t len = strlen(state->parsed->compressor);
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Compressor cmd is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->compressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
len = strlen(state->parsed->decompressor);
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Decompressor cmd is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->decompressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
// 4 bytes flags, not using de/compressor.
memset(buf, 0, 4);
if (fwrite(buf, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (symlinks_list->count > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: Too many symlinks!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
uint32_t u32 = (uint32_t)symlinks_list->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_32_bit_be(&u32);
if (state->parsed->user_cwd) {
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
int stat_status =
fstatat(AT_FDCWD, node->data, &stat_buf, AT_SYMLINK_NOFOLLOW);
if (stat_status != 0) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if ((stat_buf.st_mode & S_IRUSR) != 0) {
}
if (fwrite(buf, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
const size_t link_length = strlen(node->data);
}
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Link name is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (state->parsed->prefix) {
out_f);
fwrite_ret += fwrite(node->data, 1, link_length + 1, out_f);
if (fwrite_ret != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else if (fwrite(node->data, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
if (abs_path && (state->parsed->flags & 0x20) == 0 && !is_invalid) {
if (!abs_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to add prefix to abs symlink!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t abs_path_pref_length = strlen(abs_path_prefixed);
if (abs_path_pref_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination absolute path with prefix is "
"too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)abs_path_pref_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(abs_path_prefixed, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
const size_t abs_path_length = strlen(abs_path);
if (abs_path_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination absolute path is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)abs_path_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(abs_path, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (!rel_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to add prefix to relative symlink!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t rel_path_pref_length = strlen(rel_path_prefixed);
if (rel_path_pref_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination relative path with prefix is "
"too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)rel_path_pref_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(rel_path_prefixed, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
len = strlen(rel_path);
if (len >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination relative path is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(rel_path, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
"ERROR: Iterated through %" PRIu32 " symlinks out of %" PRIu64
" total!\n",
u32, symlinks_list->count);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
__attribute__((cleanup(simple_archiver_list_free)))
if (simple_archiver_list_get(files_list, files_to_chunk_count, ptrs)) {
free(ptrs);
fprintf(stderr, "ERROR: Internal error calculating chunk counts!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptrs);
if ((chunk_counts->count == 0 || current_size > 0) && current_count > 0) {
node != chunk_counts->tail; node = node->next) {
if (*((uint64_t *)node->data) > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: file count in chunk is too large!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
count += *((uint64_t *)node->data);
// fprintf(stderr, "DEBUG: chunk count %4llu\n",
// "count: %u, files_list_count: %u\n",
// count,
// files_list->count);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
// Write number of chunks.
if (chunk_counts->count > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: Too many chunks!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u32 = (uint32_t)chunk_counts->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
__attribute__((cleanup(simple_archiver_helper_cleanup_malloced))) void
for (SDArchiverLLNode *chunk_c_node = chunk_counts->head->next;
chunk_c_node != chunk_counts->tail; chunk_c_node = chunk_c_node->next) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
fprintf(stderr,
"CHUNK %3" PRIu64 " of %3" PRIu64 "\n",
u32 = (uint32_t)(*((uint64_t *)chunk_c_node->data));
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
SDArchiverLLNode *saved_node = file_node;
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
if (non_c_chunk_size) {
const size_t total_length = filename_len + prefix_length;
if (total_length >= 0xFFFF) {
fprintf(stderr, "ERROR: Filename with prefix is too large!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
u16 = (uint16_t)total_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->prefix, 1, prefix_length, out_f)
!= prefix_length) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
} else if (fwrite(file_info_struct->filename,
1,
filename_len + 1,
out_f)
!= filename_len + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
if (filename_len >= 0xFFFF) {
fprintf(stderr, "ERROR: Filename is too large!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
u16 = (uint16_t)filename_len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(file_info_struct->filename, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (fwrite(file_info_struct->bit_flags, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// UID and GID.
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = file_info_struct->gid;
if ((state->parsed->flags & 0x800) == 0) {
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
uint64_t u64 = file_info_struct->file_size;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (!temp_fd) {
fprintf(stderr,
"ERROR: Failed to create a temporary file for archival!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
if (pipe(pipe_into_cmd) != 0) {
// Unable to create pipes.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (pipe(pipe_outof_cmd) != 0) {
// Unable to create second set of pipes.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_into_cmd[1], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on into-write-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_outof_cmd[0], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on outof-read-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
state->parsed->compressor,
&compressor_pid) != 0) {
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start compressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Close unnecessary pipe fds on this end of the transfer.
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
fprintf(stderr,
while (!to_comp_finished) {
if (is_sig_pipe_occurred) {
fprintf(stderr, "ERROR: SIGPIPE while compressing!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (!to_comp_finished) {
// Write to compressor.
if (ferror(fd)) {
fprintf(stderr, "ERROR: Writing to chunk, file read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (has_hold < 0) {
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, fd);
fprintf(
stderr,
"ERROR: Writing to compressor, pipe write error!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else if (write_ret == 0) {
fprintf(
stderr,
"ERROR: Writing to compressor, unable to write bytes!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
} else if ((size_t)write_ret < fread_ret) {
has_hold = (ssize_t)fread_ret - write_ret;
memcpy(hold_buf, buf + write_ret, (size_t)has_hold);
// Non-blocking write.
nanosleep(&nonblock_sleep, NULL);
} else {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (write_ret < has_hold) {
memcpy(buf, hold_buf + write_ret,
memcpy(hold_buf, buf, (size_t)(has_hold - write_ret));
has_hold = has_hold - write_ret;
} else if (write_ret != has_hold) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else {
has_hold = -1;
}
} else {
fprintf(stderr,
"ERROR: Reading from compressor, pipe read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"ERROR: Reading from compressor, failed to write to "
"temporary file!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
while (1) {
if (is_sig_pipe_occurred) {
fprintf(stderr, "ERROR: SIGPIPE while compressing!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
ssize_t read_ret =
read(pipe_outof_read, buf, SIMPLE_ARCHIVER_BUFFER_SIZE);
} else {
fprintf(stderr,
"ERROR: Reading from compressor, pipe read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"ERROR: Reading from compressor, failed to write to "
"temporary file!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
if (comp_chunk_size < 0) {
fprintf(stderr,
"ERROR: Temp file reported negative size after compression!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Write compressed chunk size.
uint64_t u64 = (uint64_t)comp_chunk_size;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
rewind(temp_fd);
// Write compressed chunk.
while (!feof(temp_fd)) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
} else if (ferror(temp_fd)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, temp_fd);
if (fread_ret > 0) {
fprintf(stderr,
"ERROR: Partial write of read bytes from temp file to "
"output file!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
if (written_size != (size_t)comp_chunk_size) {
fprintf(stderr,
"ERROR: Written chunk size is not actual chunk size!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// Cleanup and remove temp_fd.
} else {
// Is NOT compressing.
if (!non_c_chunk_size) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
simple_archiver_helper_64_bit_be(non_c_chunk_size);
fwrite(non_c_chunk_size, 8, 1, out_f);
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
fprintf(stderr,
while (!feof(fd)) {
if (ferror(fd)) {
fprintf(stderr, "ERROR: Writing to chunk, file read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, fd);
if (fread_ret > 0) {
size_t fwrite_ret = fwrite(buf, 1, fread_ret, out_f);
if (fwrite_ret != fread_ret) {
fprintf(stderr, "ERROR: Writing to chunk, file write error!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
//fprintf(stderr, "DEBUG: Writing directory entries\n");
if (dirs_list->count > 0xFFFFFFFF) {
- return SDAS_TOO_MANY_DIRS;
+ return SDA_RET_STRUCT(SDAS_TOO_MANY_DIRS);
}
u32 = (uint32_t)dirs_list->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
void **void_ptrs = malloc(sizeof(void*) * 2);
internal_write_dir_entries_v2_v3_v4,
void_ptrs)) {
free(void_ptrs);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(void_ptrs);
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_write_v3(FILE *out_f, SDArchiverState *state,
- const SDArchiverLinkedList *filenames) {
+SDArchiverStateRetStruct simple_archiver_write_v3(
+ FILE *out_f,
+ SDArchiverState *state,
+ const SDArchiverLinkedList *filenames) {
fprintf(stderr, "Writing archive of file format 3\n");
// First create a "set" of absolute paths to given filenames.
ptr_array[1] = (void *)state->parsed->user_cwd;
if (simple_archiver_list_get(filenames, filenames_to_abs_map_fn, ptr_array)) {
free(ptr_array);
- return SDAS_FAILED_TO_CREATE_MAP;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CREATE_MAP);
}
free(ptr_array);
if (simple_archiver_list_get(filenames, symlinks_and_files_from_files,
ptr_array)) {
free(ptr_array);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptr_array);
// files_list->count,
// dirs_list->count,
// filenames->count);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (fwrite("SIMPLE_ARCHIVE_VER", 1, 18, out_f) != 18) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
char buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
const size_t prefix_length = state->parsed->prefix
: 0;
if (state->parsed->compressor && !state->parsed->decompressor) {
- return SDAS_NO_DECOMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_DECOMPRESSOR);
} else if (!state->parsed->compressor && state->parsed->decompressor) {
- return SDAS_NO_COMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_COMPRESSOR);
} else if (state->parsed->compressor && state->parsed->decompressor) {
// 4 bytes flags, using de/compressor.
memset(buf, 0, 4);
buf[0] |= 1;
if (fwrite(buf, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
size_t len = strlen(state->parsed->compressor);
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Compressor cmd is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->compressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
len = strlen(state->parsed->decompressor);
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Decompressor cmd is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->decompressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
// 4 bytes flags, not using de/compressor.
memset(buf, 0, 4);
if (fwrite(buf, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (symlinks_list->count > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: Too many symlinks!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
uint32_t u32 = (uint32_t)symlinks_list->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_32_bit_be(&u32);
if (state->parsed->user_cwd) {
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
int stat_status =
fstatat(AT_FDCWD, node->data, &stat_buf, AT_SYMLINK_NOFOLLOW);
if (stat_status != 0) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if ((stat_buf.st_mode & S_IRUSR) != 0) {
}
if (fwrite(buf, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
const size_t link_length = strlen(node->data);
}
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Link name is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (state->parsed->prefix) {
out_f);
fwrite_ret += fwrite(node->data, 1, link_length + 1, out_f);
if (fwrite_ret != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else if (fwrite(node->data, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
if (abs_path && (state->parsed->flags & 0x20) == 0 && !is_invalid) {
if (!abs_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to add prefix to abs symlink!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t abs_path_pref_length = strlen(abs_path_prefixed);
if (abs_path_pref_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination absolute path with prefix is "
"too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)abs_path_pref_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(abs_path_prefixed, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
const size_t abs_path_length = strlen(abs_path);
if (abs_path_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination absolute path is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)abs_path_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(abs_path, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (!rel_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to add prefix to relative symlink!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t rel_path_pref_length = strlen(rel_path_prefixed);
if (rel_path_pref_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination relative path with prefix is "
"too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)rel_path_pref_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(rel_path_prefixed, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
len = strlen(rel_path);
if (len >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination relative path is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(rel_path, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = stat_buf.st_gid;
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = stat_buf.st_uid;
}
unsigned long name_length = strlen(username);
if (name_length > 0xFFFF) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u16 = (uint16_t)name_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(username, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
unsigned long group_length = strlen(groupname);
if (group_length > 0xFFFF) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u16 = (uint16_t)group_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(groupname, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
"ERROR: Iterated through %" PRIu32 " symlinks out of %" PRIu64
" total!\n",
idx, symlinks_list->count);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
__attribute__((cleanup(simple_archiver_list_free)))
if (simple_archiver_list_get(files_list, files_to_chunk_count, ptrs)) {
free(ptrs);
fprintf(stderr, "ERROR: Internal error calculating chunk counts!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptrs);
if ((chunk_counts->count == 0 || current_size > 0) && current_count > 0) {
node != chunk_counts->tail; node = node->next) {
if (*((uint64_t *)node->data) > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: file count in chunk is too large!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
count += *((uint64_t *)node->data);
// fprintf(stderr, "DEBUG: chunk count %4llu\n",
// "count: %u, files_list_count: %u\n",
// count,
// files_list->count);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
// Write number of chunks.
if (chunk_counts->count > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: Too many chunks!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u32 = (uint32_t)chunk_counts->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
__attribute__((cleanup(simple_archiver_helper_cleanup_malloced))) void
for (SDArchiverLLNode *chunk_c_node = chunk_counts->head->next;
chunk_c_node != chunk_counts->tail; chunk_c_node = chunk_c_node->next) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
fprintf(stderr,
"CHUNK %3" PRIu64 " of %3" PRIu64 "\n",
u32 = (uint32_t)(*((uint64_t *)chunk_c_node->data));
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
SDArchiverLLNode *saved_node = file_node;
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
if (non_c_chunk_size) {
const size_t total_length = filename_len + prefix_length;
if (total_length >= 0xFFFF) {
fprintf(stderr, "ERROR: Filename with prefix is too large!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
u16 = (uint16_t)total_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->prefix, 1, prefix_length, out_f)
!= prefix_length) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
} else if (fwrite(file_info_struct->filename,
1,
filename_len + 1,
out_f)
!= filename_len + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
if (filename_len >= 0xFFFF) {
fprintf(stderr, "ERROR: Filename is too large!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
u16 = (uint16_t)filename_len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(file_info_struct->filename, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (fwrite(file_info_struct->bit_flags, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// UID and GID.
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = file_info_struct->gid;
if ((state->parsed->flags & 0x800) == 0) {
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = file_info_struct->uid;
}
unsigned long name_length = strlen(username);
if (name_length > 0xFFFF) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u16 = (uint16_t)name_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(username, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
unsigned long group_length = strlen(groupname);
if (group_length > 0xFFFF) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u16 = (uint16_t)group_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(groupname, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
uint64_t u64 = file_info_struct->file_size;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (!temp_fd) {
fprintf(stderr,
"ERROR: Failed to create a temporary file for archival!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
if (pipe(pipe_into_cmd) != 0) {
// Unable to create pipes.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (pipe(pipe_outof_cmd) != 0) {
// Unable to create second set of pipes.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_into_cmd[1], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on into-write-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_outof_cmd[0], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on outof-read-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
state->parsed->compressor,
&compressor_pid) != 0) {
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start compressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Close unnecessary pipe fds on this end of the transfer.
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
fprintf(stderr,
while (!to_comp_finished) {
if (is_sig_pipe_occurred) {
fprintf(stderr, "ERROR: SIGPIPE while compressing!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (!to_comp_finished) {
// Write to compressor.
if (ferror(fd)) {
fprintf(stderr, "ERROR: Writing to chunk, file read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (has_hold < 0) {
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, fd);
fprintf(
stderr,
"ERROR: Writing to compressor, pipe write error!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else if (write_ret == 0) {
fprintf(
stderr,
"ERROR: Writing to compressor, unable to write bytes!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
} else if ((size_t)write_ret < fread_ret) {
has_hold = (ssize_t)fread_ret - write_ret;
memcpy(hold_buf, buf + write_ret, (size_t)has_hold);
// Non-blocking write.
nanosleep(&nonblock_sleep, NULL);
} else {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (write_ret < has_hold) {
memcpy(buf, hold_buf + write_ret,
memcpy(hold_buf, buf, (size_t)(has_hold - write_ret));
has_hold = has_hold - write_ret;
} else if (write_ret != has_hold) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else {
has_hold = -1;
}
} else {
fprintf(stderr,
"ERROR: Reading from compressor, pipe read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"ERROR: Reading from compressor, failed to write to "
"temporary file!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
while (1) {
if (is_sig_pipe_occurred) {
fprintf(stderr, "ERROR: SIGPIPE while compressing!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
ssize_t read_ret =
read(pipe_outof_read, buf, SIMPLE_ARCHIVER_BUFFER_SIZE);
} else {
fprintf(stderr,
"ERROR: Reading from compressor, pipe read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"ERROR: Reading from compressor, failed to write to "
"temporary file!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
if (comp_chunk_size < 0) {
fprintf(stderr,
"ERROR: Temp file reported negative size after compression!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Write compressed chunk size.
uint64_t u64 = (uint64_t)comp_chunk_size;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
rewind(temp_fd);
// Write compressed chunk.
while (!feof(temp_fd)) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
} else if (ferror(temp_fd)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, temp_fd);
if (fread_ret > 0) {
fprintf(stderr,
"ERROR: Partial write of read bytes from temp file to "
"output file!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
if (written_size != (size_t)comp_chunk_size) {
fprintf(stderr,
"ERROR: Written chunk size is not actual chunk size!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// Cleanup and remove temp_fd.
} else {
// Is NOT compressing.
if (!non_c_chunk_size) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
simple_archiver_helper_64_bit_be(non_c_chunk_size);
fwrite(non_c_chunk_size, 8, 1, out_f);
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
fprintf(stderr,
while (!feof(fd)) {
if (ferror(fd)) {
fprintf(stderr, "ERROR: Writing to chunk, file read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, fd);
if (fread_ret > 0) {
size_t fwrite_ret = fwrite(buf, 1, fread_ret, out_f);
if (fwrite_ret != fread_ret) {
fprintf(stderr, "ERROR: Writing to chunk, file write error!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
// Write directory entries.
if (dirs_list->count > 0xFFFFFFFF) {
- return SDAS_TOO_MANY_DIRS;
+ return SDA_RET_STRUCT(SDAS_TOO_MANY_DIRS);
}
u32 = (uint32_t)dirs_list->count;
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
void **void_ptrs = malloc(sizeof(void*) * 2);
internal_write_dir_entries_v2_v3_v4,
void_ptrs)) {
free(void_ptrs);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(void_ptrs);
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_write_v4(FILE *out_f, SDArchiverState *state,
- const SDArchiverLinkedList *filenames) {
+SDArchiverStateRetStruct simple_archiver_write_v4(
+ FILE *out_f,
+ SDArchiverState *state,
+ const SDArchiverLinkedList *filenames) {
fprintf(stderr, "Writing archive of file format 4\n");
// First create a "set" of absolute paths to given filenames.
ptr_array[1] = (void *)state->parsed->user_cwd;
if (simple_archiver_list_get(filenames, filenames_to_abs_map_fn, ptr_array)) {
free(ptr_array);
- return SDAS_FAILED_TO_CREATE_MAP;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CREATE_MAP);
}
free(ptr_array);
if (simple_archiver_list_get(filenames, symlinks_and_files_from_files,
ptr_array)) {
free(ptr_array);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptr_array);
fprintf(stderr,
"ERROR: Count mismatch between files and symlinks and files from "
"parser!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (fwrite("SIMPLE_ARCHIVE_VER", 1, 18, out_f) != 18) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
char buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
const size_t prefix_length = state->parsed->prefix
: 0;
if (state->parsed->compressor && !state->parsed->decompressor) {
- return SDAS_NO_DECOMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_DECOMPRESSOR);
} else if (!state->parsed->compressor && state->parsed->decompressor) {
- return SDAS_NO_COMPRESSOR;
+ return SDA_RET_STRUCT(SDAS_NO_COMPRESSOR);
} else if (state->parsed->compressor && state->parsed->decompressor) {
// 4 bytes flags, using de/compressor.
memset(buf, 0, 4);
buf[0] |= 1;
if (fwrite(buf, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
size_t len = strlen(state->parsed->compressor);
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Compressor cmd is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->compressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
len = strlen(state->parsed->decompressor);
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Decompressor cmd is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->decompressor, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
// 4 bytes flags, not using de/compressor.
memset(buf, 0, 4);
if (fwrite(buf, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
uint64_t u64 = symlinks_list->count;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_64_bit_be(&u64);
if (state->parsed->user_cwd) {
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
int stat_status =
fstatat(AT_FDCWD, node->data, &stat_buf, AT_SYMLINK_NOFOLLOW);
if (stat_status != 0) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if ((stat_buf.st_mode & S_IRUSR) != 0) {
}
if (fwrite(buf, 1, 2, out_f) != 2) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
const size_t link_length = strlen(node->data);
}
if (len >= 0xFFFF) {
fprintf(stderr, "ERROR: Link name is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (state->parsed->prefix) {
out_f);
fwrite_ret += fwrite(node->data, 1, link_length + 1, out_f);
if (fwrite_ret != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else if (fwrite(node->data, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
if (abs_path && (state->parsed->flags & 0x20) == 0 && !is_invalid) {
if (!abs_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to add prefix to abs symlink!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t abs_path_pref_length = strlen(abs_path_prefixed);
if (abs_path_pref_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination absolute path with prefix is "
"too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)abs_path_pref_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(abs_path_prefixed, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
const size_t abs_path_length = strlen(abs_path);
if (abs_path_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination absolute path is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)abs_path_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(abs_path, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (!rel_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to add prefix to relative symlink!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t rel_path_pref_length = strlen(rel_path_prefixed);
if (rel_path_pref_length >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination relative path with prefix is "
"too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)rel_path_pref_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(rel_path_prefixed, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
len = strlen(rel_path);
if (len >= 0xFFFF) {
fprintf(stderr,
"ERROR: Symlink destination relative path is too long!\n");
- return SDAS_INVALID_PARSED_STATE;
+ return SDA_RET_STRUCT(SDAS_INVALID_PARSED_STATE);
}
u16 = (uint16_t)len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(rel_path, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = stat_buf.st_gid;
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = stat_buf.st_uid;
}
unsigned long name_length = strlen(username);
if (name_length > 0xFFFF) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u16 = (uint16_t)name_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(username, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
unsigned long group_length = strlen(groupname);
if (group_length > 0xFFFF) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u16 = (uint16_t)group_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(groupname, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
"ERROR: Iterated through %" PRIu64 " symlinks out of %" PRIu64
" total!\n",
idx, symlinks_list->count);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
__attribute__((cleanup(simple_archiver_list_free)))
if (simple_archiver_list_get(files_list, files_to_chunk_count, ptrs)) {
free(ptrs);
fprintf(stderr, "ERROR: Internal error calculating chunk counts!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(ptrs);
if ((chunk_counts->count == 0 || current_size > 0) && current_count > 0) {
node != chunk_counts->tail; node = node->next) {
if (*((uint64_t *)node->data) > 0xFFFFFFFF) {
fprintf(stderr, "ERROR: file count in chunk is too large!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
count += *((uint64_t *)node->data);
}
fprintf(stderr,
"ERROR: Internal error calculating chunk counts (invalid number "
"of files)!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
u64 = chunk_counts->count;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
__attribute__((cleanup(simple_archiver_helper_cleanup_malloced))) void
chunk_c_node != chunk_counts->tail;
chunk_c_node = chunk_c_node->next) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
fprintf(stderr,
"CHUNK %3" PRIu64 " of %3" PRIu64 "\n",
u64 = (*((uint64_t *)chunk_c_node->data));
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
SDArchiverLLNode *saved_node = file_node;
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
if (non_c_chunk_size) {
const size_t total_length = filename_len + prefix_length;
if (total_length >= 0xFFFF) {
fprintf(stderr, "ERROR: Filename with prefix is too large!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
u16 = (uint16_t)total_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(state->parsed->prefix, 1, prefix_length, out_f)
!= prefix_length) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
} else if (fwrite(file_info_struct->filename,
1,
filename_len + 1,
out_f)
!= filename_len + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
if (filename_len >= 0xFFFF) {
fprintf(stderr, "ERROR: Filename is too large!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
u16 = (uint16_t)filename_len;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(file_info_struct->filename, 1, u16 + 1, out_f) !=
(size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (fwrite(file_info_struct->bit_flags, 1, 4, out_f) != 4) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// UID and GID.
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = file_info_struct->gid;
if ((state->parsed->flags & 0x800) == 0) {
}
simple_archiver_helper_32_bit_be(&u32);
if (fwrite(&u32, 4, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
u32 = file_info_struct->uid;
}
unsigned long name_length = strlen(username);
if (name_length > 0xFFFF) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u16 = (uint16_t)name_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(username, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
unsigned long group_length = strlen(groupname);
if (group_length > 0xFFFF) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
u16 = (uint16_t)group_length;
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fwrite(groupname, 1, u16 + 1, out_f) != (size_t)u16 + 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else {
u16 = 0;
if (fwrite(&u16, 2, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
uint64_t u64 = file_info_struct->file_size;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
if (!temp_fd) {
fprintf(stderr,
"ERROR: Failed to create a temporary file for archival!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
if (pipe(pipe_into_cmd) != 0) {
// Unable to create pipes.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (pipe(pipe_outof_cmd) != 0) {
// Unable to create second set of pipes.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_into_cmd[1], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on into-write-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_outof_cmd[0], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on outof-read-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
state->parsed->compressor,
&compressor_pid) != 0) {
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start compressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Close unnecessary pipe fds on this end of the transfer.
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
fprintf(stderr,
while (!to_comp_finished) {
if (is_sig_pipe_occurred) {
fprintf(stderr, "ERROR: SIGPIPE while compressing!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (!to_comp_finished) {
// Write to compressor.
if (ferror(fd)) {
fprintf(stderr, "ERROR: Writing to chunk, file read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (has_hold < 0) {
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, fd);
fprintf(
stderr,
"ERROR: Writing to compressor, pipe write error!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
} else if (write_ret == 0) {
fprintf(
stderr,
"ERROR: Writing to compressor, unable to write bytes!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
} else if ((size_t)write_ret < fread_ret) {
has_hold = (ssize_t)fread_ret - write_ret;
memcpy(hold_buf, buf + write_ret, (size_t)has_hold);
// Non-blocking write.
nanosleep(&nonblock_sleep, NULL);
} else {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (write_ret < has_hold) {
memcpy(buf, hold_buf + write_ret,
memcpy(hold_buf, buf, (size_t)(has_hold - write_ret));
has_hold = has_hold - write_ret;
} else if (write_ret != has_hold) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else {
has_hold = -1;
}
} else {
fprintf(stderr,
"ERROR: Reading from compressor, pipe read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"ERROR: Reading from compressor, failed to write to "
"temporary file!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
while (1) {
if (is_sig_pipe_occurred) {
fprintf(stderr, "ERROR: SIGPIPE while compressing!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
ssize_t read_ret =
read(pipe_outof_read, buf, SIMPLE_ARCHIVER_BUFFER_SIZE);
} else {
fprintf(stderr,
"ERROR: Reading from compressor, pipe read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"ERROR: Reading from compressor, failed to write to "
"temporary file!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
if (comp_chunk_size < 0) {
fprintf(stderr,
"ERROR: Temp file reported negative size after compression!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Write compressed chunk size.
uint64_t u64 = (uint64_t)comp_chunk_size;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
rewind(temp_fd);
// Write compressed chunk.
while (!feof(temp_fd)) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
} else if (ferror(temp_fd)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, temp_fd);
if (fread_ret > 0) {
fprintf(stderr,
"ERROR: Partial write of read bytes from temp file to "
"output file!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
if (written_size != (size_t)comp_chunk_size) {
fprintf(stderr,
"ERROR: Written chunk size is not actual chunk size!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
// Cleanup and remove temp_fd.
} else {
// Is NOT compressing.
if (!non_c_chunk_size) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
simple_archiver_helper_64_bit_be(non_c_chunk_size);
fwrite(non_c_chunk_size, 8, 1, out_f);
for (uint64_t file_idx = 0; file_idx < *((uint64_t *)chunk_c_node->data);
++file_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
file_node = file_node->next;
if (file_node == files_list->tail) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const SDArchiverInternalFileInfo *file_info_struct = file_node->data;
fprintf(stderr,
while (!feof(fd)) {
if (ferror(fd)) {
fprintf(stderr, "ERROR: Writing to chunk, file read error!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
size_t fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, fd);
if (fread_ret > 0) {
size_t fwrite_ret = fwrite(buf, 1, fread_ret, out_f);
if (fwrite_ret != fread_ret) {
fprintf(stderr, "ERROR: Writing to chunk, file write error!\n");
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
}
}
// Write directory entries.
if (dirs_list->count > 0xFFFFFFFF) {
- return SDAS_TOO_MANY_DIRS;
+ return SDA_RET_STRUCT(SDAS_TOO_MANY_DIRS);
}
u64 = dirs_list->count;
simple_archiver_helper_64_bit_be(&u64);
if (fwrite(&u64, 8, 1, out_f) != 1) {
- return SDAS_FAILED_TO_WRITE;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_WRITE);
}
void **void_ptrs = malloc(sizeof(void*) * 2);
internal_write_dir_entries_v2_v3_v4,
void_ptrs)) {
free(void_ptrs);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
free(void_ptrs);
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_parse_archive_info(FILE *in_f, int_fast8_t do_extract,
- const SDArchiverState *state) {
+SDArchiverStateRetStruct simple_archiver_parse_archive_info(
+ FILE *in_f,
+ int_fast8_t do_extract,
+ const SDArchiverState *state) {
signal(SIGINT, handle_sig_int);
uint8_t buf[32];
uint16_t u16;
if (fread(buf, 1, 18, in_f) != 18) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
} else if (memcmp(buf, "SIMPLE_ARCHIVE_VER", 18) != 0) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
} else if (fread(buf, 1, 2, in_f) != 2) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
memcpy(&u16, buf, 2);
return simple_archiver_parse_archive_version_4(in_f, do_extract, state);
} else {
fprintf(stderr, "ERROR Unsupported archive version %" PRIu16 "!\n", u16);
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
}
-int simple_archiver_parse_archive_version_0(FILE *in_f, int_fast8_t do_extract,
- const SDArchiverState *state) {
+SDArchiverStateRetStruct simple_archiver_parse_archive_version_0(
+ FILE *in_f,
+ int_fast8_t do_extract,
+ const SDArchiverState *state) {
uint8_t buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
uint16_t u16;
uint32_t u32;
int_fast8_t is_compressed = 0;
if (fread(buf, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
if (do_extract && state->parsed->user_cwd) {
if (chdir(state->parsed->user_cwd)) {
- return SDAS_FAILED_TO_CHANGE_CWD;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CHANGE_CWD);
}
}
// Read compressor data.
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
fprintf(stderr, "Compressor size is %" PRIu16 "\n", u16);
if (u16 < SIMPLE_ARCHIVER_BUFFER_SIZE) {
if (fread(buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
buf[SIMPLE_ARCHIVER_BUFFER_SIZE - 1] = 0;
fprintf(stderr, "Compressor cmd: %s\n", buf);
malloc(u16 + 1);
uint8_t *uc_heap_buf = heap_buf;
if (fread(uc_heap_buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
uc_heap_buf[u16 - 1] = 0;
fprintf(stderr, "Compressor cmd: %s\n", uc_heap_buf);
// Read decompressor data.
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
fprintf(stderr, "Decompressor size is %" PRIu16 "\n", u16);
if (u16 < SIMPLE_ARCHIVER_BUFFER_SIZE) {
if (fread(buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
buf[SIMPLE_ARCHIVER_BUFFER_SIZE - 1] = 0;
fprintf(stderr, "Decompressor cmd: %s\n", buf);
malloc(u16 + 1);
uint8_t *uc_heap_buf = heap_buf;
if (fread(uc_heap_buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
uc_heap_buf[u16 - 1] = 0;
fprintf(stderr, "Decompressor cmd: %s\n", uc_heap_buf);
}
if (fread(&u32, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
fprintf(stderr, "File count is %" PRIu32 "\n", u32);
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
const uint32_t size = u32;
for (uint32_t idx = 0; idx < size; ++idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
skip = 0;
if (feof(in_f) || ferror(in_f)) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
} else if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
__attribute__((cleanup(
if (u16 < SIMPLE_ARCHIVER_BUFFER_SIZE) {
if (fread(buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
buf[SIMPLE_ARCHIVER_BUFFER_SIZE - 1] = 0;
lists_allowed = simple_archiver_helper_string_allowed_lists(
malloc((uint32_t)u16 + 1);
uint8_t *uc_heap_buf = heap_buf;
if (fread(uc_heap_buf, 1, (uint32_t)u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
uc_heap_buf[u16] = 0;
lists_allowed = simple_archiver_helper_string_allowed_lists(
}
if (fread(buf, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
// Check for "invalid entry" flag.
if ((buf[0] & 1) == 0) {
// Not a sybolic link.
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
if (lists_allowed) {
// Unable to create second set of pipes.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_into_cmd[1], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on into-write-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_outof_cmd[0], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on outof-read-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (state && state->parsed && state->parsed->decompressor) {
fprintf(
stderr,
"WARNING: Failed to start decompressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
fprintf(
stderr,
"WARNING: Failed to start decompressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
"WARNING: Exec failed (exec exit code %d)! Invalid "
"decompressor cmd?\n",
decompressor_return_val);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (decompressor_ret == 0) {
// Probably still running, continue on.
fprintf(stderr,
"WARNING: Exec failed (exec exit code unknown)! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
uint64_t compressed_file_size = u64;
close(pipe_outof_cmd[0]);
pipe_outof_cmd[0] = -1;
}
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
} else if (is_sig_pipe_occurred) {
fprintf(stderr,
"WARNING: Failed to write to decompressor (SIGPIPE)! "
"Invalid decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
// Read from file.
fprintf(stderr,
"WARNING: Failed to write to decompressor! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
// Should be unreachable, error.
fprintf(stderr,
"WARNING: Failed to write to decompressor! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
fprintf(stderr,
"WARNING: Failed to read from decompressor! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else {
// Invalid state, error.
fprintf(stderr,
"WARNING: Failed to read from decompressor! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == -1) {
if (errno == EAGAIN || errno == EWOULDBLOCK) {
fprintf(stderr,
"WARNING: Failed to read from decompressor! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (read_ret == 0) {
// EOF.
fprintf(stderr,
"WARNING: Failed to read from decompressor! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
fprintf(stderr,
"WARNING: Failed to write to decompressor (SIGPIPE)! "
"Invalid decompressor cmd?\n");
- return 1;
+ return SDA_RET_STRUCT(1);
}
waitpid(decompressor_pid, NULL, 0);
fread_ret = fread(buf, 1, SIMPLE_ARCHIVER_BUFFER_SIZE, in_f);
if (ferror(in_f)) {
// Error.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (out_f) {
fwrite(buf, 1, fread_ret, out_f);
if (ferror(out_f)) {
// Error.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
compressed_file_size -= fread_ret;
fread_ret = fread(buf, 1, compressed_file_size, in_f);
if (ferror(in_f)) {
// Error.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (out_f) {
fwrite(buf, 1, fread_ret, out_f);
if (ferror(out_f)) {
// Error.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
compressed_file_size -= fread_ret;
: (const char *)out_f_name,
permissions) == -1) {
// Error.
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
ptrs_array[0] = NULL;
if (read_ret > 0) {
u64 -= read_ret;
} else if (ferror(in_f)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
size_t read_ret = fread(buf, 1, u64, in_f);
if (read_ret > 0) {
u64 -= read_ret;
} else if (ferror(in_f)) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
}
simple_archiver_helper_cleanup_malloced))) void *rel_path = NULL;
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 == 0) {
}
} else if (u16 < SIMPLE_ARCHIVER_BUFFER_SIZE) {
if (fread(buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
buf[SIMPLE_ARCHIVER_BUFFER_SIZE - 1] = 0;
if (lists_allowed) {
} else {
abs_path = malloc(u16 + 1);
if (fread(abs_path, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
((char *)abs_path)[u16 - 1] = 0;
if (lists_allowed) {
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 == 0) {
}
} else if (u16 < SIMPLE_ARCHIVER_BUFFER_SIZE) {
if (fread(buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
buf[SIMPLE_ARCHIVER_BUFFER_SIZE - 1] = 0;
if (lists_allowed) {
} else {
rel_path = malloc(u16 + 1);
if (fread(rel_path, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
((char *)rel_path)[u16 - 1] = 0;
if (lists_allowed) {
if (filename_with_prefix && !abs_path_prefixed) {
fprintf(stderr, " ERROR: Prefix specified but unable to resolve"
" abs link with prefix!\n");
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
V0_SYMLINK_CREATE_RETRY_0:
ret = symlink(
goto V0_SYMLINK_CREATE_RETRY_0;
}
} else {
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
}
if (links_list) {
if (filename_with_prefix && !rel_path_prefixed) {
fprintf(stderr, " ERROR: Prefix specified but unable to resolve"
" relative link with prefix!\n");
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
V0_SYMLINK_CREATE_RETRY_1:
ret = symlink(
goto V0_SYMLINK_CREATE_RETRY_1;
}
} else {
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
}
if (links_list) {
if (filename_with_prefix && !abs_path_prefixed) {
fprintf(stderr, " ERROR: Prefix specified but unable to resolve"
" abs link with prefix!\n");
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
int ret = symlink(
abs_path_prefixed
? filename_with_prefix
: out_f_name);
if (ret == -1) {
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
if (links_list) {
simple_archiver_list_add(
if (filename_with_prefix && !rel_path_prefixed) {
fprintf(stderr, " ERROR: Prefix specified but unable to resolve"
" relative link with prefix!\n");
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
int ret = symlink(
rel_path_prefixed
? filename_with_prefix
: out_f_name);
if (ret == -1) {
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
if (links_list) {
simple_archiver_list_add(
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_parse_archive_version_1(FILE *in_f, int_fast8_t do_extract,
- const SDArchiverState *state) {
+SDArchiverStateRetStruct simple_archiver_parse_archive_version_1(
+ FILE *in_f,
+ int_fast8_t do_extract,
+ const SDArchiverState *state) {
uint8_t buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
uint16_t u16;
uint32_t u32;
}
if (fread(buf, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
if (do_extract && state->parsed->user_cwd) {
if (chdir(state->parsed->user_cwd)) {
- return SDAS_FAILED_TO_CHANGE_CWD;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CHANGE_CWD);
}
}
if (is_compressed) {
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
compressor_cmd = malloc(u16 + 1);
- int ret =
+ SDArchiverStateReturns ret =
read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, compressor_cmd);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
compressor_cmd[u16] = 0;
fprintf(stderr, "Compressor command: %s\n", compressor_cmd);
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
decompressor_cmd = malloc(u16 + 1);
ret = read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, decompressor_cmd);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
decompressor_cmd[u16] = 0;
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
const size_t prefix_length = state && state->parsed->prefix
// Link count.
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
for (uint32_t idx = 0; idx < u32; ++idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
if (fread(buf, 1, 2, in_f) != 2) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
const uint_fast8_t absolute_preferred = (buf[0] & 1) ? 1 : 0;
const uint_fast8_t is_invalid = (buf[1] & 4) ? 1 : 0;
uint_fast8_t skip_due_to_invalid = is_invalid ? 1 : 0;
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
cleanup(simple_archiver_helper_cleanup_c_string))) char *link_name =
malloc(link_name_length + 1);
- int ret = read_buf_full_from_fd(in_f,
+ SDArchiverStateReturns ret = read_buf_full_from_fd(in_f,
(char *)buf,
SIMPLE_ARCHIVER_BUFFER_SIZE,
link_name_length + 1,
link_name);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
link_name[link_name_length] = 0;
char *abs_path_prefixed = NULL;
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
path_length + 1,
path);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
path[path_length] = 0;
+ int iret;
if (do_extract
&& !skip_due_to_map
&& !skip_due_to_invalid
if (!abs_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to insert prefix to absolute path!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
simple_archiver_helper_make_dirs_perms(
(state->parsed->flags & 0x800) ? state->parsed->gid : getgid());
int_fast8_t link_create_retry = 0;
V1_SYMLINK_CREATE_RETRY_0:
- ret = symlink(
+ iret = symlink(
abs_path_prefixed ? abs_path_prefixed : path,
link_name_prefixed ? link_name_prefixed : link_name
);
- if (ret == -1) {
+ if (iret == -1) {
if (link_create_retry) {
fprintf(
stderr,
goto V1_SYMLINK_CREATE_RETRY_0;
}
}
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
- ret = fchmodat(AT_FDCWD,
+ iret = fchmodat(AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
permissions,
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
if (errno == EOPNOTSUPP) {
fprintf(stderr,
" NOTICE: Setting permissions of symlink is not supported "
char *rel_path_prefixed = NULL;
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
path_length + 1,
path);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
path[path_length] = 0;
+ int iret;
if (do_extract
&& !skip_due_to_map
&& !skip_due_to_invalid
if (!rel_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to insert prefix to relative path!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
simple_archiver_helper_make_dirs_perms(
(state->parsed->flags & 0x800) ? state->parsed->gid : getgid());
int_fast8_t link_create_retry = 0;
V1_SYMLINK_CREATE_RETRY_1:
- ret = symlink(
+ iret = symlink(
rel_path_prefixed ? rel_path_prefixed : path,
link_name_prefixed ? link_name_prefixed : link_name);
- if (ret == -1) {
+ if (iret == -1) {
if (link_create_retry) {
fprintf(
stderr,
goto V1_SYMLINK_CREATE_RETRY_1;
}
}
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
- ret = fchmodat(AT_FDCWD,
+ iret = fchmodat(AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
permissions,
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
if (errno == EOPNOTSUPP) {
fprintf(stderr,
" NOTICE: Setting permissions of symlink is not supported "
}
if (geteuid() == 0
&& (state->parsed->flags & 0x400 || state->parsed->flags & 0x800)) {
- ret = fchownat(
+ iret = fchownat(
AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
state->parsed->flags & 0x400 ? state->parsed->uid : getuid(),
state->parsed->flags & 0x800 ? state->parsed->gid : getgid(),
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
fprintf(stderr,
" WARNING: Failed to force set UID/GID of symlink \"%s\""
"(errno %d)!\n",
}
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
const uint32_t chunk_count = u32;
for (uint32_t chunk_idx = 0; chunk_idx < chunk_count; ++chunk_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
fprintf(stderr,
"CHUNK %3" PRIu32 " of %3" PRIu32 "\n",
chunk_count);
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
memset(file_info, 0, sizeof(SDArchiverInternalFileInfo));
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
file_info->filename = malloc(u16 + 1);
- int ret =
+ SDArchiverStateReturns ret =
read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, file_info->filename);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
file_info->filename[u16] = 0;
}
if (fread(file_info->bit_flags, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
if (do_extract
}
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
if (do_extract && state && (state->parsed->flags & 0x800)) {
}
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
file_info->file_size = u64;
}
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
// Unable to create second set of pipes.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_into_cmd[1], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on into-write-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_outof_cmd[0], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on outof-read-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (state && state->parsed && state->parsed->decompressor) {
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start decompressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start decompressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
"WARNING: Exec failed (exec exit code %d)! Invalid "
"decompressor cmd?\n",
decompressor_return_val);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (decompressor_ret == 0) {
// Probably still running, continue on.
fprintf(stderr,
"WARNING: Exec failed (exec exit code unknown)! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
char hold_buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
while (node->next != file_info_list->tail) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
node = node->next;
const SDArchiverInternalFileInfo *file_info = node->data;
fprintf(stderr,
" WARNING: File already exists and "
"\"--overwrite-extract\" is not specified, skipping!\n");
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf,
SIMPLE_ARCHIVER_BUFFER_SIZE, file_info->file_size,
&pipe_into_write, &chunk_remaining, in_f, hold_buf,
&has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
continue;
}
(state->parsed->flags & 0x800)
? state->parsed->gid
: file_info->gid);
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
filename_prefixed ? filename_prefixed : file_info->filename,
pipe_outof_read,
(char *)buf,
hold_buf,
&has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
permissions)
== -1) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (geteuid() == 0 &&
chown(filename_prefixed
? filename_prefixed
filename_prefixed
? filename_prefixed
: file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
" File size: %" PRIu64 "\n",
file_info->file_size);
}
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
file_info->file_size, &pipe_into_write, &chunk_remaining, in_f,
hold_buf, &has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
} else {
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
file_info->file_size, &pipe_into_write, &chunk_remaining, in_f,
hold_buf, &has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
}
}
} else {
while (node->next != file_info_list->tail) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
node = node->next;
const SDArchiverInternalFileInfo *file_info = node->data;
chunk_idx += file_info->file_size;
if (chunk_idx > chunk_size) {
fprintf(stderr, "ERROR Files in chunk is larger than chunk!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t filename_length = strlen(file_info->filename);
fprintf(stderr,
" WARNING: File already exists and "
"\"--overwrite-extract\" is not specified, skipping!\n");
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret = read_buf_full_from_fd(
+ in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
continue;
}
? filename_prefixed
: file_info->filename,
"wb");
- int ret = read_fd_to_out_fd(in_f, out_fd, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size);
+ SDArchiverStateReturns ret =
+ read_fd_to_out_fd(in_f,
+ out_fd,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
simple_archiver_helper_cleanup_FILE(&out_fd);
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
filename_prefixed
? filename_prefixed
: file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (geteuid() == 0 &&
chown(filename_prefixed
? filename_prefixed
fprintf(stderr,
" ERROR Failed to set UID/GID of file \"%s\"!\n",
file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
" File size: %" PRIu64 "\n",
file_info->file_size);
}
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret = read_buf_full_from_fd(
+ in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
} else {
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret = read_buf_full_from_fd(
+ in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
}
}
simple_archiver_safe_links_enforce(links_list, files_map);
}
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_parse_archive_version_2(FILE *in_f, int_fast8_t do_extract,
- const SDArchiverState *state) {
- int ret = simple_archiver_parse_archive_version_1(in_f, do_extract, state);
- if (ret != SDAS_SUCCESS) {
- return ret;
+SDArchiverStateRetStruct simple_archiver_parse_archive_version_2(
+ FILE *in_f,
+ int_fast8_t do_extract,
+ const SDArchiverState *state) {
+ {
+ SDArchiverStateRetStruct ret =
+ simple_archiver_parse_archive_version_1(in_f, do_extract, state);
+ if (ret.ret != SDAS_SUCCESS) {
+ return ret;
+ }
}
uint32_t u32;
if (fread(&u32, 4, 1, in_f) != 1) {
fprintf(stderr, "ERROR: Failed to read directory count!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
simple_archiver_helper_32_bit_be(&u32);
for (uint32_t idx = 0; idx < size; ++idx) {
if (fread(&u16, 2, 1, in_f) != 1) {
fprintf(stderr, "ERROR: Failed to read directory name length!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
simple_archiver_helper_16_bit_be(&u16);
if (fread(buf, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
fprintf(stderr, "ERROR: Failed to read directory name!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
buf[u16] = 0;
fprintf(stderr,
"ERROR: Failed to read permission flags for \"%s\"!\n",
buf);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
perms_flags[2] = 0;
perms_flags[3] = 0;
if (fread(&uid, 4, 1, in_f) != 1) {
fprintf(stderr,
"ERROR: Failed to read UID for \"%s\"!\n", buf);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
simple_archiver_helper_32_bit_be(&uid);
if (fread(&gid, 4, 1, in_f) != 1) {
fprintf(stderr,
"ERROR: Failed to read GID for \"%s\"!\n", buf);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
simple_archiver_helper_32_bit_be(&gid);
fprintf(
stderr,
"ERROR: Failed to get abs_path_dir of current working directory!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
__attribute__((cleanup(simple_archiver_helper_string_parts_free)))
state && (state->parsed->flags & 0x800) ? state->parsed->gid : gid);
if (ret != 0) {
fprintf(stderr, "ERROR: Failed to make dirs (%d)!\n", ret);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
mode_t perms = simple_archiver_internal_bits_to_mode_t(perms_flags);
ret = chmod(abs_dir_path,
}
}
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_parse_archive_version_3(FILE *in_f,
- int_fast8_t do_extract,
- const SDArchiverState *state) {
+SDArchiverStateRetStruct simple_archiver_parse_archive_version_3(
+ FILE *in_f,
+ int_fast8_t do_extract,
+ const SDArchiverState *state) {
uint8_t buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
uint16_t u16;
uint32_t u32;
}
if (fread(buf, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
if (do_extract && state->parsed->user_cwd) {
if (chdir(state->parsed->user_cwd)) {
- return SDAS_FAILED_TO_CHANGE_CWD;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CHANGE_CWD);
}
}
if (is_compressed) {
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
compressor_cmd = malloc(u16 + 1);
- int ret =
+ SDArchiverStateReturns ret =
read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, compressor_cmd);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
compressor_cmd[u16] = 0;
fprintf(stderr, "Compressor command: %s\n", compressor_cmd);
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
decompressor_cmd = malloc(u16 + 1);
ret = read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, decompressor_cmd);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
decompressor_cmd[u16] = 0;
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
const size_t prefix_length = state && state->parsed->prefix
// Link count.
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
const uint32_t count = u32;
for (uint32_t idx = 0; idx < count; ++idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
if (fread(buf, 1, 2, in_f) != 2) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
const uint_fast8_t absolute_preferred = (buf[0] & 1) ? 1 : 0;
const uint_fast8_t is_invalid = (buf[1] & 4) ? 1 : 0;
uint_fast8_t skip_due_to_invalid = is_invalid ? 1 : 0;
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
__attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
char *link_name = malloc(link_name_length + 1);
- int ret = read_buf_full_from_fd(in_f,
- (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- link_name_length + 1,
- link_name);
+ SDArchiverStateReturns ret = read_buf_full_from_fd(
+ in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ link_name_length + 1,
+ link_name);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
link_name[link_name_length] = 0;
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
path_length + 1,
parsed_abs_path);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
parsed_abs_path[path_length] = 0;
if (!do_extract && lists_allowed) {
if (!abs_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to insert prefix to absolute path!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
} else if (!do_extract && lists_allowed) {
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
path_length + 1,
parsed_rel_path);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
parsed_rel_path[path_length] = 0;
if (!do_extract && lists_allowed) {
if (!rel_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to insert prefix to relative path!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
} else if (!do_extract && lists_allowed) {
if (fread(&u32, 4, 1, in_f) != 1) {
fprintf(stderr, " ERROR: Failed to read UID for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
if (fread(&u32, 4, 1, in_f) != 1) {
fprintf(stderr, " ERROR: Failed to read GID for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
if (fread(&u16, 2, 1, in_f) != 1) {
fprintf(stderr, " ERROR: Failed to read Username length for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(username, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
fprintf(stderr, " ERROR: Failed to read Username for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
username[u16] = 0;
if (lists_allowed) {
if (fread(&u16, 2, 1, in_f) != 1) {
fprintf(stderr,
" ERROR: Failed to read Groupname length for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(groupname, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
fprintf(stderr, " ERROR: Failed to read Groupname for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
groupname[u16] = 0;
if (lists_allowed) {
(state->parsed->flags & 0x400) ? state->parsed->uid : current_uid,
(state->parsed->flags & 0x800) ? state->parsed->gid : current_gid);
int_fast8_t link_create_retry = 0;
+ int iret;
V3_SYMLINK_CREATE_RETRY_0:
- ret = symlink(
+ iret = symlink(
abs_path_prefixed ? abs_path_prefixed : parsed_abs_path,
link_name_prefixed ? link_name_prefixed : link_name);
- if (ret == -1) {
+ if (iret == -1) {
if (link_create_retry) {
fprintf(
stderr,
goto V3_SYMLINK_CREATE_RETRY_0;
}
}
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
- ret = fchmodat(AT_FDCWD,
+ iret = fchmodat(AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
permissions,
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
if (errno == EOPNOTSUPP) {
fprintf(stderr,
" NOTICE: Setting permissions of symlink is not supported "
(state->parsed->flags & 0x400) ? state->parsed->uid : current_uid,
(state->parsed->flags & 0x800) ? state->parsed->gid : current_gid);
int_fast8_t link_create_retry = 0;
+ int iret;
V3_SYMLINK_CREATE_RETRY_1:
- ret = symlink(
+ iret = symlink(
rel_path_prefixed ? rel_path_prefixed : parsed_rel_path,
link_name_prefixed ? link_name_prefixed : link_name);
- if (ret == -1) {
+ if (iret == -1) {
if (link_create_retry) {
fprintf(
stderr,
goto V3_SYMLINK_CREATE_RETRY_1;
}
}
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
- ret = fchmodat(AT_FDCWD,
+ iret = fchmodat(AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
permissions,
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
if (errno == EOPNOTSUPP) {
fprintf(stderr,
" NOTICE: Setting permissions of symlink is not supported "
fprintf(stderr,
"ERROR: Failed to pick uid for link \"%s\"!\n",
link_name);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
if (user_remapped_uid) {
fprintf(stderr,
"ERROR: Failed to pick uid for link \"%s\"!\n",
link_name);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
} else {
fprintf(stderr,
"ERROR: Failed to pick gid for link \"%s\"!\n",
link_name);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
if (group_remapped_gid) {
fprintf(stderr,
"ERROR: Failed to pick gid for link \"%s\"!\n",
link_name);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
} else {
picked_gid = gid;
}
}
- ret = fchownat(
+ int iret = fchownat(
AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
state->parsed->flags & 0x400 ? state->parsed->uid : picked_uid,
state->parsed->flags & 0x800 ? state->parsed->gid : picked_gid,
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
fprintf(stderr,
" WARNING: Failed to force set UID/GID of symlink \"%s\""
"(errno %d)!\n",
}
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
const uint32_t chunk_count = u32;
for (uint32_t chunk_idx = 0; chunk_idx < chunk_count; ++chunk_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
fprintf(stderr,
"CHUNK %3" PRIu32 " of %3" PRIu32 "\n",
chunk_count);
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
memset(file_info, 0, sizeof(SDArchiverInternalFileInfo));
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
file_info->filename = malloc(u16 + 1);
- int ret =
+ SDArchiverStateReturns ret =
read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, file_info->filename);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
file_info->filename[u16] = 0;
}
if (fread(file_info->bit_flags, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
__attribute__((cleanup(simple_archiver_helper_cleanup_uint32)))
}
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
__attribute__((cleanup(simple_archiver_helper_cleanup_uint32)))
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(username, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
username[u16] = 0;
file_info->username = strdup(username);
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(groupname, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
groupname[u16] = 0;
file_info->groupname = strdup(groupname);
}
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
file_info->file_size = u64;
}
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
// Unable to create second set of pipes.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_into_cmd[1], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on into-write-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_outof_cmd[0], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on outof-read-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (state && state->parsed && state->parsed->decompressor) {
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start decompressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start decompressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
"WARNING: Exec failed (exec exit code %d)! Invalid "
"decompressor cmd?\n",
decompressor_return_val);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (decompressor_ret == 0) {
// Probably still running, continue on.
fprintf(stderr,
"WARNING: Exec failed (exec exit code unknown)! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
char hold_buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
while (node->next != file_info_list->tail) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
node = node->next;
const SDArchiverInternalFileInfo *file_info = node->data;
fprintf(stderr,
" WARNING: File already exists and "
"\"--overwrite-extract\" is not specified, skipping!\n");
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf,
SIMPLE_ARCHIVER_BUFFER_SIZE, file_info->file_size,
&pipe_into_write, &chunk_remaining, in_f, hold_buf,
&has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
continue;
}
(state->parsed->flags & 0x800)
? state->parsed->gid
: file_info->gid);
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
filename_prefixed ? filename_prefixed : file_info->filename,
pipe_outof_read,
(char *)buf,
hold_buf,
&has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
permissions)
== -1) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (geteuid() == 0 &&
chown(filename_prefixed
? filename_prefixed
filename_prefixed
? filename_prefixed
: file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
" File size: %" PRIu64 "\n",
file_info->file_size);
}
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
file_info->file_size, &pipe_into_write, &chunk_remaining, in_f,
hold_buf, &has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
} else {
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
file_info->file_size, &pipe_into_write, &chunk_remaining, in_f,
hold_buf, &has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
}
}
} else {
while (node->next != file_info_list->tail) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
node = node->next;
const SDArchiverInternalFileInfo *file_info = node->data;
chunk_idx += file_info->file_size;
if (chunk_idx > chunk_size) {
fprintf(stderr, "ERROR Files in chunk is larger than chunk!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t filename_length = strlen(file_info->filename);
fprintf(stderr,
" WARNING: File already exists and "
"\"--overwrite-extract\" is not specified, skipping!\n");
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret =
+ read_buf_full_from_fd(in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
continue;
}
? filename_prefixed
: file_info->filename,
"wb");
- int ret = read_fd_to_out_fd(in_f, out_fd, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size);
+ SDArchiverStateReturns ret =
+ read_fd_to_out_fd(in_f,
+ out_fd,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
simple_archiver_helper_cleanup_FILE(&out_fd);
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
stderr,
"ERROR Failed to set permissions of file \"%s\"!\n",
filename_prefixed ? filename_prefixed : file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (geteuid() == 0 &&
chown(filename_prefixed
? filename_prefixed
stderr,
" ERROR Failed to set UID/GID of file \"%s\"!\n",
filename_prefixed ? filename_prefixed : file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
" File size: %" PRIu64 "\n",
file_info->file_size);
}
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret =
+ read_buf_full_from_fd(in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
} else {
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret =
+ read_buf_full_from_fd(in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
}
}
if (fread(&u32, 4, 1, in_f) != 1) {
fprintf(stderr, "ERROR: Failed to read directory count!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
for (uint32_t idx = 0; idx < size; ++idx) {
if (fread(&u16, 2, 1, in_f) != 1) {
fprintf(stderr, "ERROR: Failed to read directory name length!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fread(archive_dir_name, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
fprintf(stderr, "ERROR: Failed to read directory name!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
archive_dir_name[u16] = 0;
fprintf(stderr,
"ERROR: Failed to read permission flags for \"%s\"!\n",
archive_dir_name);
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
perms_flags[2] = 0;
perms_flags[3] = 0;
if (fread(&uid, 4, 1, in_f) != 1) {
fprintf(stderr,
"ERROR: Failed to read UID for \"%s\"!\n", archive_dir_name);
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&uid);
if (fread(&gid, 4, 1, in_f) != 1) {
fprintf(stderr,
"ERROR: Failed to read GID for \"%s\"!\n", archive_dir_name);
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&gid);
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(username, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
username[u16] = 0;
} else {
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(groupname, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
groupname[u16] = 0;
} else {
fprintf(
stderr,
"ERROR: Failed to get abs_path_dir of current working directory!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
__attribute__((cleanup(simple_archiver_helper_string_parts_free)))
state && (state->parsed->flags & 0x800) ? state->parsed->gid : gid);
if (ret != 0) {
fprintf(stderr, "ERROR: Failed to make dirs (%d)!\n", ret);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
mode_t perms = simple_archiver_internal_bits_to_mode_t(perms_flags);
ret = chmod(abs_dir_path,
}
}
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
-int simple_archiver_parse_archive_version_4(FILE *in_f,
- int_fast8_t do_extract,
- const SDArchiverState *state) {
+SDArchiverStateRetStruct simple_archiver_parse_archive_version_4(
+ FILE *in_f,
+ int_fast8_t do_extract,
+ const SDArchiverState *state) {
uint8_t buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
uint16_t u16;
uint32_t u32;
}
if (fread(buf, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
if (do_extract && state->parsed->user_cwd) {
if (chdir(state->parsed->user_cwd)) {
- return SDAS_FAILED_TO_CHANGE_CWD;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_CHANGE_CWD);
}
}
if (is_compressed) {
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
compressor_cmd = malloc(u16 + 1);
- int ret =
+ SDArchiverStateReturns ret =
read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, compressor_cmd);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
compressor_cmd[u16] = 0;
fprintf(stderr, "Compressor command: %s\n", compressor_cmd);
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
decompressor_cmd = malloc(u16 + 1);
ret = read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, decompressor_cmd);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
decompressor_cmd[u16] = 0;
}
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
const size_t prefix_length = state && state->parsed->prefix
// Link count.
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
const uint64_t count = u64;
for (uint64_t idx = 0; idx < count; ++idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
if (fread(buf, 1, 2, in_f) != 2) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
const uint_fast8_t absolute_preferred = (buf[0] & 1) ? 1 : 0;
const uint_fast8_t is_invalid = (buf[1] & 4) ? 1 : 0;
uint_fast8_t skip_due_to_invalid = is_invalid ? 1 : 0;
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
__attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
char *link_name = malloc(link_name_length + 1);
- int ret = read_buf_full_from_fd(in_f,
- (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- link_name_length + 1,
- link_name);
+ SDArchiverStateReturns ret =
+ read_buf_full_from_fd(in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ link_name_length + 1,
+ link_name);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
link_name[link_name_length] = 0;
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
path_length + 1,
parsed_abs_path);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
parsed_abs_path[path_length] = 0;
if (!do_extract && lists_allowed) {
if (!abs_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to insert prefix to absolute path!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
} else if (!do_extract && lists_allowed) {
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
path_length + 1,
parsed_rel_path);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
parsed_rel_path[path_length] = 0;
if (!do_extract && lists_allowed) {
if (!rel_path_prefixed) {
fprintf(stderr,
"ERROR: Failed to insert prefix to relative path!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
} else if (!do_extract && lists_allowed) {
if (fread(&u32, 4, 1, in_f) != 1) {
fprintf(stderr, " ERROR: Failed to read UID for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
if (fread(&u32, 4, 1, in_f) != 1) {
fprintf(stderr, " ERROR: Failed to read GID for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
if (fread(&u16, 2, 1, in_f) != 1) {
fprintf(stderr, " ERROR: Failed to read Username length for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(username, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
fprintf(stderr, " ERROR: Failed to read Username for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
username[u16] = 0;
if (lists_allowed) {
if (fread(&u16, 2, 1, in_f) != 1) {
fprintf(stderr,
" ERROR: Failed to read Groupname length for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(groupname, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
fprintf(stderr, " ERROR: Failed to read Groupname for symlink!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
groupname[u16] = 0;
if (lists_allowed) {
(state->parsed->flags & 0x400) ? state->parsed->uid : current_uid,
(state->parsed->flags & 0x800) ? state->parsed->gid : current_gid);
int_fast8_t link_create_retry = 0;
+ int iret;
V4_SYMLINK_CREATE_RETRY_0:
- ret = symlink(
+ iret = symlink(
abs_path_prefixed ? abs_path_prefixed : parsed_abs_path,
link_name_prefixed ? link_name_prefixed : link_name);
- if (ret == -1) {
+ if (iret == -1) {
if (link_create_retry) {
fprintf(
stderr,
goto V4_SYMLINK_CREATE_RETRY_0;
}
}
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
- ret = fchmodat(AT_FDCWD,
+ iret = fchmodat(AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
permissions,
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
if (errno == EOPNOTSUPP) {
fprintf(stderr,
" NOTICE: Setting permissions of symlink is not supported "
(state->parsed->flags & 0x400) ? state->parsed->uid : current_uid,
(state->parsed->flags & 0x800) ? state->parsed->gid : current_gid);
int_fast8_t link_create_retry = 0;
+ int iret;
V4_SYMLINK_CREATE_RETRY_1:
- ret = symlink(
+ iret = symlink(
rel_path_prefixed ? rel_path_prefixed : parsed_rel_path,
link_name_prefixed ? link_name_prefixed : link_name);
- if (ret == -1) {
+ if (iret == -1) {
if (link_create_retry) {
fprintf(
stderr,
goto V4_SYMLINK_CREATE_RETRY_1;
}
}
- return SDAS_FAILED_TO_EXTRACT_SYMLINK;
+ return SDA_RET_STRUCT(SDAS_FAILED_TO_EXTRACT_SYMLINK);
}
- ret = fchmodat(AT_FDCWD,
+ iret = fchmodat(AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
permissions,
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
if (errno == EOPNOTSUPP) {
fprintf(stderr,
" NOTICE: Setting permissions of symlink is not supported "
fprintf(stderr,
"ERROR: Failed to pick uid for link \"%s\"!\n",
link_name);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
if (user_remapped_uid) {
fprintf(stderr,
"ERROR: Failed to pick uid for link \"%s\"!\n",
link_name);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
} else {
fprintf(stderr,
"ERROR: Failed to pick gid for link \"%s\"!\n",
link_name);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
if (group_remapped_gid) {
fprintf(stderr,
"ERROR: Failed to pick gid for link \"%s\"!\n",
link_name);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
} else {
picked_gid = gid;
}
}
- ret = fchownat(
+ int iret = fchownat(
AT_FDCWD,
link_name_prefixed ? link_name_prefixed : link_name,
state->parsed->flags & 0x400 ? state->parsed->uid : picked_uid,
state->parsed->flags & 0x800 ? state->parsed->gid : picked_gid,
AT_SYMLINK_NOFOLLOW);
- if (ret == -1) {
+ if (iret == -1) {
fprintf(stderr,
" WARNING: Failed to force set UID/GID of symlink \"%s\""
"(errno %d)!\n",
}
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
const uint64_t chunk_count = u64;
for (uint64_t chunk_idx = 0; chunk_idx < chunk_count; ++chunk_idx) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
fprintf(stderr,
"CHUNK %3" PRIu64 " of %3" PRIu64 "\n",
chunk_count);
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
memset(file_info, 0, sizeof(SDArchiverInternalFileInfo));
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
file_info->filename = malloc(u16 + 1);
- int ret =
+ SDArchiverStateReturns ret =
read_buf_full_from_fd(in_f, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
u16 + 1, file_info->filename);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
file_info->filename[u16] = 0;
}
if (fread(file_info->bit_flags, 1, 4, in_f) != 4) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
__attribute__((cleanup(simple_archiver_helper_cleanup_uint32)))
}
if (fread(&u32, 4, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&u32);
__attribute__((cleanup(simple_archiver_helper_cleanup_uint32)))
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(username, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
username[u16] = 0;
file_info->username = strdup(username);
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(groupname, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
groupname[u16] = 0;
file_info->groupname = strdup(groupname);
}
if (fread(&u64, 8, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
file_info->file_size = u64;
}
if (fread(&u64, 1, 8, in_f) != 8) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
// Unable to create second set of pipes.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_into_cmd[1], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on into-write-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (fcntl(pipe_outof_cmd[0], F_SETFL, O_NONBLOCK) != 0) {
// Unable to set non-blocking on outof-read-pipe.
close(pipe_into_cmd[0]);
close(pipe_into_cmd[1]);
close(pipe_outof_cmd[0]);
close(pipe_outof_cmd[1]);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
if (state && state->parsed && state->parsed->decompressor) {
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start decompressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else {
if (simple_archiver_de_compress(pipe_into_cmd, pipe_outof_cmd,
close(pipe_outof_cmd[0]);
fprintf(stderr,
"WARNING: Failed to start decompressor cmd! Invalid cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
}
"WARNING: Exec failed (exec exit code %d)! Invalid "
"decompressor cmd?\n",
decompressor_return_val);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (decompressor_ret == 0) {
// Probably still running, continue on.
fprintf(stderr,
"WARNING: Exec failed (exec exit code unknown)! Invalid "
"decompressor cmd?\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
char hold_buf[SIMPLE_ARCHIVER_BUFFER_SIZE];
while (node->next != file_info_list->tail) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
node = node->next;
const SDArchiverInternalFileInfo *file_info = node->data;
fprintf(stderr,
" WARNING: File already exists and "
"\"--overwrite-extract\" is not specified, skipping!\n");
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf,
SIMPLE_ARCHIVER_BUFFER_SIZE, file_info->file_size,
&pipe_into_write, &chunk_remaining, in_f, hold_buf,
&has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
continue;
}
(state->parsed->flags & 0x800)
? state->parsed->gid
: file_info->gid);
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
filename_prefixed ? filename_prefixed : file_info->filename,
pipe_outof_read,
(char *)buf,
hold_buf,
&has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
permissions)
== -1) {
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (geteuid() == 0 &&
chown(filename_prefixed
? filename_prefixed
filename_prefixed
? filename_prefixed
: file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
" File size: %" PRIu64 "\n",
file_info->file_size);
}
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
file_info->file_size, &pipe_into_write, &chunk_remaining, in_f,
hold_buf, &has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
} else {
- int ret = read_decomp_to_out_file(
+ SDArchiverStateReturns ret = read_decomp_to_out_file(
NULL, pipe_outof_read, (char *)buf, SIMPLE_ARCHIVER_BUFFER_SIZE,
file_info->file_size, &pipe_into_write, &chunk_remaining, in_f,
hold_buf, &has_hold);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
}
}
} else {
while (node->next != file_info_list->tail) {
if (is_sig_int_occurred) {
- return SDAS_SIGINT;
+ return SDA_RET_STRUCT(SDAS_SIGINT);
}
node = node->next;
const SDArchiverInternalFileInfo *file_info = node->data;
chunk_idx += file_info->file_size;
if (chunk_idx > chunk_size) {
fprintf(stderr, "ERROR Files in chunk is larger than chunk!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
const size_t filename_length = strlen(file_info->filename);
fprintf(stderr,
" WARNING: File already exists and "
"\"--overwrite-extract\" is not specified, skipping!\n");
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret =
+ read_buf_full_from_fd(in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
continue;
}
? filename_prefixed
: file_info->filename,
"wb");
- int ret = read_fd_to_out_fd(in_f, out_fd, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size);
+ SDArchiverStateReturns ret =
+ read_fd_to_out_fd(in_f,
+ out_fd,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
simple_archiver_helper_cleanup_FILE(&out_fd);
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
stderr,
"ERROR Failed to set permissions of file \"%s\"!\n",
filename_prefixed ? filename_prefixed : file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
} else if (geteuid() == 0 &&
chown(filename_prefixed
? filename_prefixed
stderr,
" ERROR Failed to set UID/GID of file \"%s\"!\n",
filename_prefixed ? filename_prefixed : file_info->filename);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
" File size: %" PRIu64 "\n",
file_info->file_size);
}
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret =
+ read_buf_full_from_fd(in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
} else {
- int ret = read_buf_full_from_fd(in_f, (char *)buf,
- SIMPLE_ARCHIVER_BUFFER_SIZE,
- file_info->file_size, NULL);
+ SDArchiverStateReturns ret =
+ read_buf_full_from_fd(in_f,
+ (char *)buf,
+ SIMPLE_ARCHIVER_BUFFER_SIZE,
+ file_info->file_size,
+ NULL);
if (ret != SDAS_SUCCESS) {
- return ret;
+ return SDA_RET_STRUCT(ret);
}
}
}
if (fread(&u64, 8, 1, in_f) != 1) {
fprintf(stderr, "ERROR: Failed to read directory count!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_64_bit_be(&u64);
for (uint64_t idx = 0; idx < size; ++idx) {
if (fread(&u16, 2, 1, in_f) != 1) {
fprintf(stderr, "ERROR: Failed to read directory name length!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (fread(archive_dir_name, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
fprintf(stderr, "ERROR: Failed to read directory name!\n");
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
archive_dir_name[u16] = 0;
fprintf(stderr,
"ERROR: Failed to read permission flags for \"%s\"!\n",
archive_dir_name);
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
perms_flags[2] = 0;
perms_flags[3] = 0;
if (fread(&uid, 4, 1, in_f) != 1) {
fprintf(stderr,
"ERROR: Failed to read UID for \"%s\"!\n", archive_dir_name);
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&uid);
if (fread(&gid, 4, 1, in_f) != 1) {
fprintf(stderr,
"ERROR: Failed to read GID for \"%s\"!\n", archive_dir_name);
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_32_bit_be(&gid);
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(username, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
username[u16] = 0;
} else {
}
if (fread(&u16, 2, 1, in_f) != 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
simple_archiver_helper_16_bit_be(&u16);
if (u16 != 0) {
if (fread(groupname, 1, u16 + 1, in_f) != (size_t)u16 + 1) {
- return SDAS_INVALID_FILE;
+ return SDA_RET_STRUCT(SDAS_INVALID_FILE);
}
groupname[u16] = 0;
} else {
fprintf(
stderr,
"ERROR: Failed to get abs_path_dir of current working directory!\n");
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
__attribute__((cleanup(simple_archiver_helper_string_parts_free)))
state && (state->parsed->flags & 0x800) ? state->parsed->gid : gid);
if (ret != 0) {
fprintf(stderr, "ERROR: Failed to make dirs (%d)!\n", ret);
- return SDAS_INTERNAL_ERROR;
+ return SDA_RET_STRUCT(SDAS_INTERNAL_ERROR);
}
mode_t perms = simple_archiver_internal_bits_to_mode_t(perms_flags);
ret = chmod(abs_dir_path,
}
}
- return SDAS_SUCCESS;
+ return SDA_RET_STRUCT(SDAS_SUCCESS);
}
int simple_archiver_de_compress(int pipe_fd_in[2], int pipe_fd_out[2],