Newer
Older
access-test / modules / src / main.c
Nomura Kei on 5 Dec 2022 7 KB update
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <unistd.h>

#include <filetype.h>
#include <test_read.h>
#include <test_write.h>
#include <test_create.h>
#include <test_delete.h>
#include <test_rename.h>
#include <test_link.h>
#include <test_lock.h>
#include <test_exec.h>


#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);
	*/

	/*
	snprintf(buf, sizeof(buf), "%s.%s", pathname, "regular-file");
	ret = can_create_file(buf);
	printf("file = %d\n", ret);

	snprintf(buf, sizeof(buf), "%s.%s", pathname, "directory");
	ret = can_create_directory(buf);
	printf("directory = %d\n", ret);

	snprintf(buf, sizeof(buf), "%s.%s", pathname, "cdev-random");
	ret = can_create_character_device_file(buf, 1, 8);
	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("cdev[w] = %d\n", ret);

	snprintf(buf, sizeof(buf), "%s.%s", pathname, "loopback");
	ret = can_create_block_device_file(buf, 7, 15);
	printf("bdev = %d\n", ret);

	snprintf(buf, sizeof(buf), "%s.%s", pathname, "socket");
	ret = can_create_socket(buf);
	printf("socket = %d\n", ret);

	snprintf(buf, sizeof(buf), "%s.%s", pathname, "pipe");
	ret = can_create_fifo(buf);
	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;
}





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");
}