From 161ac6b69d1ddf6e6e0ce8f5ee17d37e46efaf87 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 12 Sep 2025 12:41:24 +0200 Subject: [PATCH] saved changes before repartition --- .gitignore | 3 + Makefile | 29 +++--- README.md | 23 +++++ docs/tests.md | 17 ++++ include/builtins.h | 36 ++++--- include/history.h | 20 ++++ include/minishell.h | 48 ++++++++-- src/commands/command_utils.c | 36 +++++++ src/commands/exec.c | 46 +++++++-- src/commands/parse.c | 54 ++--------- src/features/builtins/builtin_utils.c | 38 ++++++++ src/{ => features}/builtins/cd.c | 5 +- src/{ => features}/builtins/echo.c | 4 +- src/{ => features}/builtins/env.c | 27 +++--- src/{ => features}/builtins/exit.c | 2 +- src/features/builtins/export.c | 38 ++++++++ src/features/builtins/printenv.c | 28 ++++++ src/{ => features}/builtins/pwd.c | 0 .../builtins/todo/alias.c} | 0 .../builtins/todo/builtin.c} | 0 src/features/builtins/todo/history.c | 0 src/features/builtins/todo/type.c | 27 ++++++ src/features/builtins/unset.c | 22 +++++ src/features/history/history.c | 40 ++++++++ src/minishell.c | 94 +++++++++---------- src/utils/signals.c | 41 ++++++++ 26 files changed, 528 insertions(+), 150 deletions(-) create mode 100644 README.md create mode 100644 docs/tests.md create mode 100644 include/history.h create mode 100644 src/commands/command_utils.c create mode 100644 src/features/builtins/builtin_utils.c rename src/{ => features}/builtins/cd.c (85%) rename src/{ => features}/builtins/echo.c (97%) rename src/{ => features}/builtins/env.c (75%) rename src/{ => features}/builtins/exit.c (97%) create mode 100644 src/features/builtins/export.c create mode 100644 src/features/builtins/printenv.c rename src/{ => features}/builtins/pwd.c (100%) rename src/{builtins/export.c => features/builtins/todo/alias.c} (100%) rename src/{builtins/unset.c => features/builtins/todo/builtin.c} (100%) create mode 100644 src/features/builtins/todo/history.c create mode 100644 src/features/builtins/todo/type.c create mode 100644 src/features/builtins/unset.c create mode 100644 src/features/history/history.c create mode 100644 src/utils/signals.c diff --git a/.gitignore b/.gitignore index ab4ff83..ae10110 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,9 @@ minishell # Libraries path /lib +# Todo path +/src/todo + # VSCode /.vscode diff --git a/Makefile b/Makefile index 41ba8a6..99f47c4 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: sede-san file1 > file2 +``` +or +``` +cmd >> file1 >> file2 +``` + +Should create both `file1` and `file2` but store the output in `file2` + +### Environment variables + +#### SHLVL + +Must be increased by 1 if executed from any other shell or 1 if executed diff --git a/include/builtins.h b/include/builtins.h index 35cc9de..fa44f68 100644 --- a/include/builtins.h +++ b/include/builtins.h @@ -6,7 +6,7 @@ /* By: sede-san # include -typedef int (*t_builtin_func)(int argc, char const *argv[]); - -typedef struct s_builtin -{ - const char *name; - t_builtin_func function; -} t_builtin; - // cd.c int cd_builtin(int argc, char const *argv[]); +# define CD_HELP + // echo.c typedef struct s_echo_flags @@ -37,24 +31,40 @@ typedef struct s_echo_flags int echo_builtin(int argc, char const *argv[]); -// env.c +# define ECHO_HELP -int env_builtin(int argc, char const *argv[]); +// // env.c + +// int env_builtin(int argc, char const *argv[], char **envp); // exit.c int exit_builtin(int argc, char const *argv[]); +# define EXIT_HELP + // export.c -int export_builtin(int argc, char const *argv[]); +int export_builtin(int argc, char const *argv[], char **envp); + +# define EXPORT_HELP + +// printenv.c + +int printenv_builtin(int argc, char const *argv[], char const *envp[]); + +# define PRINTENV_HELP // pwd.c int pwd_builtin(int argc, char const *argv[]); +# define PWD_HELP + // unset.c -int unset_builtin(int argc, char const *argv[]); +int unset_builtin(int argc, char const *argv[], char **envp); + +# define UNSET_HELP #endif diff --git a/include/history.h b/include/history.h new file mode 100644 index 0000000..0f80e4f --- /dev/null +++ b/include/history.h @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* history.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sede-san @@ -26,32 +27,61 @@ typedef struct s_cmd { int argc; char **argv; - char **envp; -} t_cmd; +} t_cmd; -# define HISTORY_FILE "/.minishell_history" +typedef struct s_history +{ + char *hist_file; + size_t hist_file_size; + t_cdlist hist; + size_t hist_size; +} t_history; typedef struct s_minishell { - char *history_file; - char **envp; -} t_minishell; + char **envp; + t_history *history; + char *history_file; +} t_minishell; + +/* ******************************** Features ******************************** */ + +/* History */ + +// history.c +void ms_add_history(const char *line); +int ms_read_history(const char *hist_file); +void ms_write_history(const char *hist_file); /* ******************************* Commands ********************************* */ -typedef int (*t_msh_cmdfunc)(char **args, char **env, t_minishell* minshell); +// command_utils.c + +int is_absolutepath(char const *cmd); +int is_builtin(t_cmd *cmd); +int is_local(char const *cmd); // exec.c -int exec_cmd(char *cmd, char **args, t_minishell *minishell); +int exec_cmd(t_cmd *cmd, char **envp); +int exec_builtin(t_cmd *cmd, char **envp); // parse.c t_cmd parse_cmd(char *line, t_minishell *minishell); +// signals.c + +void init_signal(void); + /* ********************************* Utils ********************************** */ // get_hostname.c char *get_hostname(void); +/* ******************************** Builtins ******************************** */ + +// builtin_utils.c +int is_builtin(t_cmd *cmd); + #endif diff --git a/src/commands/command_utils.c b/src/commands/command_utils.c new file mode 100644 index 0000000..39f0ff9 --- /dev/null +++ b/src/commands/command_utils.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* command_utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sede-san argv[0], "cd\0", 3) == 0) + return (cd_builtin(cmd->argc, (char const **)cmd->argv)); + else if (ft_strncmp(cmd->argv[0], "echo\0", 5) == 0) + return (echo_builtin(cmd->argc, (char const **)cmd->argv)); + // else if (ft_strncmp(cmd->argv[0], "env\0", 4) == 0) + // return (env_builtin(cmd->argc, (char const **)cmd->argv, envp)); + // else if (ft_strncmp(cmd->argv[0], "exit\0", 5) == 0) + // return (exit_builtin(cmd->argc, (char const **)cmd->argv)); + else if (ft_strncmp(cmd->argv[0], "export\0", 7) == 0) + return (export_builtin(cmd->argc, (char const **)cmd->argv, envp)); + else if ((ft_strncmp(cmd->argv[0], "env\0", 4) == 0 && cmd->argc == 1) + || ft_strncmp(cmd->argv[0], "printenv\0", 9) == 0) + return (printenv_builtin( + cmd->argc, (char const **)cmd->argv, (char const **)envp)); + else if (ft_strncmp(cmd->argv[0], "pwd\0", 4) == 0) + return (pwd_builtin(cmd->argc, (char const **)cmd->argv)); + else if (ft_strncmp(cmd->argv[0], "unset\0", 6) == 0) + return (unset_builtin(cmd->argc, (char const **)cmd->argv, envp)); + return (1); +} + +int exec_cmd( + t_cmd *cmd, + char **envp) +{ + int exit_code; + pid_t pid; + + exit_code = 0; + pid = fork(); + if (pid == 0) + exit_code = execve(cmd->argv[0], cmd->argv, envp); + waitpid(pid, NULL, 0); + return (exit_code); +} -// } diff --git a/src/commands/parse.c b/src/commands/parse.c index 69480d5..c6c6a26 100644 --- a/src/commands/parse.c +++ b/src/commands/parse.c @@ -6,14 +6,12 @@ /* By: sede-san argv[0], "cd\0", 3) == 0 + || ft_strncmp(cmd->argv[0], "echo\0", 5) == 0 + || (ft_strncmp(cmd->argv[0], "env\0", 4) == 0 && cmd->argc == 1) + || ft_strncmp(cmd->argv[0], "exit\0", 5) == 0 + || ft_strncmp(cmd->argv[0], "export\0", 7) == 0 + || ft_strncmp(cmd->argv[0], "printenv\0", 9) == 0 + || ft_strncmp(cmd->argv[0], "pwd\0", 4) == 0 + || ft_strncmp(cmd->argv[0], "unset\0", 6) == 0); +} diff --git a/src/builtins/cd.c b/src/features/builtins/cd.c similarity index 85% rename from src/builtins/cd.c rename to src/features/builtins/cd.c index 3114e28..277a075 100644 --- a/src/builtins/cd.c +++ b/src/features/builtins/cd.c @@ -6,7 +6,7 @@ /* By: sede-san history_file); + // read_history(minishell->history_file); while (1) { if (line) @@ -113,7 +122,7 @@ static void minishell(t_minishell *minishell, char **envp) if (hostname) { prompt = ft_strjoin_mul(12, - BOLD, BLUE_TEXT, getenv("USER"), "@", hostname, + BOLD, BLUE_TEXT, getenv("USERNAME"), "@", hostname, RESET, ":", BOLD, GREEN_TEXT, getenv("PWD"), RESET, "> "); @@ -126,47 +135,39 @@ static void minishell(t_minishell *minishell, char **envp) } else line = readline("minishell> "); - if (!line && exit_builtin(1, NULL)) - break ; + if (!line) + { + write_history(minishell->history_file); + cmd = parse_cmd("exit", minishell); + exit_code = exit_builtin(cmd.argc, (const char **)cmd.argv); + if (exit_code != -1) + break ; + } if (*line) { add_history(line); - write_history(minishell->history_file); - - t_cmd cmd_parse = parse_cmd(line, minishell); - // exec_cmd(); - - // builtins - if (ft_strncmp("exit\0", line, 5) == 0 && exit_builtin(1, NULL) != -1) - break ; - else if (ft_strncmp("cd\0", line, 3) == 0) - cd_builtin(1, NULL); - else if (ft_strncmp("pwd\0", line, 4) == 0) - pwd_builtin(1, NULL); - else if (ft_strncmp("env\0", line, 4) == 0) - env_builtin(1, NULL); - else if (ft_strncmp("echo\0", line, 5) == 0) - echo_builtin(0, NULL); - // not builtins - else + cmd = parse_cmd(line, minishell); + free(line); + line = NULL; + if (ft_strncmp(cmd.argv[0], "exit\0", 5) == 0) { - // if string does not start with "./" - cmd = ft_strjoin("/usr/bin/", line); - args[0] = line; - args[1] = NULL; - pid = fork(); - if (pid == 0) - { - execve(cmd, args, envp); - exit(0); - } - waitpid(pid, NULL, 0); - free(cmd); + exit_code = exit_builtin(cmd.argc, (const char **)cmd.argv); + write_history(minishell->history_file); + if (exit_code != -1) + break ; } + else if (is_builtin(&cmd)) + exec_builtin(&cmd, minishell->envp); + else + exec_cmd(&cmd, minishell->envp); } } + + write_history(minishell->history_file); rl_clear_history(); - free(line); + if (line) + free(line); + return (exit_code); } /** @@ -188,6 +189,5 @@ static void clear_minishell( ft_bzero(minishell->history_file, ft_strlen(minishell->history_file) * sizeof(char)); free(minishell->history_file); - // ft_free_split(minishell->path); ft_bzero(minishell, sizeof(t_minishell)); } diff --git a/src/utils/signals.c b/src/utils/signals.c new file mode 100644 index 0000000..a0c61b1 --- /dev/null +++ b/src/utils/signals.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* signals.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: sede-san