diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/include/test_rename.h b/modules/include/test_rename.h new file mode 100644 index 0000000..f6eb30b --- /dev/null +++ b/modules/include/test_rename.h @@ -0,0 +1,17 @@ +/** + * @file test_rename.h + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_RENAME_H +#define TEST_RENAME_H + +#include + + +bool can_rename(const char* oldpath, const char* newpath); + + +#endif // TEST_RENAME_H + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/include/test_rename.h b/modules/include/test_rename.h new file mode 100644 index 0000000..f6eb30b --- /dev/null +++ b/modules/include/test_rename.h @@ -0,0 +1,17 @@ +/** + * @file test_rename.h + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_RENAME_H +#define TEST_RENAME_H + +#include + + +bool can_rename(const char* oldpath, const char* newpath); + + +#endif // TEST_RENAME_H + diff --git a/modules/src/main.c b/modules/src/main.c index 593976b..7b551f8 100644 --- a/modules/src/main.c +++ b/modules/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -8,60 +9,113 @@ #include #include #include +#include +#include +#include +#include +#include +#define RESULT_OK "[ \x1b[1m\x1b[32mOK\x1b[39m\x1b[0m ]" +#define RESULT_NG "[ \x1b[1m\x1b[31mNG\x1b[39m\x1b[0m ]" + #ifdef UNITTEST #define main test_main #endif +typedef struct { + const char* command; + void (*cmd_func)(int argc, char* argv[]); +} CommandFunction; + +void exec_command(int argc, char* argv[]); +void print_usage(int argc, char* argv[]); +void cmd_read(int argc, char* argv[]); +void cmd_write(int argc, char* argv[]); +void cmd_append(int argc, char* argv[]); +void cmd_create(int argc, char* argv[]); +void cmd_delete(int argc, char* argv[]); +void cmd_rename(int argc, char* argv[]); +void cmd_link(int argc, char* argv[]); +void cmd_lock(int argc, char* argv[]); +void cmd_exec(int argc, char* argv[]); + +CommandFunction FUNC_TABLE[] = { + { "read" , cmd_read }, + { "write" , cmd_write }, + { "append" , cmd_append }, + { "create" , cmd_create }, + { "delete" , cmd_delete }, + { "rename" , cmd_rename }, + { "link" , cmd_link }, + { "lock" , cmd_lock }, + { "exec" , cmd_exec }, + { "--help" , print_usage }, + { NULL , NULL } +}; + + + + + + + int main(int argc, char* argv[]) { + exec_command(argc, argv); + /* if (argc < 2) { + print_usage(); return 1; } const char* pathname = argv[1]; + */ /* bool ret = is_exists(pathname); printf("isexists = %d\n", ret); */ - char buf[4096]; - bool ret; - + /* snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); ret = can_create_file(buf); - printf("ret = %d\n", ret); + printf("file = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "directory"); ret = can_create_directory(buf); - printf("ret = %d\n", ret); + printf("directory = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-random"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[r] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-null"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[w] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "loopback"); ret = can_create_block_device_file(buf, 7, 15); - printf("err=%d, %s\n", errno, strerror(errno)); - printf("ret = %d\n", ret); + printf("bdev = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "socket"); ret = can_create_socket(buf); - printf("ret = %d\n", ret); + printf("socket = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "pipe"); ret = can_create_fifo(buf); - printf("ret = %d\n", ret); + printf("pipe = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "lnk"); ret = can_create_symbolic_link(buf, "access-test"); + printf("link = %d\n", ret); + + snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); + ret = can_delete(buf); printf("ret = %d\n", ret); + */ + + return 0; } @@ -69,3 +123,234 @@ + +void exec_command(int argc, char* argv[]) +{ + if (argc >= 2) + { + CommandFunction* cf = &FUNC_TABLE[0]; + while (cf->command != NULL) + { + if (strcmp(cf->command, argv[1]) == 0) + { + cf->cmd_func(argc, argv); + return; + } + cf++; + } + } + // ここに来たらエラー + print_usage(argc, argv); +} + + +// read [pathname] +void cmd_read(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_read(pathname); + printf(" %-10s : %-50s %s\n", "read", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_write(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "write", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_append(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "append", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_create(int argc, char* argv[]) +{ + if (argc >= 4) + { + int maj, min; + const char* cmdname; + const char* pathname = argv[2]; + char type = argv[3][0]; + bool ret = false; + switch (type) + { + case 'r': + cmdname = "create[r]"; + ret = can_create_file(pathname); + break; + case 'd': + cmdname = "create[d]"; + ret = can_create_directory(pathname); + break; + case 'c': + cmdname = "create[c]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_character_device_file(pathname, maj, min); + break; + case 'b': + cmdname = "create[b]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_block_device_file(pathname, maj, min); + break; + case 's': + cmdname = "create[s]"; + ret = can_create_socket(pathname); + break; + case 'p': + cmdname = "create[p]"; + ret = can_create_fifo(pathname); + break; + case 'l': + cmdname = "create[l]"; + if (argc >= 5) + { + const char* target = argv[4]; + ret = can_create_symbolic_link(pathname, target); + } + else + { + print_usage(argc, argv); + return; + } + break; + default: + cmdname = "create[-]"; + ret = false; + break; + } + printf(" %-10s : %-50s %s\n", cmdname, pathname, (ret) ? RESULT_OK : RESULT_NG); + + } + else + { + print_usage(argc, argv); + } +} +void cmd_delete(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_delete(pathname); + printf(" %-10s : %-50s %s\n", "delete", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_rename(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* newpath = argv[3]; + bool ret = can_rename(pathname, newpath); + printf(" %-10s : %-50s %s\n", "rename", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_link(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* linkpath = argv[3]; + bool ret = can_link(pathname, linkpath); + printf(" %-10s : %-50s %s\n", "link", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_lock(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_lock(pathname, false); + printf(" %-10s : %-50s %s\n", "lock", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_exec(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_exec(pathname); + printf(" %-10s : %-50s %s\n", "exec", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + + +/** + * Usage 出力します。 + */ +void print_usage(int argc, char* argv[]) +{ + (void) argc; + (void) argv; + printf("Usage\n"); + printf("./test-access [command] [command args...]\n"); + printf("\n"); + printf("command:\n"); + printf(" read : read [pathname]\n"); + printf(" write : write [pathname]\n"); + printf(" append : append [pathname]\n"); + printf(" create : create [pathname] [args]\n"); + printf(" args:\n"); + printf(" r : regular file\n"); + printf(" d : directory\n"); + printf(" c [major] [minor] : character device\n"); + printf(" Ex. create [pathname] c 1 3 --> null\n"); + printf(" Ex. create [pathname] c 1 8 --> random\n"); + printf(" b [major] [minor] : block device\n"); + printf(" Ex. create [pathname] b 7 15 --> loopback15\n"); + printf(" s : socket\n"); + printf(" p : pipe\n"); + printf(" l : link [frompath]\n"); + printf(" delete : delete [pathname]\n"); + printf(" rename : rename [pathname] [newpathname]\n"); + printf(" link : link [pathname] [linkpath]\n"); + printf(" lock : lock [pathname]\n"); + printf(" exec : exec [pathname]\n"); + printf("\n"); +} + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/include/test_rename.h b/modules/include/test_rename.h new file mode 100644 index 0000000..f6eb30b --- /dev/null +++ b/modules/include/test_rename.h @@ -0,0 +1,17 @@ +/** + * @file test_rename.h + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_RENAME_H +#define TEST_RENAME_H + +#include + + +bool can_rename(const char* oldpath, const char* newpath); + + +#endif // TEST_RENAME_H + diff --git a/modules/src/main.c b/modules/src/main.c index 593976b..7b551f8 100644 --- a/modules/src/main.c +++ b/modules/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -8,60 +9,113 @@ #include #include #include +#include +#include +#include +#include +#include +#define RESULT_OK "[ \x1b[1m\x1b[32mOK\x1b[39m\x1b[0m ]" +#define RESULT_NG "[ \x1b[1m\x1b[31mNG\x1b[39m\x1b[0m ]" + #ifdef UNITTEST #define main test_main #endif +typedef struct { + const char* command; + void (*cmd_func)(int argc, char* argv[]); +} CommandFunction; + +void exec_command(int argc, char* argv[]); +void print_usage(int argc, char* argv[]); +void cmd_read(int argc, char* argv[]); +void cmd_write(int argc, char* argv[]); +void cmd_append(int argc, char* argv[]); +void cmd_create(int argc, char* argv[]); +void cmd_delete(int argc, char* argv[]); +void cmd_rename(int argc, char* argv[]); +void cmd_link(int argc, char* argv[]); +void cmd_lock(int argc, char* argv[]); +void cmd_exec(int argc, char* argv[]); + +CommandFunction FUNC_TABLE[] = { + { "read" , cmd_read }, + { "write" , cmd_write }, + { "append" , cmd_append }, + { "create" , cmd_create }, + { "delete" , cmd_delete }, + { "rename" , cmd_rename }, + { "link" , cmd_link }, + { "lock" , cmd_lock }, + { "exec" , cmd_exec }, + { "--help" , print_usage }, + { NULL , NULL } +}; + + + + + + + int main(int argc, char* argv[]) { + exec_command(argc, argv); + /* if (argc < 2) { + print_usage(); return 1; } const char* pathname = argv[1]; + */ /* bool ret = is_exists(pathname); printf("isexists = %d\n", ret); */ - char buf[4096]; - bool ret; - + /* snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); ret = can_create_file(buf); - printf("ret = %d\n", ret); + printf("file = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "directory"); ret = can_create_directory(buf); - printf("ret = %d\n", ret); + printf("directory = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-random"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[r] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-null"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[w] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "loopback"); ret = can_create_block_device_file(buf, 7, 15); - printf("err=%d, %s\n", errno, strerror(errno)); - printf("ret = %d\n", ret); + printf("bdev = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "socket"); ret = can_create_socket(buf); - printf("ret = %d\n", ret); + printf("socket = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "pipe"); ret = can_create_fifo(buf); - printf("ret = %d\n", ret); + printf("pipe = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "lnk"); ret = can_create_symbolic_link(buf, "access-test"); + printf("link = %d\n", ret); + + snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); + ret = can_delete(buf); printf("ret = %d\n", ret); + */ + + return 0; } @@ -69,3 +123,234 @@ + +void exec_command(int argc, char* argv[]) +{ + if (argc >= 2) + { + CommandFunction* cf = &FUNC_TABLE[0]; + while (cf->command != NULL) + { + if (strcmp(cf->command, argv[1]) == 0) + { + cf->cmd_func(argc, argv); + return; + } + cf++; + } + } + // ここに来たらエラー + print_usage(argc, argv); +} + + +// read [pathname] +void cmd_read(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_read(pathname); + printf(" %-10s : %-50s %s\n", "read", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_write(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "write", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_append(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "append", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_create(int argc, char* argv[]) +{ + if (argc >= 4) + { + int maj, min; + const char* cmdname; + const char* pathname = argv[2]; + char type = argv[3][0]; + bool ret = false; + switch (type) + { + case 'r': + cmdname = "create[r]"; + ret = can_create_file(pathname); + break; + case 'd': + cmdname = "create[d]"; + ret = can_create_directory(pathname); + break; + case 'c': + cmdname = "create[c]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_character_device_file(pathname, maj, min); + break; + case 'b': + cmdname = "create[b]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_block_device_file(pathname, maj, min); + break; + case 's': + cmdname = "create[s]"; + ret = can_create_socket(pathname); + break; + case 'p': + cmdname = "create[p]"; + ret = can_create_fifo(pathname); + break; + case 'l': + cmdname = "create[l]"; + if (argc >= 5) + { + const char* target = argv[4]; + ret = can_create_symbolic_link(pathname, target); + } + else + { + print_usage(argc, argv); + return; + } + break; + default: + cmdname = "create[-]"; + ret = false; + break; + } + printf(" %-10s : %-50s %s\n", cmdname, pathname, (ret) ? RESULT_OK : RESULT_NG); + + } + else + { + print_usage(argc, argv); + } +} +void cmd_delete(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_delete(pathname); + printf(" %-10s : %-50s %s\n", "delete", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_rename(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* newpath = argv[3]; + bool ret = can_rename(pathname, newpath); + printf(" %-10s : %-50s %s\n", "rename", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_link(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* linkpath = argv[3]; + bool ret = can_link(pathname, linkpath); + printf(" %-10s : %-50s %s\n", "link", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_lock(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_lock(pathname, false); + printf(" %-10s : %-50s %s\n", "lock", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_exec(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_exec(pathname); + printf(" %-10s : %-50s %s\n", "exec", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + + +/** + * Usage 出力します。 + */ +void print_usage(int argc, char* argv[]) +{ + (void) argc; + (void) argv; + printf("Usage\n"); + printf("./test-access [command] [command args...]\n"); + printf("\n"); + printf("command:\n"); + printf(" read : read [pathname]\n"); + printf(" write : write [pathname]\n"); + printf(" append : append [pathname]\n"); + printf(" create : create [pathname] [args]\n"); + printf(" args:\n"); + printf(" r : regular file\n"); + printf(" d : directory\n"); + printf(" c [major] [minor] : character device\n"); + printf(" Ex. create [pathname] c 1 3 --> null\n"); + printf(" Ex. create [pathname] c 1 8 --> random\n"); + printf(" b [major] [minor] : block device\n"); + printf(" Ex. create [pathname] b 7 15 --> loopback15\n"); + printf(" s : socket\n"); + printf(" p : pipe\n"); + printf(" l : link [frompath]\n"); + printf(" delete : delete [pathname]\n"); + printf(" rename : rename [pathname] [newpathname]\n"); + printf(" link : link [pathname] [linkpath]\n"); + printf(" lock : lock [pathname]\n"); + printf(" exec : exec [pathname]\n"); + printf("\n"); +} + diff --git a/modules/src/test_create.c b/modules/src/test_create.c index 186aa12..aefd674 100644 --- a/modules/src/test_create.c +++ b/modules/src/test_create.c @@ -196,11 +196,11 @@ * 指定されたパスのシンボリックリンクを生成します。 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。 * - * @param pathname パス - * @param target シンボリックリンク先 + * @param pathname 作成するシンボリックリンク + * @param frompath 作成元のパス * @return true/false (生成成功/生成失敗) */ -bool can_create_symbolic_link(const char* pathname, const char* target) +bool can_create_symbolic_link(const char* pathname, const char* frompath) { // パス存在有無確認 (存在する場合 NG) bool is_error = is_exists(pathname); @@ -211,7 +211,7 @@ } // シンボリックリンク生成 - int ret = symlink(target, pathname); + int ret = symlink(frompath, pathname); bool is_success = (ret == 0); return is_success; } diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/include/test_rename.h b/modules/include/test_rename.h new file mode 100644 index 0000000..f6eb30b --- /dev/null +++ b/modules/include/test_rename.h @@ -0,0 +1,17 @@ +/** + * @file test_rename.h + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_RENAME_H +#define TEST_RENAME_H + +#include + + +bool can_rename(const char* oldpath, const char* newpath); + + +#endif // TEST_RENAME_H + diff --git a/modules/src/main.c b/modules/src/main.c index 593976b..7b551f8 100644 --- a/modules/src/main.c +++ b/modules/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -8,60 +9,113 @@ #include #include #include +#include +#include +#include +#include +#include +#define RESULT_OK "[ \x1b[1m\x1b[32mOK\x1b[39m\x1b[0m ]" +#define RESULT_NG "[ \x1b[1m\x1b[31mNG\x1b[39m\x1b[0m ]" + #ifdef UNITTEST #define main test_main #endif +typedef struct { + const char* command; + void (*cmd_func)(int argc, char* argv[]); +} CommandFunction; + +void exec_command(int argc, char* argv[]); +void print_usage(int argc, char* argv[]); +void cmd_read(int argc, char* argv[]); +void cmd_write(int argc, char* argv[]); +void cmd_append(int argc, char* argv[]); +void cmd_create(int argc, char* argv[]); +void cmd_delete(int argc, char* argv[]); +void cmd_rename(int argc, char* argv[]); +void cmd_link(int argc, char* argv[]); +void cmd_lock(int argc, char* argv[]); +void cmd_exec(int argc, char* argv[]); + +CommandFunction FUNC_TABLE[] = { + { "read" , cmd_read }, + { "write" , cmd_write }, + { "append" , cmd_append }, + { "create" , cmd_create }, + { "delete" , cmd_delete }, + { "rename" , cmd_rename }, + { "link" , cmd_link }, + { "lock" , cmd_lock }, + { "exec" , cmd_exec }, + { "--help" , print_usage }, + { NULL , NULL } +}; + + + + + + + int main(int argc, char* argv[]) { + exec_command(argc, argv); + /* if (argc < 2) { + print_usage(); return 1; } const char* pathname = argv[1]; + */ /* bool ret = is_exists(pathname); printf("isexists = %d\n", ret); */ - char buf[4096]; - bool ret; - + /* snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); ret = can_create_file(buf); - printf("ret = %d\n", ret); + printf("file = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "directory"); ret = can_create_directory(buf); - printf("ret = %d\n", ret); + printf("directory = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-random"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[r] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-null"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[w] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "loopback"); ret = can_create_block_device_file(buf, 7, 15); - printf("err=%d, %s\n", errno, strerror(errno)); - printf("ret = %d\n", ret); + printf("bdev = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "socket"); ret = can_create_socket(buf); - printf("ret = %d\n", ret); + printf("socket = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "pipe"); ret = can_create_fifo(buf); - printf("ret = %d\n", ret); + printf("pipe = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "lnk"); ret = can_create_symbolic_link(buf, "access-test"); + printf("link = %d\n", ret); + + snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); + ret = can_delete(buf); printf("ret = %d\n", ret); + */ + + return 0; } @@ -69,3 +123,234 @@ + +void exec_command(int argc, char* argv[]) +{ + if (argc >= 2) + { + CommandFunction* cf = &FUNC_TABLE[0]; + while (cf->command != NULL) + { + if (strcmp(cf->command, argv[1]) == 0) + { + cf->cmd_func(argc, argv); + return; + } + cf++; + } + } + // ここに来たらエラー + print_usage(argc, argv); +} + + +// read [pathname] +void cmd_read(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_read(pathname); + printf(" %-10s : %-50s %s\n", "read", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_write(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "write", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_append(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "append", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_create(int argc, char* argv[]) +{ + if (argc >= 4) + { + int maj, min; + const char* cmdname; + const char* pathname = argv[2]; + char type = argv[3][0]; + bool ret = false; + switch (type) + { + case 'r': + cmdname = "create[r]"; + ret = can_create_file(pathname); + break; + case 'd': + cmdname = "create[d]"; + ret = can_create_directory(pathname); + break; + case 'c': + cmdname = "create[c]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_character_device_file(pathname, maj, min); + break; + case 'b': + cmdname = "create[b]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_block_device_file(pathname, maj, min); + break; + case 's': + cmdname = "create[s]"; + ret = can_create_socket(pathname); + break; + case 'p': + cmdname = "create[p]"; + ret = can_create_fifo(pathname); + break; + case 'l': + cmdname = "create[l]"; + if (argc >= 5) + { + const char* target = argv[4]; + ret = can_create_symbolic_link(pathname, target); + } + else + { + print_usage(argc, argv); + return; + } + break; + default: + cmdname = "create[-]"; + ret = false; + break; + } + printf(" %-10s : %-50s %s\n", cmdname, pathname, (ret) ? RESULT_OK : RESULT_NG); + + } + else + { + print_usage(argc, argv); + } +} +void cmd_delete(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_delete(pathname); + printf(" %-10s : %-50s %s\n", "delete", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_rename(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* newpath = argv[3]; + bool ret = can_rename(pathname, newpath); + printf(" %-10s : %-50s %s\n", "rename", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_link(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* linkpath = argv[3]; + bool ret = can_link(pathname, linkpath); + printf(" %-10s : %-50s %s\n", "link", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_lock(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_lock(pathname, false); + printf(" %-10s : %-50s %s\n", "lock", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_exec(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_exec(pathname); + printf(" %-10s : %-50s %s\n", "exec", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + + +/** + * Usage 出力します。 + */ +void print_usage(int argc, char* argv[]) +{ + (void) argc; + (void) argv; + printf("Usage\n"); + printf("./test-access [command] [command args...]\n"); + printf("\n"); + printf("command:\n"); + printf(" read : read [pathname]\n"); + printf(" write : write [pathname]\n"); + printf(" append : append [pathname]\n"); + printf(" create : create [pathname] [args]\n"); + printf(" args:\n"); + printf(" r : regular file\n"); + printf(" d : directory\n"); + printf(" c [major] [minor] : character device\n"); + printf(" Ex. create [pathname] c 1 3 --> null\n"); + printf(" Ex. create [pathname] c 1 8 --> random\n"); + printf(" b [major] [minor] : block device\n"); + printf(" Ex. create [pathname] b 7 15 --> loopback15\n"); + printf(" s : socket\n"); + printf(" p : pipe\n"); + printf(" l : link [frompath]\n"); + printf(" delete : delete [pathname]\n"); + printf(" rename : rename [pathname] [newpathname]\n"); + printf(" link : link [pathname] [linkpath]\n"); + printf(" lock : lock [pathname]\n"); + printf(" exec : exec [pathname]\n"); + printf("\n"); +} + diff --git a/modules/src/test_create.c b/modules/src/test_create.c index 186aa12..aefd674 100644 --- a/modules/src/test_create.c +++ b/modules/src/test_create.c @@ -196,11 +196,11 @@ * 指定されたパスのシンボリックリンクを生成します。 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。 * - * @param pathname パス - * @param target シンボリックリンク先 + * @param pathname 作成するシンボリックリンク + * @param frompath 作成元のパス * @return true/false (生成成功/生成失敗) */ -bool can_create_symbolic_link(const char* pathname, const char* target) +bool can_create_symbolic_link(const char* pathname, const char* frompath) { // パス存在有無確認 (存在する場合 NG) bool is_error = is_exists(pathname); @@ -211,7 +211,7 @@ } // シンボリックリンク生成 - int ret = symlink(target, pathname); + int ret = symlink(frompath, pathname); bool is_success = (ret == 0); return is_success; } diff --git a/modules/src/test_delete.c b/modules/src/test_delete.c new file mode 100644 index 0000000..6380594 --- /dev/null +++ b/modules/src/test_delete.c @@ -0,0 +1,38 @@ +/** + * @file test_create.c + * @brief create テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスを削除します。 + * パスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @return true/false (生成成功/生成失敗) + */ +bool can_delete(const char* pathname) +{ + // パス存在有無確認 (存在しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 削除 + int ret = remove(pathname); + bool is_success = (ret == 0); + return is_success; +} + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/include/test_rename.h b/modules/include/test_rename.h new file mode 100644 index 0000000..f6eb30b --- /dev/null +++ b/modules/include/test_rename.h @@ -0,0 +1,17 @@ +/** + * @file test_rename.h + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_RENAME_H +#define TEST_RENAME_H + +#include + + +bool can_rename(const char* oldpath, const char* newpath); + + +#endif // TEST_RENAME_H + diff --git a/modules/src/main.c b/modules/src/main.c index 593976b..7b551f8 100644 --- a/modules/src/main.c +++ b/modules/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -8,60 +9,113 @@ #include #include #include +#include +#include +#include +#include +#include +#define RESULT_OK "[ \x1b[1m\x1b[32mOK\x1b[39m\x1b[0m ]" +#define RESULT_NG "[ \x1b[1m\x1b[31mNG\x1b[39m\x1b[0m ]" + #ifdef UNITTEST #define main test_main #endif +typedef struct { + const char* command; + void (*cmd_func)(int argc, char* argv[]); +} CommandFunction; + +void exec_command(int argc, char* argv[]); +void print_usage(int argc, char* argv[]); +void cmd_read(int argc, char* argv[]); +void cmd_write(int argc, char* argv[]); +void cmd_append(int argc, char* argv[]); +void cmd_create(int argc, char* argv[]); +void cmd_delete(int argc, char* argv[]); +void cmd_rename(int argc, char* argv[]); +void cmd_link(int argc, char* argv[]); +void cmd_lock(int argc, char* argv[]); +void cmd_exec(int argc, char* argv[]); + +CommandFunction FUNC_TABLE[] = { + { "read" , cmd_read }, + { "write" , cmd_write }, + { "append" , cmd_append }, + { "create" , cmd_create }, + { "delete" , cmd_delete }, + { "rename" , cmd_rename }, + { "link" , cmd_link }, + { "lock" , cmd_lock }, + { "exec" , cmd_exec }, + { "--help" , print_usage }, + { NULL , NULL } +}; + + + + + + + int main(int argc, char* argv[]) { + exec_command(argc, argv); + /* if (argc < 2) { + print_usage(); return 1; } const char* pathname = argv[1]; + */ /* bool ret = is_exists(pathname); printf("isexists = %d\n", ret); */ - char buf[4096]; - bool ret; - + /* snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); ret = can_create_file(buf); - printf("ret = %d\n", ret); + printf("file = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "directory"); ret = can_create_directory(buf); - printf("ret = %d\n", ret); + printf("directory = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-random"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[r] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-null"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[w] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "loopback"); ret = can_create_block_device_file(buf, 7, 15); - printf("err=%d, %s\n", errno, strerror(errno)); - printf("ret = %d\n", ret); + printf("bdev = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "socket"); ret = can_create_socket(buf); - printf("ret = %d\n", ret); + printf("socket = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "pipe"); ret = can_create_fifo(buf); - printf("ret = %d\n", ret); + printf("pipe = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "lnk"); ret = can_create_symbolic_link(buf, "access-test"); + printf("link = %d\n", ret); + + snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); + ret = can_delete(buf); printf("ret = %d\n", ret); + */ + + return 0; } @@ -69,3 +123,234 @@ + +void exec_command(int argc, char* argv[]) +{ + if (argc >= 2) + { + CommandFunction* cf = &FUNC_TABLE[0]; + while (cf->command != NULL) + { + if (strcmp(cf->command, argv[1]) == 0) + { + cf->cmd_func(argc, argv); + return; + } + cf++; + } + } + // ここに来たらエラー + print_usage(argc, argv); +} + + +// read [pathname] +void cmd_read(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_read(pathname); + printf(" %-10s : %-50s %s\n", "read", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_write(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "write", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_append(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "append", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_create(int argc, char* argv[]) +{ + if (argc >= 4) + { + int maj, min; + const char* cmdname; + const char* pathname = argv[2]; + char type = argv[3][0]; + bool ret = false; + switch (type) + { + case 'r': + cmdname = "create[r]"; + ret = can_create_file(pathname); + break; + case 'd': + cmdname = "create[d]"; + ret = can_create_directory(pathname); + break; + case 'c': + cmdname = "create[c]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_character_device_file(pathname, maj, min); + break; + case 'b': + cmdname = "create[b]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_block_device_file(pathname, maj, min); + break; + case 's': + cmdname = "create[s]"; + ret = can_create_socket(pathname); + break; + case 'p': + cmdname = "create[p]"; + ret = can_create_fifo(pathname); + break; + case 'l': + cmdname = "create[l]"; + if (argc >= 5) + { + const char* target = argv[4]; + ret = can_create_symbolic_link(pathname, target); + } + else + { + print_usage(argc, argv); + return; + } + break; + default: + cmdname = "create[-]"; + ret = false; + break; + } + printf(" %-10s : %-50s %s\n", cmdname, pathname, (ret) ? RESULT_OK : RESULT_NG); + + } + else + { + print_usage(argc, argv); + } +} +void cmd_delete(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_delete(pathname); + printf(" %-10s : %-50s %s\n", "delete", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_rename(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* newpath = argv[3]; + bool ret = can_rename(pathname, newpath); + printf(" %-10s : %-50s %s\n", "rename", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_link(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* linkpath = argv[3]; + bool ret = can_link(pathname, linkpath); + printf(" %-10s : %-50s %s\n", "link", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_lock(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_lock(pathname, false); + printf(" %-10s : %-50s %s\n", "lock", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_exec(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_exec(pathname); + printf(" %-10s : %-50s %s\n", "exec", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + + +/** + * Usage 出力します。 + */ +void print_usage(int argc, char* argv[]) +{ + (void) argc; + (void) argv; + printf("Usage\n"); + printf("./test-access [command] [command args...]\n"); + printf("\n"); + printf("command:\n"); + printf(" read : read [pathname]\n"); + printf(" write : write [pathname]\n"); + printf(" append : append [pathname]\n"); + printf(" create : create [pathname] [args]\n"); + printf(" args:\n"); + printf(" r : regular file\n"); + printf(" d : directory\n"); + printf(" c [major] [minor] : character device\n"); + printf(" Ex. create [pathname] c 1 3 --> null\n"); + printf(" Ex. create [pathname] c 1 8 --> random\n"); + printf(" b [major] [minor] : block device\n"); + printf(" Ex. create [pathname] b 7 15 --> loopback15\n"); + printf(" s : socket\n"); + printf(" p : pipe\n"); + printf(" l : link [frompath]\n"); + printf(" delete : delete [pathname]\n"); + printf(" rename : rename [pathname] [newpathname]\n"); + printf(" link : link [pathname] [linkpath]\n"); + printf(" lock : lock [pathname]\n"); + printf(" exec : exec [pathname]\n"); + printf("\n"); +} + diff --git a/modules/src/test_create.c b/modules/src/test_create.c index 186aa12..aefd674 100644 --- a/modules/src/test_create.c +++ b/modules/src/test_create.c @@ -196,11 +196,11 @@ * 指定されたパスのシンボリックリンクを生成します。 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。 * - * @param pathname パス - * @param target シンボリックリンク先 + * @param pathname 作成するシンボリックリンク + * @param frompath 作成元のパス * @return true/false (生成成功/生成失敗) */ -bool can_create_symbolic_link(const char* pathname, const char* target) +bool can_create_symbolic_link(const char* pathname, const char* frompath) { // パス存在有無確認 (存在する場合 NG) bool is_error = is_exists(pathname); @@ -211,7 +211,7 @@ } // シンボリックリンク生成 - int ret = symlink(target, pathname); + int ret = symlink(frompath, pathname); bool is_success = (ret == 0); return is_success; } diff --git a/modules/src/test_delete.c b/modules/src/test_delete.c new file mode 100644 index 0000000..6380594 --- /dev/null +++ b/modules/src/test_delete.c @@ -0,0 +1,38 @@ +/** + * @file test_create.c + * @brief create テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスを削除します。 + * パスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @return true/false (生成成功/生成失敗) + */ +bool can_delete(const char* pathname) +{ + // パス存在有無確認 (存在しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 削除 + int ret = remove(pathname); + bool is_success = (ret == 0); + return is_success; +} + diff --git a/modules/src/test_exec.c b/modules/src/test_exec.c new file mode 100644 index 0000000..d58e912 --- /dev/null +++ b/modules/src/test_exec.c @@ -0,0 +1,44 @@ +/** + * @file test_exec.c + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include +#include + +#include +#include + +#include +#include + + +/** + * 指定されたパスを実行します。 + * + * @param pathname パス + * @return true/false (実行成功/実行失敗) + */ +bool can_exec(const char* pathname) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 実行 + int ret = system(pathname); + if (ret == -1) + { // 実行エラー + return false; + } + + bool is_success = (WIFEXITED(ret) && (WEXITSTATUS(ret) == 0)); + return is_success; +} + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/include/test_rename.h b/modules/include/test_rename.h new file mode 100644 index 0000000..f6eb30b --- /dev/null +++ b/modules/include/test_rename.h @@ -0,0 +1,17 @@ +/** + * @file test_rename.h + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_RENAME_H +#define TEST_RENAME_H + +#include + + +bool can_rename(const char* oldpath, const char* newpath); + + +#endif // TEST_RENAME_H + diff --git a/modules/src/main.c b/modules/src/main.c index 593976b..7b551f8 100644 --- a/modules/src/main.c +++ b/modules/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -8,60 +9,113 @@ #include #include #include +#include +#include +#include +#include +#include +#define RESULT_OK "[ \x1b[1m\x1b[32mOK\x1b[39m\x1b[0m ]" +#define RESULT_NG "[ \x1b[1m\x1b[31mNG\x1b[39m\x1b[0m ]" + #ifdef UNITTEST #define main test_main #endif +typedef struct { + const char* command; + void (*cmd_func)(int argc, char* argv[]); +} CommandFunction; + +void exec_command(int argc, char* argv[]); +void print_usage(int argc, char* argv[]); +void cmd_read(int argc, char* argv[]); +void cmd_write(int argc, char* argv[]); +void cmd_append(int argc, char* argv[]); +void cmd_create(int argc, char* argv[]); +void cmd_delete(int argc, char* argv[]); +void cmd_rename(int argc, char* argv[]); +void cmd_link(int argc, char* argv[]); +void cmd_lock(int argc, char* argv[]); +void cmd_exec(int argc, char* argv[]); + +CommandFunction FUNC_TABLE[] = { + { "read" , cmd_read }, + { "write" , cmd_write }, + { "append" , cmd_append }, + { "create" , cmd_create }, + { "delete" , cmd_delete }, + { "rename" , cmd_rename }, + { "link" , cmd_link }, + { "lock" , cmd_lock }, + { "exec" , cmd_exec }, + { "--help" , print_usage }, + { NULL , NULL } +}; + + + + + + + int main(int argc, char* argv[]) { + exec_command(argc, argv); + /* if (argc < 2) { + print_usage(); return 1; } const char* pathname = argv[1]; + */ /* bool ret = is_exists(pathname); printf("isexists = %d\n", ret); */ - char buf[4096]; - bool ret; - + /* snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); ret = can_create_file(buf); - printf("ret = %d\n", ret); + printf("file = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "directory"); ret = can_create_directory(buf); - printf("ret = %d\n", ret); + printf("directory = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-random"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[r] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-null"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[w] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "loopback"); ret = can_create_block_device_file(buf, 7, 15); - printf("err=%d, %s\n", errno, strerror(errno)); - printf("ret = %d\n", ret); + printf("bdev = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "socket"); ret = can_create_socket(buf); - printf("ret = %d\n", ret); + printf("socket = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "pipe"); ret = can_create_fifo(buf); - printf("ret = %d\n", ret); + printf("pipe = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "lnk"); ret = can_create_symbolic_link(buf, "access-test"); + printf("link = %d\n", ret); + + snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); + ret = can_delete(buf); printf("ret = %d\n", ret); + */ + + return 0; } @@ -69,3 +123,234 @@ + +void exec_command(int argc, char* argv[]) +{ + if (argc >= 2) + { + CommandFunction* cf = &FUNC_TABLE[0]; + while (cf->command != NULL) + { + if (strcmp(cf->command, argv[1]) == 0) + { + cf->cmd_func(argc, argv); + return; + } + cf++; + } + } + // ここに来たらエラー + print_usage(argc, argv); +} + + +// read [pathname] +void cmd_read(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_read(pathname); + printf(" %-10s : %-50s %s\n", "read", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_write(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "write", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_append(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "append", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_create(int argc, char* argv[]) +{ + if (argc >= 4) + { + int maj, min; + const char* cmdname; + const char* pathname = argv[2]; + char type = argv[3][0]; + bool ret = false; + switch (type) + { + case 'r': + cmdname = "create[r]"; + ret = can_create_file(pathname); + break; + case 'd': + cmdname = "create[d]"; + ret = can_create_directory(pathname); + break; + case 'c': + cmdname = "create[c]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_character_device_file(pathname, maj, min); + break; + case 'b': + cmdname = "create[b]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_block_device_file(pathname, maj, min); + break; + case 's': + cmdname = "create[s]"; + ret = can_create_socket(pathname); + break; + case 'p': + cmdname = "create[p]"; + ret = can_create_fifo(pathname); + break; + case 'l': + cmdname = "create[l]"; + if (argc >= 5) + { + const char* target = argv[4]; + ret = can_create_symbolic_link(pathname, target); + } + else + { + print_usage(argc, argv); + return; + } + break; + default: + cmdname = "create[-]"; + ret = false; + break; + } + printf(" %-10s : %-50s %s\n", cmdname, pathname, (ret) ? RESULT_OK : RESULT_NG); + + } + else + { + print_usage(argc, argv); + } +} +void cmd_delete(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_delete(pathname); + printf(" %-10s : %-50s %s\n", "delete", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_rename(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* newpath = argv[3]; + bool ret = can_rename(pathname, newpath); + printf(" %-10s : %-50s %s\n", "rename", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_link(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* linkpath = argv[3]; + bool ret = can_link(pathname, linkpath); + printf(" %-10s : %-50s %s\n", "link", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_lock(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_lock(pathname, false); + printf(" %-10s : %-50s %s\n", "lock", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_exec(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_exec(pathname); + printf(" %-10s : %-50s %s\n", "exec", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + + +/** + * Usage 出力します。 + */ +void print_usage(int argc, char* argv[]) +{ + (void) argc; + (void) argv; + printf("Usage\n"); + printf("./test-access [command] [command args...]\n"); + printf("\n"); + printf("command:\n"); + printf(" read : read [pathname]\n"); + printf(" write : write [pathname]\n"); + printf(" append : append [pathname]\n"); + printf(" create : create [pathname] [args]\n"); + printf(" args:\n"); + printf(" r : regular file\n"); + printf(" d : directory\n"); + printf(" c [major] [minor] : character device\n"); + printf(" Ex. create [pathname] c 1 3 --> null\n"); + printf(" Ex. create [pathname] c 1 8 --> random\n"); + printf(" b [major] [minor] : block device\n"); + printf(" Ex. create [pathname] b 7 15 --> loopback15\n"); + printf(" s : socket\n"); + printf(" p : pipe\n"); + printf(" l : link [frompath]\n"); + printf(" delete : delete [pathname]\n"); + printf(" rename : rename [pathname] [newpathname]\n"); + printf(" link : link [pathname] [linkpath]\n"); + printf(" lock : lock [pathname]\n"); + printf(" exec : exec [pathname]\n"); + printf("\n"); +} + diff --git a/modules/src/test_create.c b/modules/src/test_create.c index 186aa12..aefd674 100644 --- a/modules/src/test_create.c +++ b/modules/src/test_create.c @@ -196,11 +196,11 @@ * 指定されたパスのシンボリックリンクを生成します。 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。 * - * @param pathname パス - * @param target シンボリックリンク先 + * @param pathname 作成するシンボリックリンク + * @param frompath 作成元のパス * @return true/false (生成成功/生成失敗) */ -bool can_create_symbolic_link(const char* pathname, const char* target) +bool can_create_symbolic_link(const char* pathname, const char* frompath) { // パス存在有無確認 (存在する場合 NG) bool is_error = is_exists(pathname); @@ -211,7 +211,7 @@ } // シンボリックリンク生成 - int ret = symlink(target, pathname); + int ret = symlink(frompath, pathname); bool is_success = (ret == 0); return is_success; } diff --git a/modules/src/test_delete.c b/modules/src/test_delete.c new file mode 100644 index 0000000..6380594 --- /dev/null +++ b/modules/src/test_delete.c @@ -0,0 +1,38 @@ +/** + * @file test_create.c + * @brief create テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスを削除します。 + * パスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @return true/false (生成成功/生成失敗) + */ +bool can_delete(const char* pathname) +{ + // パス存在有無確認 (存在しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 削除 + int ret = remove(pathname); + bool is_success = (ret == 0); + return is_success; +} + diff --git a/modules/src/test_exec.c b/modules/src/test_exec.c new file mode 100644 index 0000000..d58e912 --- /dev/null +++ b/modules/src/test_exec.c @@ -0,0 +1,44 @@ +/** + * @file test_exec.c + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include +#include + +#include +#include + +#include +#include + + +/** + * 指定されたパスを実行します。 + * + * @param pathname パス + * @return true/false (実行成功/実行失敗) + */ +bool can_exec(const char* pathname) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 実行 + int ret = system(pathname); + if (ret == -1) + { // 実行エラー + return false; + } + + bool is_success = (WIFEXITED(ret) && (WEXITSTATUS(ret) == 0)); + return is_success; +} + diff --git a/modules/src/test_link.c b/modules/src/test_link.c new file mode 100644 index 0000000..c8cee12 --- /dev/null +++ b/modules/src/test_link.c @@ -0,0 +1,39 @@ +/** + * @file test_link.c + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスのシンボリックリンクを生成します。 + * 指定されたパスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @param linkpath シンボリックリンク先 + * @return true/false (生成成功/生成失敗) + */ +bool can_link(const char* pathname, const char* linkpath) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // シンボリックリンク生成 + int ret = symlink(pathname, linkpath); + bool is_success = (ret == 0); + return is_success; +} + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/include/test_rename.h b/modules/include/test_rename.h new file mode 100644 index 0000000..f6eb30b --- /dev/null +++ b/modules/include/test_rename.h @@ -0,0 +1,17 @@ +/** + * @file test_rename.h + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_RENAME_H +#define TEST_RENAME_H + +#include + + +bool can_rename(const char* oldpath, const char* newpath); + + +#endif // TEST_RENAME_H + diff --git a/modules/src/main.c b/modules/src/main.c index 593976b..7b551f8 100644 --- a/modules/src/main.c +++ b/modules/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -8,60 +9,113 @@ #include #include #include +#include +#include +#include +#include +#include +#define RESULT_OK "[ \x1b[1m\x1b[32mOK\x1b[39m\x1b[0m ]" +#define RESULT_NG "[ \x1b[1m\x1b[31mNG\x1b[39m\x1b[0m ]" + #ifdef UNITTEST #define main test_main #endif +typedef struct { + const char* command; + void (*cmd_func)(int argc, char* argv[]); +} CommandFunction; + +void exec_command(int argc, char* argv[]); +void print_usage(int argc, char* argv[]); +void cmd_read(int argc, char* argv[]); +void cmd_write(int argc, char* argv[]); +void cmd_append(int argc, char* argv[]); +void cmd_create(int argc, char* argv[]); +void cmd_delete(int argc, char* argv[]); +void cmd_rename(int argc, char* argv[]); +void cmd_link(int argc, char* argv[]); +void cmd_lock(int argc, char* argv[]); +void cmd_exec(int argc, char* argv[]); + +CommandFunction FUNC_TABLE[] = { + { "read" , cmd_read }, + { "write" , cmd_write }, + { "append" , cmd_append }, + { "create" , cmd_create }, + { "delete" , cmd_delete }, + { "rename" , cmd_rename }, + { "link" , cmd_link }, + { "lock" , cmd_lock }, + { "exec" , cmd_exec }, + { "--help" , print_usage }, + { NULL , NULL } +}; + + + + + + + int main(int argc, char* argv[]) { + exec_command(argc, argv); + /* if (argc < 2) { + print_usage(); return 1; } const char* pathname = argv[1]; + */ /* bool ret = is_exists(pathname); printf("isexists = %d\n", ret); */ - char buf[4096]; - bool ret; - + /* snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); ret = can_create_file(buf); - printf("ret = %d\n", ret); + printf("file = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "directory"); ret = can_create_directory(buf); - printf("ret = %d\n", ret); + printf("directory = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-random"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[r] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-null"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[w] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "loopback"); ret = can_create_block_device_file(buf, 7, 15); - printf("err=%d, %s\n", errno, strerror(errno)); - printf("ret = %d\n", ret); + printf("bdev = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "socket"); ret = can_create_socket(buf); - printf("ret = %d\n", ret); + printf("socket = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "pipe"); ret = can_create_fifo(buf); - printf("ret = %d\n", ret); + printf("pipe = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "lnk"); ret = can_create_symbolic_link(buf, "access-test"); + printf("link = %d\n", ret); + + snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); + ret = can_delete(buf); printf("ret = %d\n", ret); + */ + + return 0; } @@ -69,3 +123,234 @@ + +void exec_command(int argc, char* argv[]) +{ + if (argc >= 2) + { + CommandFunction* cf = &FUNC_TABLE[0]; + while (cf->command != NULL) + { + if (strcmp(cf->command, argv[1]) == 0) + { + cf->cmd_func(argc, argv); + return; + } + cf++; + } + } + // ここに来たらエラー + print_usage(argc, argv); +} + + +// read [pathname] +void cmd_read(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_read(pathname); + printf(" %-10s : %-50s %s\n", "read", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_write(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "write", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_append(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "append", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_create(int argc, char* argv[]) +{ + if (argc >= 4) + { + int maj, min; + const char* cmdname; + const char* pathname = argv[2]; + char type = argv[3][0]; + bool ret = false; + switch (type) + { + case 'r': + cmdname = "create[r]"; + ret = can_create_file(pathname); + break; + case 'd': + cmdname = "create[d]"; + ret = can_create_directory(pathname); + break; + case 'c': + cmdname = "create[c]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_character_device_file(pathname, maj, min); + break; + case 'b': + cmdname = "create[b]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_block_device_file(pathname, maj, min); + break; + case 's': + cmdname = "create[s]"; + ret = can_create_socket(pathname); + break; + case 'p': + cmdname = "create[p]"; + ret = can_create_fifo(pathname); + break; + case 'l': + cmdname = "create[l]"; + if (argc >= 5) + { + const char* target = argv[4]; + ret = can_create_symbolic_link(pathname, target); + } + else + { + print_usage(argc, argv); + return; + } + break; + default: + cmdname = "create[-]"; + ret = false; + break; + } + printf(" %-10s : %-50s %s\n", cmdname, pathname, (ret) ? RESULT_OK : RESULT_NG); + + } + else + { + print_usage(argc, argv); + } +} +void cmd_delete(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_delete(pathname); + printf(" %-10s : %-50s %s\n", "delete", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_rename(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* newpath = argv[3]; + bool ret = can_rename(pathname, newpath); + printf(" %-10s : %-50s %s\n", "rename", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_link(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* linkpath = argv[3]; + bool ret = can_link(pathname, linkpath); + printf(" %-10s : %-50s %s\n", "link", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_lock(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_lock(pathname, false); + printf(" %-10s : %-50s %s\n", "lock", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_exec(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_exec(pathname); + printf(" %-10s : %-50s %s\n", "exec", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + + +/** + * Usage 出力します。 + */ +void print_usage(int argc, char* argv[]) +{ + (void) argc; + (void) argv; + printf("Usage\n"); + printf("./test-access [command] [command args...]\n"); + printf("\n"); + printf("command:\n"); + printf(" read : read [pathname]\n"); + printf(" write : write [pathname]\n"); + printf(" append : append [pathname]\n"); + printf(" create : create [pathname] [args]\n"); + printf(" args:\n"); + printf(" r : regular file\n"); + printf(" d : directory\n"); + printf(" c [major] [minor] : character device\n"); + printf(" Ex. create [pathname] c 1 3 --> null\n"); + printf(" Ex. create [pathname] c 1 8 --> random\n"); + printf(" b [major] [minor] : block device\n"); + printf(" Ex. create [pathname] b 7 15 --> loopback15\n"); + printf(" s : socket\n"); + printf(" p : pipe\n"); + printf(" l : link [frompath]\n"); + printf(" delete : delete [pathname]\n"); + printf(" rename : rename [pathname] [newpathname]\n"); + printf(" link : link [pathname] [linkpath]\n"); + printf(" lock : lock [pathname]\n"); + printf(" exec : exec [pathname]\n"); + printf("\n"); +} + diff --git a/modules/src/test_create.c b/modules/src/test_create.c index 186aa12..aefd674 100644 --- a/modules/src/test_create.c +++ b/modules/src/test_create.c @@ -196,11 +196,11 @@ * 指定されたパスのシンボリックリンクを生成します。 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。 * - * @param pathname パス - * @param target シンボリックリンク先 + * @param pathname 作成するシンボリックリンク + * @param frompath 作成元のパス * @return true/false (生成成功/生成失敗) */ -bool can_create_symbolic_link(const char* pathname, const char* target) +bool can_create_symbolic_link(const char* pathname, const char* frompath) { // パス存在有無確認 (存在する場合 NG) bool is_error = is_exists(pathname); @@ -211,7 +211,7 @@ } // シンボリックリンク生成 - int ret = symlink(target, pathname); + int ret = symlink(frompath, pathname); bool is_success = (ret == 0); return is_success; } diff --git a/modules/src/test_delete.c b/modules/src/test_delete.c new file mode 100644 index 0000000..6380594 --- /dev/null +++ b/modules/src/test_delete.c @@ -0,0 +1,38 @@ +/** + * @file test_create.c + * @brief create テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスを削除します。 + * パスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @return true/false (生成成功/生成失敗) + */ +bool can_delete(const char* pathname) +{ + // パス存在有無確認 (存在しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 削除 + int ret = remove(pathname); + bool is_success = (ret == 0); + return is_success; +} + diff --git a/modules/src/test_exec.c b/modules/src/test_exec.c new file mode 100644 index 0000000..d58e912 --- /dev/null +++ b/modules/src/test_exec.c @@ -0,0 +1,44 @@ +/** + * @file test_exec.c + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include +#include + +#include +#include + +#include +#include + + +/** + * 指定されたパスを実行します。 + * + * @param pathname パス + * @return true/false (実行成功/実行失敗) + */ +bool can_exec(const char* pathname) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 実行 + int ret = system(pathname); + if (ret == -1) + { // 実行エラー + return false; + } + + bool is_success = (WIFEXITED(ret) && (WEXITSTATUS(ret) == 0)); + return is_success; +} + diff --git a/modules/src/test_link.c b/modules/src/test_link.c new file mode 100644 index 0000000..c8cee12 --- /dev/null +++ b/modules/src/test_link.c @@ -0,0 +1,39 @@ +/** + * @file test_link.c + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスのシンボリックリンクを生成します。 + * 指定されたパスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @param linkpath シンボリックリンク先 + * @return true/false (生成成功/生成失敗) + */ +bool can_link(const char* pathname, const char* linkpath) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // シンボリックリンク生成 + int ret = symlink(pathname, linkpath); + bool is_success = (ret == 0); + return is_success; +} + diff --git a/modules/src/test_lock.c b/modules/src/test_lock.c new file mode 100644 index 0000000..0e061e7 --- /dev/null +++ b/modules/src/test_lock.c @@ -0,0 +1,54 @@ +/** + * @file test_lock.c + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスをロックします。 + * 指定されたパスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @param is_share (true/false) 共有ロック/排他ロック + * @return true/false (生成成功/生成失敗) + */ +bool can_lock(const char* pathname, bool is_share) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // fd 取得 + int fd = open(pathname, O_RDONLY); + if (fd == -1) + { + fd = open(pathname, O_WRONLY); + if (fd == -1) + { + return false; + } + } + + int lock_type = (is_share) ? LOCK_SH : LOCK_EX; + int ret = flock(fd, lock_type); + bool is_success = (ret == 0); + if (is_success) + { + flock(fd, LOCK_UN); + } + return is_success; +} + diff --git a/modules/Makefile b/modules/Makefile index 790a4ff..de3dcff 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -12,7 +12,7 @@ RULEDIR ?= $(TOPDIR)/mk NAME = access-test TARGET = $(NAME) -SUBDIRS = test +SUBDIRS = USE_SO_VERSION = # ------------------------------------------------------------------------------ diff --git a/modules/include/test_delete.h b/modules/include/test_delete.h new file mode 100644 index 0000000..d77c77e --- /dev/null +++ b/modules/include/test_delete.h @@ -0,0 +1,17 @@ +/** + * @file test_delete.h + * @brief delete テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_DELETE_H +#define TEST_DELETE_H + +#include + + +bool can_delete(const char* pathname); + + +#endif // TEST_DELETE_H + diff --git a/modules/include/test_exec.h b/modules/include/test_exec.h new file mode 100644 index 0000000..d999287 --- /dev/null +++ b/modules/include/test_exec.h @@ -0,0 +1,17 @@ +/** + * @file test_exec.h + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_EXEC_H +#define TEST_EXEC_H + +#include + + +bool can_exec(const char* pathname); + + +#endif // TEST_EXEC_H + diff --git a/modules/include/test_link.h b/modules/include/test_link.h new file mode 100644 index 0000000..e2f4e3a --- /dev/null +++ b/modules/include/test_link.h @@ -0,0 +1,17 @@ +/** + * @file test_link.h + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LINK_H +#define TEST_LINK_H + +#include + + +bool can_link(const char* pathname, const char* linkpath); + + +#endif // TEST_LINK_H + diff --git a/modules/include/test_lock.h b/modules/include/test_lock.h new file mode 100644 index 0000000..939fcba --- /dev/null +++ b/modules/include/test_lock.h @@ -0,0 +1,17 @@ +/** + * @file test_lock.h + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_LOCK_H +#define TEST_LOCK_H + +#include + + +bool can_lock(const char* pathname, bool is_share); + + +#endif // TEST_LOCK_H + diff --git a/modules/include/test_rename.h b/modules/include/test_rename.h new file mode 100644 index 0000000..f6eb30b --- /dev/null +++ b/modules/include/test_rename.h @@ -0,0 +1,17 @@ +/** + * @file test_rename.h + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#ifndef TEST_RENAME_H +#define TEST_RENAME_H + +#include + + +bool can_rename(const char* oldpath, const char* newpath); + + +#endif // TEST_RENAME_H + diff --git a/modules/src/main.c b/modules/src/main.c index 593976b..7b551f8 100644 --- a/modules/src/main.c +++ b/modules/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -8,60 +9,113 @@ #include #include #include +#include +#include +#include +#include +#include +#define RESULT_OK "[ \x1b[1m\x1b[32mOK\x1b[39m\x1b[0m ]" +#define RESULT_NG "[ \x1b[1m\x1b[31mNG\x1b[39m\x1b[0m ]" + #ifdef UNITTEST #define main test_main #endif +typedef struct { + const char* command; + void (*cmd_func)(int argc, char* argv[]); +} CommandFunction; + +void exec_command(int argc, char* argv[]); +void print_usage(int argc, char* argv[]); +void cmd_read(int argc, char* argv[]); +void cmd_write(int argc, char* argv[]); +void cmd_append(int argc, char* argv[]); +void cmd_create(int argc, char* argv[]); +void cmd_delete(int argc, char* argv[]); +void cmd_rename(int argc, char* argv[]); +void cmd_link(int argc, char* argv[]); +void cmd_lock(int argc, char* argv[]); +void cmd_exec(int argc, char* argv[]); + +CommandFunction FUNC_TABLE[] = { + { "read" , cmd_read }, + { "write" , cmd_write }, + { "append" , cmd_append }, + { "create" , cmd_create }, + { "delete" , cmd_delete }, + { "rename" , cmd_rename }, + { "link" , cmd_link }, + { "lock" , cmd_lock }, + { "exec" , cmd_exec }, + { "--help" , print_usage }, + { NULL , NULL } +}; + + + + + + + int main(int argc, char* argv[]) { + exec_command(argc, argv); + /* if (argc < 2) { + print_usage(); return 1; } const char* pathname = argv[1]; + */ /* bool ret = is_exists(pathname); printf("isexists = %d\n", ret); */ - char buf[4096]; - bool ret; - + /* snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); ret = can_create_file(buf); - printf("ret = %d\n", ret); + printf("file = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "directory"); ret = can_create_directory(buf); - printf("ret = %d\n", ret); + printf("directory = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-random"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[r] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-null"); ret = can_create_character_device_file(buf, 1, 8); - printf("ret = %d\n", ret); + printf("cdev[w] = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "loopback"); ret = can_create_block_device_file(buf, 7, 15); - printf("err=%d, %s\n", errno, strerror(errno)); - printf("ret = %d\n", ret); + printf("bdev = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "socket"); ret = can_create_socket(buf); - printf("ret = %d\n", ret); + printf("socket = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "pipe"); ret = can_create_fifo(buf); - printf("ret = %d\n", ret); + printf("pipe = %d\n", ret); snprintf(buf, sizeof(buf), "%s.%s", pathname, "lnk"); ret = can_create_symbolic_link(buf, "access-test"); + printf("link = %d\n", ret); + + snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file"); + ret = can_delete(buf); printf("ret = %d\n", ret); + */ + + return 0; } @@ -69,3 +123,234 @@ + +void exec_command(int argc, char* argv[]) +{ + if (argc >= 2) + { + CommandFunction* cf = &FUNC_TABLE[0]; + while (cf->command != NULL) + { + if (strcmp(cf->command, argv[1]) == 0) + { + cf->cmd_func(argc, argv); + return; + } + cf++; + } + } + // ここに来たらエラー + print_usage(argc, argv); +} + + +// read [pathname] +void cmd_read(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_read(pathname); + printf(" %-10s : %-50s %s\n", "read", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_write(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "write", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + +void cmd_append(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_write(pathname); + printf(" %-10s : %-50s %s\n", "append", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_create(int argc, char* argv[]) +{ + if (argc >= 4) + { + int maj, min; + const char* cmdname; + const char* pathname = argv[2]; + char type = argv[3][0]; + bool ret = false; + switch (type) + { + case 'r': + cmdname = "create[r]"; + ret = can_create_file(pathname); + break; + case 'd': + cmdname = "create[d]"; + ret = can_create_directory(pathname); + break; + case 'c': + cmdname = "create[c]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_character_device_file(pathname, maj, min); + break; + case 'b': + cmdname = "create[b]"; + maj = (argc >= 5) ? atoi(argv[4]) : 1; + min = (argc >= 6) ? atoi(argv[5]) : 3; + ret = can_create_block_device_file(pathname, maj, min); + break; + case 's': + cmdname = "create[s]"; + ret = can_create_socket(pathname); + break; + case 'p': + cmdname = "create[p]"; + ret = can_create_fifo(pathname); + break; + case 'l': + cmdname = "create[l]"; + if (argc >= 5) + { + const char* target = argv[4]; + ret = can_create_symbolic_link(pathname, target); + } + else + { + print_usage(argc, argv); + return; + } + break; + default: + cmdname = "create[-]"; + ret = false; + break; + } + printf(" %-10s : %-50s %s\n", cmdname, pathname, (ret) ? RESULT_OK : RESULT_NG); + + } + else + { + print_usage(argc, argv); + } +} +void cmd_delete(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_delete(pathname); + printf(" %-10s : %-50s %s\n", "delete", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_rename(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* newpath = argv[3]; + bool ret = can_rename(pathname, newpath); + printf(" %-10s : %-50s %s\n", "rename", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_link(int argc, char* argv[]) +{ + if (argc >= 4) + { + const char* pathname = argv[2]; + const char* linkpath = argv[3]; + bool ret = can_link(pathname, linkpath); + printf(" %-10s : %-50s %s\n", "link", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_lock(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_lock(pathname, false); + printf(" %-10s : %-50s %s\n", "lock", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} +void cmd_exec(int argc, char* argv[]) +{ + if (argc >= 3) + { + const char* pathname = argv[2]; + bool ret = can_exec(pathname); + printf(" %-10s : %-50s %s\n", "exec", pathname, (ret) ? RESULT_OK : RESULT_NG); + } + else + { + print_usage(argc, argv); + } +} + + +/** + * Usage 出力します。 + */ +void print_usage(int argc, char* argv[]) +{ + (void) argc; + (void) argv; + printf("Usage\n"); + printf("./test-access [command] [command args...]\n"); + printf("\n"); + printf("command:\n"); + printf(" read : read [pathname]\n"); + printf(" write : write [pathname]\n"); + printf(" append : append [pathname]\n"); + printf(" create : create [pathname] [args]\n"); + printf(" args:\n"); + printf(" r : regular file\n"); + printf(" d : directory\n"); + printf(" c [major] [minor] : character device\n"); + printf(" Ex. create [pathname] c 1 3 --> null\n"); + printf(" Ex. create [pathname] c 1 8 --> random\n"); + printf(" b [major] [minor] : block device\n"); + printf(" Ex. create [pathname] b 7 15 --> loopback15\n"); + printf(" s : socket\n"); + printf(" p : pipe\n"); + printf(" l : link [frompath]\n"); + printf(" delete : delete [pathname]\n"); + printf(" rename : rename [pathname] [newpathname]\n"); + printf(" link : link [pathname] [linkpath]\n"); + printf(" lock : lock [pathname]\n"); + printf(" exec : exec [pathname]\n"); + printf("\n"); +} + diff --git a/modules/src/test_create.c b/modules/src/test_create.c index 186aa12..aefd674 100644 --- a/modules/src/test_create.c +++ b/modules/src/test_create.c @@ -196,11 +196,11 @@ * 指定されたパスのシンボリックリンクを生成します。 * 既にパスが存在する場合は、errno に EEXIST が設定され、false を返します。 * - * @param pathname パス - * @param target シンボリックリンク先 + * @param pathname 作成するシンボリックリンク + * @param frompath 作成元のパス * @return true/false (生成成功/生成失敗) */ -bool can_create_symbolic_link(const char* pathname, const char* target) +bool can_create_symbolic_link(const char* pathname, const char* frompath) { // パス存在有無確認 (存在する場合 NG) bool is_error = is_exists(pathname); @@ -211,7 +211,7 @@ } // シンボリックリンク生成 - int ret = symlink(target, pathname); + int ret = symlink(frompath, pathname); bool is_success = (ret == 0); return is_success; } diff --git a/modules/src/test_delete.c b/modules/src/test_delete.c new file mode 100644 index 0000000..6380594 --- /dev/null +++ b/modules/src/test_delete.c @@ -0,0 +1,38 @@ +/** + * @file test_create.c + * @brief create テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスを削除します。 + * パスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @return true/false (生成成功/生成失敗) + */ +bool can_delete(const char* pathname) +{ + // パス存在有無確認 (存在しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 削除 + int ret = remove(pathname); + bool is_success = (ret == 0); + return is_success; +} + diff --git a/modules/src/test_exec.c b/modules/src/test_exec.c new file mode 100644 index 0000000..d58e912 --- /dev/null +++ b/modules/src/test_exec.c @@ -0,0 +1,44 @@ +/** + * @file test_exec.c + * @brief exec テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include +#include + +#include +#include + +#include +#include + + +/** + * 指定されたパスを実行します。 + * + * @param pathname パス + * @return true/false (実行成功/実行失敗) + */ +bool can_exec(const char* pathname) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // 実行 + int ret = system(pathname); + if (ret == -1) + { // 実行エラー + return false; + } + + bool is_success = (WIFEXITED(ret) && (WEXITSTATUS(ret) == 0)); + return is_success; +} + diff --git a/modules/src/test_link.c b/modules/src/test_link.c new file mode 100644 index 0000000..c8cee12 --- /dev/null +++ b/modules/src/test_link.c @@ -0,0 +1,39 @@ +/** + * @file test_link.c + * @brief link テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスのシンボリックリンクを生成します。 + * 指定されたパスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @param linkpath シンボリックリンク先 + * @return true/false (生成成功/生成失敗) + */ +bool can_link(const char* pathname, const char* linkpath) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // シンボリックリンク生成 + int ret = symlink(pathname, linkpath); + bool is_success = (ret == 0); + return is_success; +} + diff --git a/modules/src/test_lock.c b/modules/src/test_lock.c new file mode 100644 index 0000000..0e061e7 --- /dev/null +++ b/modules/src/test_lock.c @@ -0,0 +1,54 @@ +/** + * @file test_lock.c + * @brief lock テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスをロックします。 + * 指定されたパスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param pathname パス + * @param is_share (true/false) 共有ロック/排他ロック + * @return true/false (生成成功/生成失敗) + */ +bool can_lock(const char* pathname, bool is_share) +{ + // パス存在有無確認 (しない場合 NG) + bool is_error = !is_exists(pathname); + if (is_error) + { + errno = ENOENT; + return false; + } + + // fd 取得 + int fd = open(pathname, O_RDONLY); + if (fd == -1) + { + fd = open(pathname, O_WRONLY); + if (fd == -1) + { + return false; + } + } + + int lock_type = (is_share) ? LOCK_SH : LOCK_EX; + int ret = flock(fd, lock_type); + bool is_success = (ret == 0); + if (is_success) + { + flock(fd, LOCK_UN); + } + return is_success; +} + diff --git a/modules/src/test_rename.c b/modules/src/test_rename.c new file mode 100644 index 0000000..a1b6219 --- /dev/null +++ b/modules/src/test_rename.c @@ -0,0 +1,39 @@ +/** + * @file test_rename.c + * @brief rename テスト + * @author Nomura Kei + * @copyright 2008 Nomura Kei + */ +#include +#include + +#include + +#include +#include + + +/** + * 指定されたパスをリネームします。 + * パスが存在しない場合は、errno に ENOENT が設定され、false を返します。 + * + * @param oldpath リネーム前のパス + * @param newpath リネーム後のパス + * @return true/false (リネーム成功/リネーム失敗) + */ +bool can_rename(const char* oldpath, const char* newpath) +{ + // リネーム前のパス存在有無確認 (存在しない場合 NG) + bool is_error = !is_exists(oldpath); + if (is_error) + { + errno = ENOENT; + return false; + } + + // リネーム + int ret = rename(oldpath, newpath); + bool is_success = (ret == 0); + return is_success; +} +