/* * p9_mkdir_probe.c — target-регрессия validator и libc mkdir/rmdir. */ #include #include #include #include #include #include "sc_path.h" static int result_fd = -1; static uint8_t failures; static char cwd_before[256]; static char cwd_after[256]; static char joined[256]; static void log_text(const char *text) { const char *end = text; while (*end != '\0') end++; if (result_fd >= 0) { (void)write(result_fd, text, (uint16_t)(end - text)); } } static void check(uint8_t condition, const char *name) { log_text(condition ? "PASS " : "FAIL "); if (!condition) failures++; log_text(name); log_text("\r\n"); } int main(void) { int rc; result_fd = open("D:\\MKRES.TXT", O_WRONLY | O_CREAT | O_TRUNC); check(sc_path_validate_component("A") == 0 && sc_path_validate_component("ABCDEFGH") == 0 && sc_path_validate_component("ABCDEFGH.XYZ") == 0 && sc_path_validate_component("A_B-1.2") == 0, "valid DOS 8.3 components accepted"); check(sc_path_validate_component("") != 0 && sc_path_validate_component(".") != 0 && sc_path_validate_component("..") != 0 && sc_path_validate_component("ABCDEFGHI") != 0 && sc_path_validate_component("A.ABCD") != 0 && sc_path_validate_component("A.B.C") != 0, "length and dot violations rejected"); check(sc_path_validate_component("BAD\\NAME") != 0 && sc_path_validate_component("BAD/NAME") != 0 && sc_path_validate_component("*.BIN") != 0 && sc_path_validate_component("BAD NAME") != 0, "path injection and wildcard rejected"); check(sc_path_join(joined, sizeof(joined), "D:\\MKTEST", "NEWDIR") == 0 && strcmp(joined, "D:\\MKTEST\\NEWDIR") == 0, "validated component joins full path"); check(getcwd(cwd_before, sizeof(cwd_before)) != 0, "CWD captured before mkdir"); (void)rmdir("D:\\MKTEST\\PROBE"); errno = 0; rc = mkdir("D:\\MKTEST\\PROBE"); check(rc == 0, "mkdir creates directory"); errno = 0; rc = mkdir("D:\\MKTEST\\PROBE"); check(rc != 0 && (errno == EEXIST || errno == EISDIR), "duplicate mkdir is managed error"); check(rmdir("D:\\MKTEST\\PROBE") == 0, "rmdir removes probe directory"); check(getcwd(cwd_after, sizeof(cwd_after)) != 0 && strcmp(cwd_before, cwd_after) == 0, "mkdir/rmdir preserve process CWD"); if (failures == 0u) log_text("ALL PASS\r\n"); if (result_fd >= 0) (void)close(result_fd); return failures; }