diff --git a/epitar/Makefile b/epitar/Makefile index 52c4801..10068ef 100644 --- a/epitar/Makefile +++ b/epitar/Makefile @@ -22,7 +22,7 @@ $(TARGET): $(OBJS) @echo $(OBJS) all: $(OBJS) - $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS) + $(CC) -o $(TARGET) $^ $(LDFLAGS) $(LDLIBS) debug: CFLAGS += $(DBG_CFLAGS) debug: LDFLAGS += $(DBG_LDFLAGS) diff --git a/epitar/src/main.c b/epitar/src/main.c index 1e12eb4..92171d5 100644 --- a/epitar/src/main.c +++ b/epitar/src/main.c @@ -3,6 +3,57 @@ #include "utils/config.h" #include "utils/errors.h" +static int handle_err_code(enum error_code err, struct config *config) +{ + int ret_code = 0; + switch (err) + { + case SUCCESS: + ret_code = 0; + break; + + case BAD_CHECKSUM: + puts("epitar: bad checksum"); + ret_code = 2; + break; + + case NOT_IMPLEMENTED: + puts("epitar: Function not implemented"); + ret_code = 2; + break; + + case FILE_NOT_FOUND: + if (config->mode == ARCHIVE) + { + // Rest of code should have printed the first part of the line + printf(" to tarball %s\n", config->archive_file); + ret_code = 3; + break; + } + __attribute__((fallthrough)); + + case EMPTY_ARCHIVE: + if (config->mode == ARCHIVE) + { + puts("epitar: cowardly refusing to create an empty archive"); + ret_code = 1; + } + else + { + printf("epitar: error extracting tarball %s\n", + config->archive_file); + ret_code = 3; + } + break; + + default: + printf("epitar: error extracting tarball %s\n", config->archive_file); + ret_code = 3; + break; + } + return ret_code; +} + int main(int argc, char **argv) { // Handle args @@ -32,48 +83,7 @@ int main(int argc, char **argv) err = archive(config.archive_file, config.input_files, config.verbose); } - int ret_code = 0; - switch (err) - { - case SUCCESS: - ret_code = 0; - break; - - // case UNKNOWN_ERROR: - // printf("epitar: error extracting tarball %s\n", - // config.archive_file); ret_code = 3; break; - - case BAD_CHECKSUM: - puts("epitar: bad checksum"); - ret_code = 2; - break; - - case NOT_IMPLEMENTED: - puts("epitar: Function not implemented"); - ret_code = 2; - break; - - case FILE_NOT_FOUND: - if (config.mode == ARCHIVE) - { - // Rest of code should have printed the first part of the line - printf(" to tarball %s\n", config.archive_file); - ret_code = 3; - break; - } - __attribute__((fallthrough)); - - case EMPTY_ARCHIVE: - puts("epitar: cowardly refusing to create an empty archive"); - ret_code = 1; - break; - - default: - printf("epitar: error extracting tarball %s\n", config.archive_file); - ret_code = 3; - break; - } - + int ret_code = handle_err_code(err, &config); destroy_config(&config); return ret_code; } diff --git a/epitar/src/tar/archive.c b/epitar/src/tar/archive.c index 00ae94d..ed0b247 100644 --- a/epitar/src/tar/archive.c +++ b/epitar/src/tar/archive.c @@ -100,7 +100,7 @@ static enum error_code archivefile(FILE *archive, char *file_path, bool verbose) FILE *file = fopen(file_path, "r"); if (file == NULL) { - printf("Unable to add file %s", file_path); + printf("unable to add file %s", file_path); return FILE_NOT_FOUND; } @@ -162,7 +162,7 @@ static enum error_code archivedir(FILE *archive, char *dir_path, bool verbose) if (isdir == FILE_NOT_FOUND) { // Does not exists - printf("Unable to add file %s", dir_path); + printf("unable to add file %s", dir_path); err = FILE_NOT_FOUND; } else if (isdir == SUCCESS) @@ -204,7 +204,7 @@ enum error_code archive(char *archive_name, char **files, bool verbose) if (isdir == FILE_NOT_FOUND) { // Does not exists - printf("Unable to add file %s", *current_file); + printf("unable to add file %s", *current_file); err = FILE_NOT_FOUND; } else if (isdir == SUCCESS) diff --git a/epitar/src/tar/archive.h b/epitar/src/tar/archive.h index 546f4ff..f9dd21f 100644 --- a/epitar/src/tar/archive.h +++ b/epitar/src/tar/archive.h @@ -1,10 +1,10 @@ #ifndef ARCHIVE_H #define ARCHIVE_H -#include "../utils/errors.h" - #include +#include "../utils/errors.h" + /* @brief Archives the listed `files` into `archive_name` * @return 0 on success, the corresponding error code otherwise */ diff --git a/epitar/src/tar/extract.c b/epitar/src/tar/extract.c index 77ffcbd..28f2677 100644 --- a/epitar/src/tar/extract.c +++ b/epitar/src/tar/extract.c @@ -5,6 +5,7 @@ #include #include "../utils/filesystem.h" +#include "tar.h" /** * @@ -49,9 +50,14 @@ static enum error_code extract_ustar(FILE *stream, struct ustar_header *header) static enum error_code extract_unixtar(FILE *stream, struct unixtar_header *header) { - (void)stream; - (void)header; - return NOT_IMPLEMENTED; + struct file_stats stats = { .name = header->name, + .length = strtol(header->size, NULL, 8), + .content_stream = stream, + .mode = header->mode, + .uid = header->uid, + .gid = header->gid, + .mtime = header->mtime }; + return create_file(&stats); } /** @@ -130,6 +136,12 @@ enum error_code extract(char *archive_name, bool verbose) got_empty_block = false; } + if (!check_checksum(&header)) + { + fclose(stream); + return BAD_CHECKSUM; + } + // Extract file enum error_code err = extract_file(stream, &header, verbose); if (err != SUCCESS) diff --git a/epitar/src/utils/config.c b/epitar/src/utils/config.c index 45e4dfb..a46a5a7 100644 --- a/epitar/src/utils/config.c +++ b/epitar/src/utils/config.c @@ -81,7 +81,7 @@ enum arg_error_code args_handler(int argc, char **argv, struct config *config) // Parse option flags int opt; - while ((opt = getopt(argc, argv, "cxvh")) != -1) + while ((opt = getopt(argc, argv, ":cvxh")) != -1) { int err = handle_opt(opt, config); if (err == ARG_HELP) diff --git a/epitar/src/utils/filesystem.c b/epitar/src/utils/filesystem.c index 6f3f237..9116034 100644 --- a/epitar/src/utils/filesystem.c +++ b/epitar/src/utils/filesystem.c @@ -180,7 +180,7 @@ char *listdirectory(char *path) return de->d_name; } -void freedirectory() +void freedirectory(void) { if (current_dir != NULL) { diff --git a/epitar/src/utils/filesystem.h b/epitar/src/utils/filesystem.h index b504c4d..160c800 100644 --- a/epitar/src/utils/filesystem.h +++ b/epitar/src/utils/filesystem.h @@ -59,6 +59,6 @@ char *listdirectory(char *path); * related allocated memory * @warn Use this function if you only partially listed a directory previously. */ -void freedirectory(); +void freedirectory(void); #endif // FILESYSTEM_H diff --git a/epitar/src/utils/misc.c b/epitar/src/utils/misc.c deleted file mode 100644 index 0271150..0000000 --- a/epitar/src/utils/misc.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "utils.h" - -#include diff --git a/epitar/src/utils/misc.h b/epitar/src/utils/misc.h deleted file mode 100644 index 3d20ecc..0000000 --- a/epitar/src/utils/misc.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef MISC_H -#define MISC_H - -void print_str_array(const char **input_files); - -#endif /* MISC_H */ diff --git a/epitar/tests/functional/run.sh b/epitar/tests/functional/run.sh index 37d5497..70b07f4 100644 --- a/epitar/tests/functional/run.sh +++ b/epitar/tests/functional/run.sh @@ -282,7 +282,23 @@ echo -e "\n$BBlue=== Help and Invalid Arguments ===$Color_Off" test_help "Help flag" test_invalid_args "No arguments" "" test_invalid_args "Invalid flag" "-z" -test_invalid_args "Missing archive" "-c" +test_invalid_args "Invalid flagS" "-zbk" +test_invalid_args "Invalid position" "test.tar -h" +test_invalid_args "Invalid flags and position" "test.tar -z" +test_invalid_args "Invalid flags and position mix" "test.tar -zhx" +test_invalid_args "Invalid position" "test.tar -z" +test_invalid_args "Invalid flag mix" "-zh" +test_invalid_args "Invalid flag mix 2" "-hnh" +test_invalid_args "Invalid flag mix 3" "-cnc" +test_invalid_args "Invalid flag mix 3" "-hhhz" +test_invalid_args "Invalid flag mix 3" "-hnc" +test_invalid_args "Invalid flag mix 3" "-cch" +test_invalid_args "Invalid flag mix 3" "-cnc" +test_invalid_args "Valid flags multiple" "-cc" +test_invalid_args "Incompatible flag" "-cx" +test_invalid_args "Missing op flag" "-v" +test_invalid_args "Missing archive (c)" "-c" +test_invalid_args "Missing archive (x)" "-x" test_invalid_args "Extract with files" "-x archive.tar file.txt" echo -e "\n$BBlue=== Edge Cases ===$Color_Off"