Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* p9_mkdir_probe.c — target-регрессия validator и libc mkdir/rmdir.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user