diff --git a/inc/builtin.h b/inc/builtin.h index f7959b5..7d2b6c8 100644 --- a/inc/builtin.h +++ b/inc/builtin.h @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* builtin.h :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: ttsubo +#+ +:+ +#+ */ +/* By: dayano +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/13 17:19:01 by ttsubo #+# #+# */ -/* Updated: 2025/04/21 11:20:16 by ttsubo ### ########.fr */ +/* Updated: 2025/05/01 16:59:28 by dayano ### ########.fr */ /* */ /* ************************************************************************** */ @@ -15,15 +15,17 @@ # define PATH_MAX 4096 -# include "struct.h" # include "builtin_utils.h" +# include "struct.h" + +typedef int (*t_builtin)(int argc, char *argv[], t_minish *minish); -int builtin_echo(int argc, char *argv[]); -int builtin_pwd(int argc, char *argv[]); -int builtin_exit(int argc, char *argv[]); -int builtin_cd(int argc, char *argv[]); -int builtin_env(int argc, char **argv, t_minish *minish); -int builtin_unset(int argc, char *argv[], t_minish *minish); -int builtin_export(int argc, char **argv, t_minish *minish); +int builtin_echo(int argc, char *argv[], t_minish *minish); +int builtin_pwd(int argc, char *argv[], t_minish *minish); +int builtin_exit(int argc, char *argv[], t_minish *minish); +int builtin_cd(int argc, char *argv[], t_minish *minish); +int builtin_env(int argc, char **argv, t_minish *minish); +int builtin_unset(int argc, char *argv[], t_minish *minish); +int builtin_export(int argc, char **argv, t_minish *minish); #endif diff --git a/inc/builtin_utils.h b/inc/builtin_utils.h index 26eadcc..6236b0e 100644 --- a/inc/builtin_utils.h +++ b/inc/builtin_utils.h @@ -3,16 +3,17 @@ /* ::: :::::::: */ /* builtin_utils.h :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: ttsubo +#+ +:+ +#+ */ +/* By: dayano +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/20 19:47:50 by ttsubo #+# #+# */ -/* Updated: 2025/04/29 14:48:10 by ttsubo ### ########.fr */ +/* Updated: 2025/05/01 16:15:02 by dayano ### ########.fr */ /* */ /* ************************************************************************** */ #ifndef BUILTIN_UTILS_H # define BUILTIN_UTILS_H +# include "struct.h" # include # include @@ -28,4 +29,4 @@ int export_exec(int argc, char **argv, t_minish *minish); int print_sorted_env(t_env *head); void export_err_invalid(char *sh, char *arg); -#endif \ No newline at end of file +#endif diff --git a/inc/invoke_command.h b/inc/invoke_command.h index 6275686..ba7cecb 100644 --- a/inc/invoke_command.h +++ b/inc/invoke_command.h @@ -6,7 +6,7 @@ /* By: dayano +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/20 21:21:13 by dayano #+# #+# */ -/* Updated: 2025/04/29 16:47:04 by dayano ### ########.fr */ +/* Updated: 2025/05/01 16:38:55 by dayano ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,7 +17,7 @@ # include int invoke_commands(t_cmd *cmd_head, t_minish *minish); -int exec_unit_builtin(t_cmd *cmd_head); +int exec_unit_builtin(t_cmd *cmd, t_minish *minish); // wait_pipeline.c int wait_pipeline(t_cmd *cmd_head); diff --git a/src/builtin/cd.c b/src/builtin/cd.c index 7eea255..34dffa4 100644 --- a/src/builtin/cd.c +++ b/src/builtin/cd.c @@ -3,17 +3,18 @@ /* ::: :::::::: */ /* cd.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: ttsubo +#+ +:+ +#+ */ +/* By: dayano +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/14 11:12:37 by ttsubo #+# #+# */ -/* Updated: 2025/04/20 19:53:11 by ttsubo ### ########.fr */ +/* Updated: 2025/05/01 15:49:07 by dayano ### ########.fr */ /* */ /* ************************************************************************** */ #include "main.h" -int builtin_cd(int argc, char *argv[]) +int builtin_cd(int argc, char *argv[], t_minish *minish) { + (void)minish; if (argc != 2) return (error_mes(argv[0], "wrong argument"), EXIT_FAILURE); if (chdir(argv[1]) < 0) diff --git a/src/builtin/echo.c b/src/builtin/echo.c index b53548d..b1b4efe 100644 --- a/src/builtin/echo.c +++ b/src/builtin/echo.c @@ -3,17 +3,17 @@ /* ::: :::::::: */ /* echo.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: ttsubo +#+ +:+ +#+ */ +/* By: dayano +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/14 11:12:37 by ttsubo #+# #+# */ -/* Updated: 2025/04/27 14:58:05 by ttsubo ### ########.fr */ +/* Updated: 2025/05/01 15:48:48 by dayano ### ########.fr */ /* */ /* ************************************************************************** */ #include "main.h" /** - * @brief Determines if the option is n only. + * @brief Determines if the option is n only. * * @param arg * @return 0: Contains other than n @@ -42,11 +42,12 @@ static int _has_only_n_option(char *arg) * @param argv * @return 0: Always returns 0. */ -int builtin_echo(int argc, char *argv[]) +int builtin_echo(int argc, char *argv[], t_minish *minish) { int i; int nl_flg; + (void)minish; i = 1; nl_flg = 1; while (i < argc) diff --git a/src/builtin/exit.c b/src/builtin/exit.c index f7dbe30..ff0dbaa 100644 --- a/src/builtin/exit.c +++ b/src/builtin/exit.c @@ -3,17 +3,18 @@ /* ::: :::::::: */ /* exit.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: ttsubo +#+ +:+ +#+ */ +/* By: dayano +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/13 21:20:48 by dayano #+# #+# */ -/* Updated: 2025/04/20 19:53:29 by ttsubo ### ########.fr */ +/* Updated: 2025/05/01 15:50:02 by dayano ### ########.fr */ /* */ /* ************************************************************************** */ #include "main.h" -int builtin_exit(int argc, char *argv[]) +int builtin_exit(int argc, char *argv[], t_minish *minish) { + (void)minish; if (argc != 1) return (error_mes(argv[0], "too many arguments"), EXIT_FAILURE); if (printf("exit\n") < 0) diff --git a/src/builtin/pwd.c b/src/builtin/pwd.c index 309d10f..ff030e6 100644 --- a/src/builtin/pwd.c +++ b/src/builtin/pwd.c @@ -3,19 +3,20 @@ /* ::: :::::::: */ /* pwd.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: ttsubo +#+ +:+ +#+ */ +/* By: dayano +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/13 16:46:01 by dayano #+# #+# */ -/* Updated: 2025/04/20 19:53:56 by ttsubo ### ########.fr */ +/* Updated: 2025/05/01 15:49:32 by dayano ### ########.fr */ /* */ /* ************************************************************************** */ #include "main.h" -int builtin_pwd(int argc, char *argv[]) +int builtin_pwd(int argc, char *argv[], t_minish *minish) { char pwd[PATH_MAX]; + (void)minish; if (argc != 1) { error_mes(argv[0], "wrong argument"); diff --git a/src/invoke_cmd/exec_pipeline.c b/src/invoke_cmd/exec_pipeline.c index f6c1dbd..036488b 100644 --- a/src/invoke_cmd/exec_pipeline.c +++ b/src/invoke_cmd/exec_pipeline.c @@ -6,7 +6,7 @@ /* By: dayano +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/21 13:14:15 by dayano #+# #+# */ -/* Updated: 2025/04/29 16:52:01 by dayano ### ########.fr */ +/* Updated: 2025/05/01 16:51:13 by dayano ### ########.fr */ /* */ /* ************************************************************************** */ @@ -57,7 +57,7 @@ static pid_t _fork_command(t_cmd *cmd, t_cmd *cmd_head, t_pipe_io *pipefds, if ((cmd->next != NULL) && is_redirect(cmd->next)) redirect(cmd->next); if (is_builtin(cmd)) - exit(exec_unit_builtin(cmd)); + exit(exec_unit_builtin(cmd, minish)); execute_cmd(cmd, minish); print_error(cmd->argv[0]); exit(EXIT_FAILURE); diff --git a/src/invoke_cmd/invoke_command.c b/src/invoke_cmd/invoke_command.c index 6375ade..8aba975 100644 --- a/src/invoke_cmd/invoke_command.c +++ b/src/invoke_cmd/invoke_command.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* invoke_command.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dayano +#+ +:+ +#+ */ +/* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/20 21:19:33 by dayano #+# #+# */ -/* Updated: 2025/04/28 21:37:53 by dayano ### ########.fr */ +/* Updated: 2025/05/01 17:07:37 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,8 +23,38 @@ */ static bool is_unit_builtin(t_cmd *cmd_head) { - (void)cmd_head; - return (false); + t_cmd *cmd; + + cmd = cmd_head; + if (is_redirect(cmd)) + cmd = cmd->next; + if ((is_builtin(cmd) && cmd->next == NULL) || (is_builtin(cmd) + && is_redirect(cmd->next))) + return (true); + else + return (false); +} + +static int _execute_builtin(t_cmd *cmd, t_minish *minish) +{ + static const t_builtin builtin_funcs[] = { + builtin_echo, builtin_pwd, builtin_exit, builtin_cd, + builtin_env, builtin_export, builtin_unset, NULL + }; + static char *builtin_list[] = { + "echo", "pwd", "exit", "cd", + "env", "export", "unset", NULL + }; + int i; + + i = 0; + while (builtin_list[i]) + { + if (!ft_strcmp(cmd->argv[0], builtin_list[i])) + return (builtin_funcs[i](cmd->argc, cmd->argv, minish)); + i++; + } + return (print_error(cmd->argv[0]), EXIT_FAILURE); } /** @@ -35,10 +65,25 @@ static bool is_unit_builtin(t_cmd *cmd_head) * @param cmd_head * @return int */ -int exec_unit_builtin(t_cmd *cmd_head) +int exec_unit_builtin(t_cmd *cmd, t_minish *minish) { - (void)cmd_head; - return (0); + t_cmd *builtin_cmd; + + builtin_cmd = cmd; + if (cmd && is_redirect(cmd)) + { + redirect(cmd); + if (cmd->next) + { + cmd = cmd->next; + builtin_cmd = cmd; + } + else + return (print_error(cmd->argv[0]), EXIT_FAILURE); + } + if (cmd->next && is_redirect(cmd->next)) + redirect(cmd->next); + return (_execute_builtin(builtin_cmd, minish)); } /** @@ -54,10 +99,11 @@ int invoke_commands(t_cmd *cmd_head, t_minish *minish) int original_stdin; int original_stdout; + status = 0; original_stdin = dup(STDIN_FILENO); original_stdout = dup(STDOUT_FILENO); if (is_unit_builtin(cmd_head)) - status = exec_unit_builtin(cmd_head); + status = exec_unit_builtin(cmd_head, minish); else { exec_pipeline(cmd_head, minish); diff --git a/src/invoke_cmd/pipeline_helper.c b/src/invoke_cmd/pipeline_helper.c index 1548f3c..294a120 100644 --- a/src/invoke_cmd/pipeline_helper.c +++ b/src/invoke_cmd/pipeline_helper.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* pipeline_helper.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: dayano +#+ +:+ +#+ */ +/* By: ttsubo +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 14:29:29 by dayano #+# #+# */ -/* Updated: 2025/04/28 21:07:41 by dayano ### ########.fr */ +/* Updated: 2025/05/01 17:08:00 by ttsubo ### ########.fr */ /* */ /* ************************************************************************** */ @@ -33,8 +33,27 @@ bool is_tail(t_cmd *cmd) return (false); } -bool is_builtin(t_cmd *cmd) +static bool str_in_list(char *cmd, char **list) { - (void)cmd; + int i; + + i = 0; + while (list[i]) + { + if (!ft_strcmp(cmd, list[i])) + return (true); + i++; + } return (false); } + +bool is_builtin(t_cmd *cmd) +{ + static char *builtin_list[] = { + "echo", "pwd", "exit", "cd", "env", "export", "unset", NULL + }; + + if (!cmd || !cmd->argv || !cmd->argv[0]) + return (false); + return (str_in_list(cmd->argv[0], builtin_list)); +}