diff --git a/Makefile b/Makefile index 81ed9318977ceb095a8a69ba13daef49778b73ac..e09ef551a83b594b76bcb7f3d2fd05112513f7d9 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CC=gcc -std=c99 CFLAGS=-I./src -I./include LIB= -OBJ=./src/utils.o ./src/commands.o +OBJ=./src/utils.o ./src/commands.o ./src/built_in.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/include/built_in.h b/include/built_in.h new file mode 100644 index 0000000000000000000000000000000000000000..b2df0aa845f50b0ba45508d0418a3fbe9643579c --- /dev/null +++ b/include/built_in.h @@ -0,0 +1,61 @@ +#ifndef BUILT_IN_H_ +#define BUILT_IN_H_ + +typedef int (*built_in_command_do)(int, char**); +typedef int (*built_in_command_validate)(int, char**); + +struct built_in_command +{ + char command_name[512]; + built_in_command_do command_do; + built_in_command_validate command_validate; +}; + +/** + do_cd(argc, argv) + + params: + argc: # of arguments. argc must be 2. just "cd" doesn't be approved. + argv: a list of arguments. + + returns: + If success, return 0. + Else if arguments are not valid, return -1. +*/ +int do_cd(int argc, char** argv); + +/** + do_pwd(argc, argv) + + params: + argc: # of arguments. argc must be 1. + argv: a list of arguments. + + returns: + If success, return 0. + Else if arguments are not valid, return -1. +*/ +int do_pwd(int argc, char** argv); + +int do_fg(int argc, char** argv); + +/** + validate_cd_argv(argc, argv) + + returns: + If success, return 1. (true) + Else return 0. (false) +*/ +int validate_cd_argv(int argc, char** argv); +/** + validate_pwd_argv(argc, argv) + + returns: + If success, return 1. (true) + Else return 0. (false) +*/ +int validate_pwd_argv(int argc, char** argv); + +int validate_fg_argv(int argc, char** argv); + +#endif // BUILT_IN_H_ diff --git a/include/commands.h b/include/commands.h index 20e9287ca88a7f3cc986b78d1ff4736d7b7c75d1..84355e20c28ea7db7cb2edc74add1e08e711b89a 100644 --- a/include/commands.h +++ b/include/commands.h @@ -7,47 +7,4 @@ struct single_command char** argv; }; -/** - do_cd(argc, argv) - - params: - argc: # of arguments. argc must be 2. just "cd" doesn't be approved. - argv: a list of arguments. - - returns: - If success, return 0. - Else if arguments are not valid, return -1. -*/ -int do_cd(int argc, char** argv); - -/** - do_pwd(argc, argv) - - params: - argc: # of arguments. argc must be 1. - argv: a list of arguments. - - returns: - If success, return 0. - Else if arguments are not valid, return -1. -*/ -int do_pwd(int argc, char** argv); - -/** - validate_cd_argv(argc, argv) - - returns: - If success, return 1. (true) - Else return 0. (false) -*/ -int validate_cd_argv(int argc, char** argv); -/** - validate_pwd_argv(argc, argv) - - returns: - If success, return 1. (true) - Else return 0. (false) -*/ -int validate_pwd_argv(int argc, char** argv); - #endif // MYSH_COMMANDS_H_ diff --git a/include/signal.h b/include/signal.h new file mode 100644 index 0000000000000000000000000000000000000000..e255fdab7397db93c9228beb1f9d660a91b51801 --- /dev/null +++ b/include/signal.h @@ -0,0 +1,8 @@ +#ifndef SIGNAL_H_ +#define SIGNAL_H_ + +void catch_sigint(int); + +void catch_sigtstp(int); + +#endif // SIGNAL_H_ diff --git a/src/built_in.c b/src/built_in.c new file mode 100644 index 0000000000000000000000000000000000000000..5c7964915cadc5784ee73cff8053bc9a9424899d --- /dev/null +++ b/src/built_in.c @@ -0,0 +1,68 @@ +#include <stdio.h> +#include <string.h> + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <linux/limits.h> + +#include "built_in.h" + +int do_cd(int argc, char** argv) { + if (!validate_cd_argv(argc, argv)) + return -1; + + if (chdir(argv[1]) == -1) + return -1; + + return 0; +} + +int do_pwd(int argc, char** argv) { + if (!validate_pwd_argv(argc, argv)) + return -1; + + char curdir[PATH_MAX]; + + if (getcwd(curdir, PATH_MAX) == NULL) + return -1; + + printf("%s\n", curdir); + + return 0; +} + +int do_fg(int argc, char** argv) { + if (!validate_fg_argv(argc, argv)) + return -1; + + // TODO: Fill this. + + return 0; +} + +int validate_cd_argv(int argc, char** argv) { + if (argc != 2) return 0; + if (strcmp(argv[0], "cd") != 0) return 0; + + struct stat buf; + stat(argv[1], &buf); + + if (!S_ISDIR(buf.st_mode)) return 0; + + return 1; +} + +int validate_pwd_argv(int argc, char** argv) { + if (argc != 1) return 0; + if (strcmp(argv[0], "pwd") != 0) return 0; + + return 1; +} + +int validate_fg_argv(int argc, char** argv) { + if (argv != 1) return 0; + if (strcmp(argv[0], "fg") != 0) return 0; + + return 1; +} diff --git a/src/commands.c b/src/commands.c index 3748285057305e22bee2bea5eb2474077fefc1d8..ef5f4b9ca3b9370c093edc42bb1450821227214d 100644 --- a/src/commands.c +++ b/src/commands.c @@ -1,52 +1,10 @@ -#include <stdio.h> -#include <string.h> - -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <linux/limits.h> - #include "commands.h" +#include "built_in.h" -int do_cd(int argc, char** argv) { - if (!validate_cd_argv(argc, argv)) - return -1; - - if (chdir(argv[1]) == -1) - return -1; - - return 0; -} - -int do_pwd(int argc, char** argv) { - if (!validate_pwd_argv(argc, argv)) - return -1; - - char curdir[PATH_MAX]; - - if (getcwd(curdir, PATH_MAX) == NULL) - return -1; - - printf("%s\n", curdir); - - return 0; -} - -int validate_cd_argv(int argc, char** argv) { - if (argc != 2) return 0; - if (strcmp(argv[0], "cd") != 0) return 0; - - struct stat buf; - stat(argv[1], &buf); - - if (!S_ISDIR(buf.st_mode)) return 0; - - return 1; -} +struct built_in_command built_in_commands[] = { + { "cd", do_cd, validate_cd_argv }, + { "pwd", do_pwd, validate_pwd_argv }, + { "fg", do_fg, validate_fg_argv } +}; -int validate_pwd_argv(int argc, char** argv) { - if (argc != 1) return 0; - if (strcmp(argv[0], "pwd") != 0) return 0; - return 1; -} diff --git a/src/main.c b/src/main.c index fd6bffa371b96ab446b0f2b753fd9e00ffbcb34d..18697a3e73f4e97b6f5449f25df348c2eac92418 100644 --- a/src/main.c +++ b/src/main.c @@ -3,10 +3,9 @@ #include <string.h> #include "commands.h" +#include "built_in.h" #include "utils.h" -static void release_argv(int argc, char*** argv); - int main() { char buf[8096]; @@ -56,11 +55,3 @@ release_and_exit: return 0; } - -static void release_argv(int argc, char*** argv) { - for (int i = 0; i < argc; ++i) { - free((*argv)[i]); - } - free(*argv); - *argv = NULL; -} diff --git a/src/signal.c b/src/signal.c new file mode 100644 index 0000000000000000000000000000000000000000..10b45cae6f0ff705a0dd100d438de4534c8786db --- /dev/null +++ b/src/signal.c @@ -0,0 +1,11 @@ +#include "signal.h" + +void catch_sigint(int) +{ + // TODO: File this! +} + +void catch_sigtstp(int); +{ + // TODO: File this! +}