From 8df0dfd30807e02b72e20755c6eb64a80847cb19 Mon Sep 17 00:00:00 2001 From: Grannik Date: Wed, 23 Apr 2025 16:48:58 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?= =?UTF-8?q?/=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module_01.c | 26 ++++++++++++++++ module_02.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++ module_03.c | 69 ++++++++++++++++++++++++++++++++++++++++++ module_04.c | 44 +++++++++++++++++++++++++++ module_05.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 300 insertions(+) create mode 100644 module_01.c create mode 100644 module_02.c create mode 100644 module_03.c create mode 100644 module_04.c create mode 100644 module_05.c diff --git a/module_01.c b/module_01.c new file mode 100644 index 0000000..587f0cc --- /dev/null +++ b/module_01.c @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include + +#define BOLD_GRAY "\033[1;90m" +#define RED "\033[0;31m" +#define WHITE "\033[0;37m" +#define RESET "\033[0m" + +int module_01_run(const char *filename) { + char log_msg[1024]; + + struct stat st; + if (stat(filename, &st) != 0) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Main: " RED "Cannot stat file: %s" RESET, strerror(errno)); + printf("%s\n", log_msg); + return 1; + } + + int is_regular = S_ISREG(st.st_mode); + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Main: " WHITE "File is %s" RESET, is_regular ? "regular file" : "not a regular file"); + printf("%s\n", log_msg); + return 0; +} diff --git a/module_02.c b/module_02.c new file mode 100644 index 0000000..8b71987 --- /dev/null +++ b/module_02.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include + +#define BOLD_GRAY "\033[1;90m" +#define RED "\033[0;31m" +#define WHITE "\033[0;37m" +#define RESET "\033[0m" + +// Размер буфера для чтения +#define BUFFER_SIZE 4096 + +int module_02_run(const char *filename) { + char log_msg[1024]; + + FILE *file = fopen(filename, "rb"); + if (!file) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library text_analyzer: " RED "File type not recognized: %s" RESET, strerror(errno)); + printf("%s\n", log_msg); + return 1; + } + + unsigned char *buffer = malloc(BUFFER_SIZE); + if (!buffer) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library text_analyzer: " RED "Memory allocation failed" RESET); + printf("%s\n", log_msg); + fclose(file); + return 1; + } + + size_t read_bytes = fread(buffer, 1, BUFFER_SIZE, file); + fclose(file); + + if (read_bytes == 0) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library text_analyzer: " RED "File type not recognized: Empty file" RESET); + printf("%s\n", log_msg); + free(buffer); + return 1; + } + + // Проверяем наличие ANSI-кодов + int has_ansi = 0; + for (size_t i = 0; i < read_bytes - 1; i++) { + if (buffer[i] == '\x1B' && buffer[i + 1] == '[') { + has_ansi = 1; + break; + } + } + + // Проверяем JSON + int is_json = 0; + for (size_t i = 0; i < read_bytes; i++) { + if (buffer[i] == ' ' || buffer[i] == '\t' || buffer[i] == '\n' || buffer[i] == '\r') continue; + if (buffer[i] == '{' || buffer[i] == '[') { + is_json = 1; + } + break; + } + + // Проверяем CSV + int is_csv = 0; + int comma_count = 0; + for (size_t i = 0; i < read_bytes; i++) { + if (buffer[i] == ',' || buffer[i] == ';') { + comma_count++; + if (comma_count >= 3) { + is_csv = 1; + break; + } + } + } + + if (has_ansi) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library text_analyzer: " WHITE "Text file with ANSI escape sequences (likely terminal log)" RESET); + } else if (is_json) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library text_analyzer: " WHITE "Text file, likely JSON format" RESET); + } else if (is_csv) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library text_analyzer: " WHITE "Text file, likely CSV format" RESET); + } else { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library text_analyzer: " WHITE "Text file, unknown structure (possibly plain text or log)" RESET); + } + printf("%s\n", log_msg); + free(buffer); + return 0; +} diff --git a/module_03.c b/module_03.c new file mode 100644 index 0000000..12e4d5c --- /dev/null +++ b/module_03.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include +#include +//#include "log.h" + +#define BOLD_GRAY "\033[1;90m" +#define RED "\033[0;31m" +#define WHITE "\033[0;37m" +#define RESET "\033[0m" + +int module_03_run(const char *filename) { + char log_msg[1024]; + + struct stat st; + if (stat(filename, &st) != 0) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libstat: " RED "File type not recognized: %s" RESET, strerror(errno)); + printf("%s\n", log_msg); +// log_message(log_msg); + return 1; + } + + const char *type; + char extra_info[512] = ""; + if (S_ISREG(st.st_mode)) { + type = "regular file"; + } else if (S_ISDIR(st.st_mode)) { + type = "directory"; + } else if (S_ISCHR(st.st_mode)) { + type = "character device"; + snprintf(extra_info, sizeof(extra_info), ", Major: %d, Minor: %d", + major(st.st_rdev), minor(st.st_rdev)); + } else if (S_ISBLK(st.st_mode)) { + type = "block device"; + snprintf(extra_info, sizeof(extra_info), ", Major: %d, Minor: %d", + major(st.st_rdev), minor(st.st_rdev)); + } else if (S_ISFIFO(st.st_mode)) { + type = "FIFO (named pipe)"; + } else if (S_ISSOCK(st.st_mode)) { + type = "socket"; + } else if (S_ISLNK(st.st_mode)) { + type = "symbolic link"; + char link_target[256]; + ssize_t len = readlink(filename, link_target, sizeof(link_target) - 1); + if (len != -1) { + link_target[len] = '\0'; + snprintf(extra_info, sizeof(extra_info), ", Points to: %s", link_target); + } else { + snprintf(extra_info, sizeof(extra_info), ", Error reading link: %s", strerror(errno)); + } + } else { + type = "unknown"; + } + + if (strncmp(filename, "/proc/", 6) == 0) { + type = "procfs pseudo-file"; + } else if (strncmp(filename, "/sys/", 5) == 0) { + type = "sysfs pseudo-file"; + } + + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libstat: " WHITE "Size: %ld bytes, Permissions: %o, Type: %s%s" RESET, + (long)st.st_size, st.st_mode & 0777, type, extra_info); + printf("%s\n", log_msg); +// log_message(log_msg); + return 0; +} diff --git a/module_04.c b/module_04.c new file mode 100644 index 0000000..8209017 --- /dev/null +++ b/module_04.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include + +#define BOLD_GRAY "\033[1;90m" +#define RED "\033[0;31m" +#define WHITE "\033[0;37m" +#define RESET "\033[0m" + +int module_04_run(const char *filename) { + char log_msg[1024]; + + magic_t magic = magic_open(MAGIC_MIME_TYPE | MAGIC_ERROR | MAGIC_NO_CHECK_CDF); + if (!magic) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libmagic: " RED "File type not recognized: Error initializing libmagic" RESET); + printf("%s\n", log_msg); + return 1; + } + + if (magic_load(magic, NULL) != 0) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libmagic: " RED "File type not recognized: Error loading magic database: %s" RESET, + magic_error(magic)); + printf("%s\n", log_msg); + magic_close(magic); + return 1; + } + + const char *mime = magic_file(magic, filename); + if (!mime || strlen(mime) == 0 || strstr(mime, "\xFF") || strstr(mime, "\x00")) { + mime = "text/plain"; + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libmagic: " RED "Invalid MIME, assuming text/plain" RESET); + printf("%s\n", log_msg); + } + + magic_setflags(magic, 0); + const char *desc = magic_file(magic, filename); + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libmagic: " WHITE "MIME: %s, Description: %s" RESET, + mime, desc ? desc : "Unknown"); + printf("%s\n", log_msg); + magic_close(magic); + return 0; +} diff --git a/module_05.c b/module_05.c new file mode 100644 index 0000000..e045da8 --- /dev/null +++ b/module_05.c @@ -0,0 +1,75 @@ +#include +#include +#include +#include +#include + +#define BOLD_GRAY "\033[1;90m" +#define RED "\033[0;31m" +#define WHITE "\033[0;37m" +#define RESET "\033[0m" + +// Размер буфера для чтения +#define BUFFER_SIZE 4096 + +int module_05_run(const char *filename) { + char log_msg[1024]; + + FILE *file = fopen(filename, "rb"); + if (!file) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library iconv: " RED "File type not recognized: %s" RESET, strerror(errno)); + printf("%s\n", log_msg); + return 1; + } + + unsigned char *buffer = malloc(BUFFER_SIZE); + if (!buffer) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library iconv: " RED "Memory allocation failed" RESET); + printf("%s\n", log_msg); + fclose(file); + return 1; + } + + size_t read_bytes = fread(buffer, 1, BUFFER_SIZE, file); + fclose(file); + + if (read_bytes == 0) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library iconv: " RED "File type not recognized: Empty file" RESET); + printf("%s\n", log_msg); + free(buffer); + return 1; + } + + iconv_t cd = iconv_open("UTF-8", "UTF-8"); + if (cd == (iconv_t)-1) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library iconv: " RED "Error initializing iconv" RESET); + printf("%s\n", log_msg); + free(buffer); + return 1; + } + + char *inbuf = (char *)buffer; + size_t inbytesleft = read_bytes; + char *outbuf = malloc(BUFFER_SIZE); + if (!outbuf) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library iconv: " RED "Memory allocation failed" RESET); + printf("%s\n", log_msg); + iconv_close(cd); + free(buffer); + return 1; + } + char *outptr = outbuf; + size_t outbytesleft = BUFFER_SIZE; + + size_t result = iconv(cd, &inbuf, &inbytesleft, &outptr, &outbytesleft); + if (result == (size_t)-1) { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library iconv: " WHITE "Not UTF-8, possible binary or other encoding" RESET); + } else { + snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library iconv: " WHITE "Compatible with UTF-8" RESET); + } + printf("%s\n", log_msg); + iconv_close(cd); + free(outbuf); + free(buffer); + return 0; +}