#include "archiver.h"
+// Standard library includes.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
-#include "platforms.h"
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
+// Unix includes.
#include <errno.h>
#include <fcntl.h>
#include <libgen.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
-#endif
+// Local includes.
#include "data_structures/priority_heap.h"
#include "helpers.h"
#include "users.h"
#define SIMPLE_ARCHIVER_BUFFER_SIZE (1024 * 32)
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
volatile int is_sig_pipe_occurred = 0;
volatile int is_sig_int_occurred = 0;
}
const struct timespec nonblock_sleep = {.tv_sec = 0, .tv_nsec = 1000000};
-#endif
typedef struct SDArchiverInternalToWrite {
void *buf;
}
void cleanup_temp_filename_delete(void ***ptrs_array) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (ptrs_array && *ptrs_array) {
if ((*ptrs_array)[1]) {
simple_archiver_helper_cleanup_FILE((FILE **)(*ptrs_array)[1]);
free(*ptrs_array);
*ptrs_array = NULL;
}
-#endif
}
void cleanup_overwrite_filename_delete_simple(char **filename) {
if (filename && *filename) {
if ((*filename)[0] != 0) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
unlink(*filename);
-#endif
}
free(*filename);
*filename = NULL;
if (state->parsed->compressor && state->parsed->decompressor) {
// De/compressor specified.
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
FILE *file_fd = fopen(file_info->filename, "rb");
if (!file_fd) {
break;
}
} while (1);
-#endif
} else {
uint16_t u16;
uint64_t u64;
((uint8_t *)temp_to_write->buf)[idx] = 0;
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
// Get file stats.
struct stat stat_buf;
memset(&stat_buf, 0, sizeof(struct stat));
if ((stat_buf.st_mode & S_IXOTH) != 0) {
((uint8_t *)temp_to_write->buf)[1] |= 0x2;
}
-#else
- // Unsupported platform. Just set the permission bits for user.
- ((uint8_t *)temp_to_write->buf)[0] |= 0xE;
-#endif
if (state->parsed->flags & 0x1000) {
((uint8_t *)temp_to_write->buf)[0] =
// Set "is symbolic link" flag.
((uint8_t *)temp_to_write->buf)[0] = 1;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
// Get file stats.
struct stat stat_buf;
memset(&stat_buf, 0, sizeof(struct stat));
if ((stat_buf.st_mode & S_IXOTH) != 0) {
((uint8_t *)temp_to_write->buf)[1] |= 0x2;
}
-#else
- // Unsupported platform. Just set the permission bits for user.
- ((uint8_t *)temp_to_write->buf)[0] |= 0xE;
-#endif
// Need to get abs_path for checking/setting a flag before storing flags.
// Get absolute path.
__attribute__((cleanup(
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd = NULL;
if (user_cwd) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
original_cwd = realpath(".", NULL);
if (chdir(user_cwd)) {
return 1;
}
-#endif
}
// Get combined full path to file.
// First get absolute path to current working directory.
__attribute__((cleanup(
simple_archiver_helper_cleanup_malloced))) void *cwd_dirname = NULL;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
cwd_dirname = realpath(".", NULL);
-#endif
if (!cwd_dirname) {
return 1;
}
}
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t permissions_from_bits_v1_symlink(const uint8_t flags[2],
uint_fast8_t print) {
mode_t permissions = 0;
}
}
-#endif
-
void simple_archiver_internal_cleanup_int_fd(int *fd) {
if (fd && *fd >= 0) {
close(*fd);
}
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
void simple_archiver_internal_cleanup_decomp_pid(pid_t *decomp_pid) {
if (decomp_pid && *decomp_pid >= 0) {
int decompressor_status;
*decomp_pid = -1;
}
}
-#endif
int symlinks_and_files_from_files(void *data, void *ud) {
SDArchiverFileInfo *file_info = data;
file_info_struct->username = NULL;
file_info_struct->groupname = NULL;
file_info_struct->file_size = 0;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
__attribute__((cleanup(
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd =
NULL;
}
file_info_struct->uid = stat_buf.st_uid;
file_info_struct->gid = stat_buf.st_gid;
-#endif
if (state->parsed->flags & 0x1000) {
file_info_struct->bit_flags[0] = 0;
file_info_struct->bit_flags[1] &= 0xFE;
int simple_archiver_write_all(FILE *out_f, SDArchiverState *state,
const SDArchiverLinkedList *filenames) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
signal(SIGINT, handle_sig_int);
-#endif
switch (state->parsed->write_version) {
case 0:
return simple_archiver_write_v0(out_f, state, filenames);
__attribute__((cleanup(
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd = NULL;
if (state->parsed->user_cwd) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
return 1;
}
-#endif
}
char format_str[64];
snprintf(format_str, 64, FILE_COUNTS_OUTPUT_FORMAT_STR_1, state->digits,
__attribute__((cleanup(
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd = NULL;
if (state->parsed->user_cwd) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
return SDAS_INTERNAL_ERROR;
}
-#endif
}
const size_t prefix_length = state->parsed->prefix
uint_fast8_t is_invalid = 0;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
__attribute__((cleanup(
simple_archiver_helper_cleanup_malloced))) void *abs_path = NULL;
__attribute__((cleanup(
if ((stat_buf.st_mode & S_IXOTH) != 0) {
buf[1] |= 2;
}
-#else
- buf[0] = 0xFE;
- buf[1] = 0xB;
-#endif
if (is_invalid) {
buf[1] |= 4;
__attribute__((cleanup(
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd = NULL;
if (state->parsed->user_cwd) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
return SDAS_INTERNAL_ERROR;
}
-#endif
}
{
uint_fast8_t is_invalid = 0;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
__attribute__((cleanup(
simple_archiver_helper_cleanup_malloced))) void *abs_path = NULL;
__attribute__((cleanup(
if ((stat_buf.st_mode & S_IXOTH) != 0) {
buf[1] |= 2;
}
-#else
- buf[0] = 0xFE;
- buf[1] = 0xB;
-#endif
if (is_invalid) {
buf[1] |= 4;
__attribute__((cleanup(
simple_archiver_helper_cleanup_chdir_back))) char *original_cwd = NULL;
if (state->parsed->user_cwd) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
original_cwd = realpath(".", NULL);
if (chdir(state->parsed->user_cwd)) {
return SDAS_INTERNAL_ERROR;
}
-#endif
}
{
uint_fast8_t is_invalid = 0;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
__attribute__((cleanup(
simple_archiver_helper_cleanup_malloced))) void *abs_path = NULL;
__attribute__((cleanup(
if ((stat_buf.st_mode & S_IXOTH) != 0) {
buf[1] |= 2;
}
-#else
- buf[0] = 0xFE;
- buf[1] = 0xB;
-#endif
if (is_invalid) {
buf[1] |= 4;
int simple_archiver_parse_archive_info(FILE *in_f, int_fast8_t do_extract,
const SDArchiverState *state) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
signal(SIGINT, handle_sig_int);
-#endif
uint8_t buf[32];
memset(buf, 0, 32);
}
if (do_extract && state->parsed->user_cwd) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (chdir(state->parsed->user_cwd)) {
return SDAS_FAILED_TO_CHANGE_CWD;
}
-#endif
}
__attribute__((cleanup(
: out_f_name);
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t permissions = 0;
if (do_extract == 0 && lists_allowed) {
fprintf(stderr, "\n");
}
-#endif
-
if (state && state->parsed->flags & 0x1000 && do_extract) {
fprintf(stderr,
"NOTICE: Forcing permissions as specified by "
? filename_with_prefix
: out_f_name;
ptrs_array[1] = &out_f;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (is_compressed && out_f) {
// Handle SIGPIPE.
signal(SIGPIPE, handle_sig_pipe);
if (out_f) {
fprintf(stderr, " Extracted.\n");
}
-#endif
} else {
while (u64 != 0) {
if (u64 > SIMPLE_ARCHIVER_BUFFER_SIZE) {
(state->parsed->flags & 0x800) ? state->parsed->gid : getgid());
if (abs_path && rel_path) {
if (abs_preferred) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
int_fast8_t retry_symlink = 0;
int ret;
__attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
}
V0_SYMLINK_CREATE_AFTER_0:
retry_symlink = 1;
-#endif
} else {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
int_fast8_t retry_symlink = 0;
int ret;
__attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
}
V0_SYMLINK_CREATE_AFTER_1:
retry_symlink = 1;
-#endif
}
} else if (abs_path) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
__attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
char *abs_path_prefixed = NULL;
if (state->parsed->prefix) {
errno);
}
}
-#endif
} else if (rel_path) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
__attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
char *rel_path_prefixed =
simple_archiver_helper_insert_prefix_in_link_path(
errno);
}
}
-#endif
} else {
fprintf(
stderr,
}
if (do_extract && state->parsed->user_cwd) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (chdir(state->parsed->user_cwd)) {
return SDAS_FAILED_TO_CHANGE_CWD;
}
-#endif
}
__attribute__((cleanup(simple_archiver_list_free)))
const uint_fast8_t is_invalid = (buf[1] & 4) ? 1 : 0;
const uint_fast8_t points_to_outside = (buf[1] & 8) ? 1 : 0;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t permissions = permissions_from_bits_v1_symlink(buf, 0);
-#endif
uint_fast8_t link_extracted = 0;
uint_fast8_t skip_due_to_map = 0;
} else {
fprintf(stderr, " Relative path preferred.\n");
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
fprintf(stderr, " Link Permissions: ");
print_permissions(permissions);
fprintf(stderr, "\n");
-#endif
}
__attribute__((cleanup(simple_archiver_helper_cleanup_c_string)))
return SDAS_INTERNAL_ERROR;
}
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
simple_archiver_helper_make_dirs_perms(
link_name_prefixed ? link_name_prefixed : link_name,
(state->parsed->flags & 0x2000)
abs_path_prefixed ? abs_path_prefixed : path);
V1_SYMLINK_CREATE_AFTER_0:
link_create_retry = 1;
-#endif
} else if (!do_extract && lists_allowed) {
fprintf(stderr, " Abs path: %s\n", path);
}
return SDAS_INTERNAL_ERROR;
}
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
simple_archiver_helper_make_dirs_perms(
link_name_prefixed ? link_name_prefixed : link_name,
(state->parsed->flags & 0x2000)
rel_path_prefixed ? rel_path_prefixed : path);
V1_SYMLINK_CREATE_AFTER_1:
link_create_retry = 1;
-#endif
} else if (!do_extract && lists_allowed) {
fprintf(stderr, " Rel path: %s\n", path);
}
SDArchiverLLNode *node = file_info_list->head;
uint32_t file_idx = 0;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (is_compressed) {
// Start the decompressing process and read into files.
&& !skip_due_to_map
&& (file_info->other_flags & 1) == 0
&& (file_info->other_flags & 2) != 0) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t permissions;
if (state->parsed->flags & 0x1000) {
permissions =
file_info->bit_flags,
0);
}
-#endif
if ((state->parsed->flags & 8) == 0) {
// Check if file already exists.
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
if (ret != SDAS_SUCCESS) {
return ret;
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
permissions)
== -1) {
: file_info->filename);
return SDAS_INTERNAL_ERROR;
}
-#endif
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
&& (file_info->other_flags & 2) != 0) {
fprintf(stderr, "WARNING decompressor didn't reach EOF!\n");
}
} else {
-#else
- // } (This comment exists so that vim can correctly match curly-braces).
- if (!is_compressed) {
-#endif
while (node->next != file_info_list->tail) {
if (is_sig_int_occurred) {
return SDAS_SIGINT;
&& !skip_due_to_map
&& (file_info->other_flags & 1) == 0
&& (file_info->other_flags & 2) != 0) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t permissions;
if (state->parsed->flags & 0x1000) {
permissions =
permissions_from_bits_version_1(file_info->bit_flags, 0);
}
-#endif
if ((state->parsed->flags & 8) == 0) {
// Check if file already exists.
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
return ret;
}
simple_archiver_helper_cleanup_FILE(&out_fd);
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
permissions) == -1) {
fprintf(stderr,
file_info->filename);
return SDAS_INTERNAL_ERROR;
}
-#endif
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
&& (file_info->other_flags & 2) != 0) {
fprintf(stderr, "ERROR: Failed to make dirs (%d)!\n", ret);
return SDAS_INTERNAL_ERROR;
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t perms = simple_archiver_internal_bits_to_mode_t(perms_flags);
ret = chmod(abs_dir_path,
state && (state->parsed->flags & 0x10000)
"WARNING: Failed to set permissions on dir \"%s\"!\n",
abs_dir_path);
}
-#endif
}
}
}
if (do_extract && state->parsed->user_cwd) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (chdir(state->parsed->user_cwd)) {
return SDAS_FAILED_TO_CHANGE_CWD;
}
-#endif
}
__attribute__((cleanup(simple_archiver_list_free)))
const uint_fast8_t is_invalid = (buf[1] & 4) ? 1 : 0;
const uint_fast8_t points_to_outside = (buf[1] & 8) ? 1 : 0;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t permissions = permissions_from_bits_v1_symlink(buf, 0);
-#endif
uint_fast8_t link_extracted = 0;
uint_fast8_t skip_due_to_map = 0;
} else {
fprintf(stderr, " Relative path preferred.\n");
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
fprintf(stderr, " Link Permissions: ");
print_permissions(permissions);
fprintf(stderr, "\n");
-#endif
} else if (do_extract && lists_allowed) {
if (is_invalid) {
fprintf(stderr, " WARNING: This symlink entry was marked invalid!\n");
&& lists_allowed
&& absolute_preferred
&& parsed_abs_path) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
simple_archiver_helper_make_dirs_perms(
link_name_prefixed ? link_name_prefixed : link_name,
(state->parsed->flags & 0x2000)
abs_path_prefixed ? abs_path_prefixed : parsed_abs_path);
V3_SYMLINK_CREATE_AFTER_0:
link_create_retry = 1;
-#endif
} else if (do_extract
&& !skip_due_to_map
&& !skip_due_to_invalid
&& lists_allowed
&& !absolute_preferred
&& parsed_rel_path) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
simple_archiver_helper_make_dirs_perms(
link_name_prefixed ? link_name_prefixed : link_name,
(state->parsed->flags & 0x2000)
rel_path_prefixed ? rel_path_prefixed : parsed_rel_path);
V3_SYMLINK_CREATE_AFTER_1:
link_create_retry = 1;
-#endif
}
if (do_extract && lists_allowed && link_extracted && geteuid() == 0) {
SDArchiverLLNode *node = file_info_list->head;
uint32_t file_idx = 0;
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (is_compressed) {
// Start the decompressing process and read into files.
&& !skip_due_to_map
&& (file_info->other_flags & 1) == 0
&& (file_info->other_flags & 2) != 0) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t permissions;
if (state->parsed->flags & 0x1000) {
permissions =
file_info->bit_flags,
0);
}
-#endif
if ((state->parsed->flags & 8) == 0) {
// Check if file already exists.
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
if (ret != SDAS_SUCCESS) {
return ret;
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
permissions)
== -1) {
: file_info->filename);
return SDAS_INTERNAL_ERROR;
}
-#endif
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
&& (file_info->other_flags & 2) != 0) {
fprintf(stderr, "WARNING decompressor didn't reach EOF!\n");
}
} else {
-#else
- // } (This comment exists so that vim can correctly match curly-braces).
- if (!is_compressed) {
-#endif
while (node->next != file_info_list->tail) {
if (is_sig_int_occurred) {
return SDAS_SIGINT;
&& !skip_due_to_map
&& (file_info->other_flags & 1) == 0
&& (file_info->other_flags & 2) != 0) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t permissions;
if (state->parsed->flags & 0x1000) {
permissions =
permissions_from_bits_version_1(file_info->bit_flags, 0);
}
-#endif
if ((state->parsed->flags & 8) == 0) {
// Check if file already exists.
__attribute__((cleanup(simple_archiver_helper_cleanup_FILE)))
return ret;
}
simple_archiver_helper_cleanup_FILE(&out_fd);
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
if (chmod(filename_prefixed ? filename_prefixed : file_info->filename,
permissions)
== -1) {
filename_prefixed ? filename_prefixed : file_info->filename);
return SDAS_INTERNAL_ERROR;
}
-#endif
} else if (!skip_due_to_map
&& (file_info->other_flags & 1) == 0
&& (file_info->other_flags & 2) != 0) {
fprintf(stderr, "ERROR: Failed to make dirs (%d)!\n", ret);
return SDAS_INTERNAL_ERROR;
}
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
mode_t perms = simple_archiver_internal_bits_to_mode_t(perms_flags);
ret = chmod(abs_dir_path,
state && (state->parsed->flags & 0x10000)
"WARNING: Failed to set permissions on dir \"%s\"!\n",
abs_dir_path);
}
-#endif
}
}
int simple_archiver_de_compress(int pipe_fd_in[2], int pipe_fd_out[2],
const char *cmd, void *pid_out) {
-#if SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_COSMOPOLITAN || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_MAC || \
- SIMPLE_ARCHIVER_PLATFORM == SIMPLE_ARCHIVER_PLATFORM_LINUX
posix_spawn_file_actions_t file_actions;
memset(&file_actions, 0, sizeof(file_actions));
if (posix_spawn_file_actions_init(&file_actions) != 0) {
posix_spawn_file_actions_destroy(&file_actions);
return 0;
-#else
- return 1;
-#endif
}
char *simple_archiver_filenames_to_relative_path(const char *from_abs,