return "Failed to extract symlink (internal error)";
case SDAS_FAILED_TO_CHANGE_CWD:
return "Failed to change current working directory";
+ case SDAS_INVALID_WRITE_VERSION:
+ return "Unsupported write version file format";
default:
return "Unknown error";
}
int simple_archiver_write_all(FILE *out_f, SDArchiverState *state,
const SDArchiverLinkedList *filenames) {
+ switch (state->parsed->write_version) {
+ case 0:
+ return simple_archiver_write_v0(out_f, state, filenames);
+ case 1:
+ return simple_archiver_write_v1(out_f, state, filenames);
+ default:
+ fprintf(stderr, "ERROR: Unsupported write version %u!\n",
+ state->parsed->write_version);
+ return SDAS_INVALID_WRITE_VERSION;
+ }
+}
+
+int simple_archiver_write_v0(FILE *out_f, SDArchiverState *state,
+ const SDArchiverLinkedList *filenames) {
// First create a "set" of absolute paths to given filenames.
__attribute__((cleanup(simple_archiver_hash_map_free)))
SDArchiverHashMap *abs_filenames = simple_archiver_hash_map_init();
return SDAS_SUCCESS;
}
+int simple_archiver_write_v1(FILE *out_f, SDArchiverState *state,
+ const SDArchiverLinkedList *filenames) {
+ // TODO Impl.
+ fprintf(stderr, "Writing v1 unimplemented\n");
+ return SDAS_INTERNAL_ERROR;
+}
+
int simple_archiver_parse_archive_info(FILE *in_f, int_fast8_t do_extract,
const SDArchiverState *state) {
uint8_t buf[32];
SDAS_INTERNAL_ERROR,
SDAS_FAILED_TO_CREATE_MAP,
SDAS_FAILED_TO_EXTRACT_SYMLINK,
- SDAS_FAILED_TO_CHANGE_CWD
+ SDAS_FAILED_TO_CHANGE_CWD,
+ SDAS_INVALID_WRITE_VERSION
};
/// Returned pointer must not be freed.
int simple_archiver_write_all(FILE *out_f, SDArchiverState *state,
const SDArchiverLinkedList *filenames);
+int simple_archiver_write_v0(FILE *out_f, SDArchiverState *state,
+ const SDArchiverLinkedList *filenames);
+
+int simple_archiver_write_v1(FILE *out_f, SDArchiverState *state,
+ const SDArchiverLinkedList *filenames);
+
/// Returns zero on success.
int simple_archiver_parse_archive_info(FILE *in_f, int_fast8_t do_extract,
const SDArchiverState *state);
fprintf(stderr,
"--temp-files-dir <dir> : where to store temporary files created "
"when compressing (defaults to current working directory)\n");
+ fprintf(stderr,
+ "--write-version <version> : Force write version file format "
+ "(default 1)\n");
fprintf(stderr,
"-- : specifies remaining arguments are files to archive/extract\n");
fprintf(
parsed.working_files = NULL;
parsed.temp_dir = NULL;
parsed.user_cwd = NULL;
+ parsed.write_version = 0;
return parsed;
}
out->temp_dir = argv[1];
--argc;
++argv;
+ } else if (strcmp(argv[0], "--write-version") == 0) {
+ if (argc < 2) {
+ fprintf(stderr,
+ "ERROR: --write-version expects an integer argument!\n");
+ simple_archiver_print_usage();
+ return 1;
+ }
+ int version = atoi(argv[1]);
+ if (version < 0) {
+ fprintf(stderr, "ERROR: --write-version cannot be negative!\n");
+ simple_archiver_print_usage();
+ return 1;
+ } else if (version > 1) {
+ fprintf(stderr, "ERROR: --write-version must be 0 or 1!\n");
+ simple_archiver_print_usage();
+ return 1;
+ }
+ out->write_version = (uint32_t)version;
+ --argc;
+ ++argv;
} else if (argv[0][0] == '-' && argv[0][1] == '-' && argv[0][2] == 0) {
is_remaining_args = 1;
} else if (argv[0][0] != '-') {
const char *temp_dir;
/// Dir specified by "-C".
const char *user_cwd;
+ /// Currently only 0 and 1 is supported.
+ uint32_t write_version;
} SDArchiverParsed;
typedef struct SDArchiverFileInfo {