diff --git a/include/built_in.h b/include/built_in.h index 9937389ece4e604cb4285c0be7677e8e955a7116..73cc5e4888cc5e10a546e8365e56242e548e01fa 100644 --- a/include/built_in.h +++ b/include/built_in.h @@ -1,7 +1,11 @@ #ifndef BUILT_IN_H_ #define BUILT_IN_H_ -typedef int (*built_in_command_do)(int, char**); +struct pidStorage{ + int pid_arr[2][50], arr_i, arr_n; +}; + +typedef int (*built_in_command_do)(int, char**, struct pidStorage*); typedef int (*built_in_command_validate)(int, char**); struct built_in_command @@ -28,7 +32,7 @@ struct aliased_command If success, return 0. Else if arguments are not valid, return -1. */ -int do_cd(int argc, char** argv); +int do_cd(int argc, char** argv, struct pidStorage *ps); /** do_pwd(argc, argv) @@ -41,15 +45,15 @@ int do_cd(int argc, char** argv); If success, return 0. Else if arguments are not valid, return -1. */ -int do_pwd(int argc, char** argv); +int do_pwd(int argc, char** argv, struct pidStorage *ps); struct aliased_command** get_aliased_commands(); int get_no_alias(); -int do_alias(int argc, char** argv); +int do_alias(int argc, char** argv, struct pidStorage *ps); -int do_fg(int argc, char** argv); +int do_fg(int argc, char** argv, struct pidStorage *ps); /** validate_cd_argv(argc, argv) diff --git a/include/commands.h b/include/commands.h index 31581163c220b1b68c2e8d764603889a732a6355..de9640d7c9f2c14393908d0e3b54fce1713291ec 100644 --- a/include/commands.h +++ b/include/commands.h @@ -1,17 +1,15 @@ #ifndef MYSH_COMMANDS_H_ #define MYSH_COMMANDS_H_ +#include "built_in.h" + struct single_command { int argc; char** argv; }; -struct pidStorage{ - int pid_arr[2][50], arr_i, arr_n; -}; - -int exute_command(struct single_command* com, char* tmp_path); +int exute_command(struct single_command* com, char* tmp_path, struct pidStorage *ps); int execv_handler(char *path, char **argv); diff --git a/src/built_in.c b/src/built_in.c index 67f88324ccb67b7611fde2bc40cee6ce00ad7b9a..50b36685582075fc06cd032ed292cc88f418b0ae 100644 --- a/src/built_in.c +++ b/src/built_in.c @@ -4,6 +4,7 @@ #include <sys/types.h> #include <sys/stat.h> +#include <sys/wait.h> #include <unistd.h> #include <linux/limits.h> @@ -12,7 +13,7 @@ static struct aliased_command* aliased_commands[128] = { NULL, }; static int n_aliased_command = 0; -int do_cd(int argc, char** argv) { +int do_cd(int argc, char** argv, struct pidStorage *ps) { if (!validate_cd_argv(argc, argv)) return -1; @@ -22,7 +23,7 @@ int do_cd(int argc, char** argv) { return 0; } -int do_pwd(int argc, char** argv) { +int do_pwd(int argc, char** argv, struct pidStorage *ps) { if (!validate_pwd_argv(argc, argv)) return -1; @@ -44,7 +45,7 @@ int get_no_alias(){ return n_aliased_command; } -int do_alias(int argc, char** argv) { +int do_alias(int argc, char** argv, struct pidStorage *ps) { int i, j, tmp_i, flag; struct aliased_command *tmp_ac; char print_buff[PATH_MAX]; @@ -93,12 +94,27 @@ int do_alias(int argc, char** argv) { return 0; } -int do_fg(int argc, char** argv) { +int do_fg(int argc, char** argv, struct pidStorage *ps) { if (!validate_fg_argv(argc, argv)) return -1; - // TODO: Fill this. + int num; + if(argc == 1) + num = 1; + else + num = atoi(argv[1]); + + if(num <= 0 || num > ps->arr_n) + return -1; + + int status; + + waitpid(ps->pid_arr[ps->arr_i][num - 1], &status, 0); + if(num < ps->arr_n) + for(int i=num; i<ps->arr_n; i++) + ps->pid_arr[ps->arr_i][i - 1] = ps->pid_arr[ps->arr_i][i]; + (ps->arr_n)--; return 0; } @@ -130,7 +146,7 @@ int validate_alias_argv(int argc, char** argv) { } int validate_fg_argv(int argc, char** argv) { - if (argc != 1) return 0; + if (argc > 2) return 0; if (strcmp(argv[0], "fg") != 0) return 0; return 1; diff --git a/src/commands.c b/src/commands.c index 24fbe68ae09025e18f4217ed87a2d12f88cdfca2..37b3c5c824919fecbb6c8f399750173439fd7c17 100644 --- a/src/commands.c +++ b/src/commands.c @@ -7,9 +7,8 @@ #include <sys/wait.h> #include <linux/limits.h> -#include "commands.h" -#include "built_in.h" #include "utils.h" +#include "commands.h" #define RE_PATH_LENGTH 5 @@ -83,26 +82,26 @@ int evaluate_command(int n_commands, struct single_command (*commands)[512], str fprintf(stderr, "%s: fork error occurs\n", com->argv[0]); return -1; case 0: - status = exute_command(com, tmp_path); + status = exute_command(com, tmp_path, ps); exit(status); default: printf("%d\n", p_id); ps->pid_arr[ps->arr_i][ps->arr_n++] = p_id; } } else { - return exute_command(com, tmp_path); + return exute_command(com, tmp_path, ps); } } return 0; } -int exute_command(struct single_command* com, char* tmp_path){ +int exute_command(struct single_command* com, char* tmp_path, struct pidStorage *ps){ int status, i; int built_in_pos = is_built_in_command(com->argv[0]); if (built_in_pos != -1) { if (built_in_commands[built_in_pos].command_validate(com->argc, com->argv)) { - if (built_in_commands[built_in_pos].command_do(com->argc, com->argv) != 0) { + if (built_in_commands[built_in_pos].command_do(com->argc, com->argv, ps) != 0) { fprintf(stderr, "%s: Error occurs\n", com->argv[0]); } } else { diff --git a/src/main.c b/src/main.c index 064ccedd283abce17139f365162ef8f409a9797e..a93c9dfa51d116abb2e943da1c86fa3539c53e73 100644 --- a/src/main.c +++ b/src/main.c @@ -25,7 +25,7 @@ int main() if (ret && WIFEXITED(status)){ printf("%d done\n", ps.pid_arr[ps.arr_i][i]); } else { - ps.pid_arr[1 - ps.arr_i][j++] = ps.pid_arr[ps.arr_i][i]; + ps.pid_arr[1 - ps.arr_i][j++] = ps.pid_arr[ps.arr_i][i]; } } ps.arr_i = 1 - ps.arr_i; @@ -50,6 +50,5 @@ int main() break; } } - return 0; }