From 3e4e32ed4518bbf3e3027c7c3e4d0741dfe341ac Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Tue, 7 Apr 2026 23:36:31 +0200 Subject: [PATCH] fixxxxxxes et mon infra et down je vais me tueeeeeeeeeeeeeeeeeeeer --- epitar/.gitignore | 2 ++ epitar/Makefile | 2 +- epitar/src/main.c | 10 +++++----- epitar/src/tar/archive.c | 4 +++- epitar/src/tar/archive.h | 2 +- epitar/src/tar/extract.c | 23 +++++++++++++++-------- epitar/src/utils/filesystem.c | 6 ++++-- 7 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 epitar/.gitignore diff --git a/epitar/.gitignore b/epitar/.gitignore new file mode 100644 index 0000000..17046c5 --- /dev/null +++ b/epitar/.gitignore @@ -0,0 +1,2 @@ +*.o +epitar diff --git a/epitar/Makefile b/epitar/Makefile index 4c5166d..b3430bf 100644 --- a/epitar/Makefile +++ b/epitar/Makefile @@ -7,7 +7,7 @@ DBG_LDFLAGS= -fsanitize=address SRC_DIR = src -LIB_SRCS = +LIB_SRCS = tar/archive.c tar/extract.c tar/tar.c utils/config.c utils/filesystem.c MAIN_SRCS = main.c # SRCS = $(patsubst %,$(SRC_DIR)/%, $(MAIN_SRCS)) diff --git a/epitar/src/main.c b/epitar/src/main.c index fb8d193..3e1f5d9 100644 --- a/epitar/src/main.c +++ b/epitar/src/main.c @@ -36,17 +36,17 @@ int main(int argc, char **argv) case SUCCESS: return 0; - case FILE_NOT_FOUND: - case UNKNOWN_ERROR: - puts("epitar: error extracting tarball "); - return 3; + // case FILE_NOT_FOUND: + // case UNKNOWN_ERROR: + // printf("epitar: error extracting tarball %s\n", config.archive_file); + // return 3; case BAD_CHECKSUM: puts("epitar: bad checksum"); return 2; default: - puts("epitar: error extracting tarball "); + printf("epitar: error extracting tarball %s\n", config.archive_file); return 3; } } diff --git a/epitar/src/tar/archive.c b/epitar/src/tar/archive.c index 278ab31..014bcd1 100644 --- a/epitar/src/tar/archive.c +++ b/epitar/src/tar/archive.c @@ -1,6 +1,8 @@ #include "archive.h" -#include "tar.h" enum error_code archive(char *archive_name, char **files, bool verbose) { + (void) archive_name; + (void) files; + (void) verbose; return UNKNOWN_ERROR; } diff --git a/epitar/src/tar/archive.h b/epitar/src/tar/archive.h index 52c1e89..546f4ff 100644 --- a/epitar/src/tar/archive.h +++ b/epitar/src/tar/archive.h @@ -1,7 +1,7 @@ #ifndef ARCHIVE_H #define ARCHIVE_H -#include "tar.h" +#include "../utils/errors.h" #include diff --git a/epitar/src/tar/extract.c b/epitar/src/tar/extract.c index c617aba..1de4b9d 100644 --- a/epitar/src/tar/extract.c +++ b/epitar/src/tar/extract.c @@ -13,13 +13,9 @@ */ static enum error_code extract_ustar(FILE *stream, struct ustar_header *header) { - // Length - size_t file_length = atol(header->size); - if (file_length == 0) - return INVALID_FORMAT; struct file_stats stats = { .name = header->name, - .length = atol(header->size), + .length = strtol(header->size, NULL, 8), .content_stream = stream, .mode = header->mode, .uid = header->uid, @@ -74,7 +70,7 @@ static enum error_code extract_file(FILE *content, union tar_header *header, if ((ustar_header = get_ustar_header(header)) != NULL) { if (verbose) - printf("./%s", ustar_header->name); + printf("./%s\n", ustar_header->name); return extract_ustar(content, ustar_header); } // UNIXTAR @@ -121,7 +117,7 @@ enum error_code extract(char *archive_name, bool verbose) // Check if empty char empty_block[BLOCK_SIZE] = { 0 }; - if (memcmp(&header.raw_block, empty_block, BLOCK_SIZE) != 0) + if (memcmp(&header.raw_block, empty_block, BLOCK_SIZE) == 0) { if (got_empty_block) // Previous block empty read_state = SUCCESS; @@ -141,7 +137,18 @@ enum error_code extract(char *archive_name, bool verbose) fclose(stream); return err; } + + // Calculate how many padding bytes need to be skipped + size_t file_size = strtol(header.ustar.size, NULL, 8); + size_t padded_size = ((file_size + BLOCK_SIZE - 1) / BLOCK_SIZE) * BLOCK_SIZE; + size_t skip_bytes = padded_size - file_size; + + if (skip_bytes > 0 && fseek(stream, skip_bytes, SEEK_CUR) != 0) + { + fclose(stream); + return UNKNOWN_ERROR; + } } - return UNKNOWN_ERROR; + return SUCCESS; } diff --git a/epitar/src/utils/filesystem.c b/epitar/src/utils/filesystem.c index 3c4089d..aac2b70 100644 --- a/epitar/src/utils/filesystem.c +++ b/epitar/src/utils/filesystem.c @@ -1,3 +1,5 @@ +#define _POSIX_C_SOURCE 200809L + #include "filesystem.h" #include "errors.h" @@ -115,8 +117,8 @@ enum error_code setowner(char *path, char *uid, char *gid) if (path == NULL || uid == NULL || gid == NULL) return UNKNOWN_ERROR; - uid_t uid_val = (uid_t)strtol(uid, NULL, 10); - gid_t gid_val = (gid_t)strtol(gid, NULL, 10); + uid_t uid_val = strtol(uid, NULL, 10); + gid_t gid_val = strtol(gid, NULL, 10); int err = chown(path, uid_val, gid_val); return err == 0 ? SUCCESS : CANNOT_CREATE_TARGET;