From fdd37da7d0e1d36b8b692a31be98843a8208ebb7 Mon Sep 17 00:00:00 2001 From: Tanguy MAZE Date: Sat, 25 Jan 2020 17:27:02 +0100 Subject: [PATCH] Normed out funtions sorting out needed --- includes/minishell.h | 3 +- libft/Makefile | 2 +- srcs/cmd_cd.c | 14 +++--- srcs/main.c | 62 +++++++++++++------------- srcs/ms_exec.c | 103 +++++++++++++++++++++++-------------------- srcs/ms_ext.c | 17 ++++--- 6 files changed, 102 insertions(+), 99 deletions(-) diff --git a/includes/minishell.h b/includes/minishell.h index 60a31b7..1f65312 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/11/18 13:12:34 by tmaze #+# #+# */ -/* Updated: 2019/12/06 09:54:47 by tmaze ### ########.fr */ +/* Updated: 2020/01/25 15:06:00 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -34,5 +34,6 @@ int cmd_echo(char **argv, t_env **env); char **res_ext(char **argv, t_env *env); int exec_cmd(char **argv, t_env **env); +void *ft_strdel_null(char **s); #endif diff --git a/libft/Makefile b/libft/Makefile index 6957aea..551776b 100644 --- a/libft/Makefile +++ b/libft/Makefile @@ -6,7 +6,7 @@ # By: tmaze +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2018/04/07 12:47:06 by tmaze #+# #+# # -# Updated: 2019/12/06 09:59:05 by tmaze ### ########.fr # +# Updated: 2020/01/25 16:24:08 by tmaze ### ########.fr # # # #******************************************************************************# diff --git a/srcs/cmd_cd.c b/srcs/cmd_cd.c index 2443392..b5ef4d5 100644 --- a/srcs/cmd_cd.c +++ b/srcs/cmd_cd.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/01/07 16:44:40 by tmaze #+# #+# */ -/* Updated: 2020/01/25 14:28:22 by tmaze ### ########.fr */ +/* Updated: 2020/01/25 17:00:23 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -42,8 +42,9 @@ char *check_path_slash_cd(char *exec) return (put_error_cd(exec, "no such file or directory")); if ((i = lstat(exec, &info)) != 0) return (put_error_cd(exec, "can't determine info")); - if (!S_ISDIR(info.st_mode) || (S_ISLNK(info.st_mode) - && ((i = stat(exec, &info2)) != 0 || !S_ISDIR(info2.st_mode)))) + if ((S_ISLNK(info.st_mode) + && ((i = stat(exec, &info2)) != 0 || !S_ISDIR(info2.st_mode))) + && !S_ISDIR(info.st_mode)) return (put_error_cd(exec, "not a directory")); if ((i = access(exec, X_OK)) != 0) return (put_error_cd(exec, "permission denied")); @@ -117,7 +118,7 @@ char cd_getparams(char **argv, size_t *i) return (ret[0]); } -int cmd_cd_switchboard(char **av, t_env **env, char opt) +int cmd_cd_switchboard(char **av, t_env **env, char opt, int i) { t_env *e; char *p; @@ -148,14 +149,11 @@ int cmd_cd_switchboard(char **av, t_env **env, char opt) int cmd_cd(char **argv, t_env **env) { - t_env *elem; size_t i; - char *path; char opt; - int ret; i = 0; if ((opt = cd_getparams(argv, &i)) == '\0') return (1); - return (cmd_cd_switchboard(argv, env, opt)); + return (cmd_cd_switchboard(argv, env, opt, i)); } diff --git a/srcs/main.c b/srcs/main.c index 0e77905..c7a6050 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/09/19 17:08:46 by tmaze #+# #+# */ -/* Updated: 2020/01/24 00:24:19 by tmaze ### ########.fr */ +/* Updated: 2020/01/25 16:23:50 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -35,55 +35,55 @@ t_env *env2lst(char **env) return (ret); } -int main(void) +void check_exec(char **argv, t_env *env) { - extern char **environ; + int i; static t_builtin built[S_BIN] = {{"env", &cmd_env}, {"cd", &cmd_cd} , {"setenv", &cmd_setenv}, {"echo", &cmd_echo} , {"unsetenv", &cmd_unsetenv}}; - char **argv; - t_env *env; - char *cmd; - int i; - env = NULL; + i = -1; + while (++i < S_BIN) + if (ft_strequ(argv[0], built[i].cmd)) + { + built[i].f(argv, &env); + break ; + } + if (i == S_BIN) + exec_cmd(argv, &env); +} + +int cleanup(char **argv, t_env *env) +{ + ft_del_words_tables(&argv); + ft_envdel(&env); + return (0); +} + +int main(void) +{ + extern char **environ; + char **argv; + t_env *env; + char *cmd; + if ((env = env2lst(environ)) == NULL) return (2); while (1) { - cmd = NULL; ft_printf("%s$>%s ", FT_COLOR_GREEN, FT_RESET); if (ft_getline(&cmd) >= 0 && cmd != NULL - && (argv = ft_strsplit(cmd, ' ')) != NULL) + && (argv = ft_strsplit(cmd, ' ')) != NULL && !ft_strdel_null(&cmd)) { - ft_strdel(&cmd); if ((res_ext(argv, env)) != NULL) { if (ft_strequ(argv[0], "exit")) - { - ft_del_words_tables(&argv); - ft_envdel(&env); - return (0); - } - i = 0; - while (i < S_BIN) - { - if (ft_strequ(argv[0], built[i].cmd)) - { - built[i].f(argv, &env); - break ; - } - i++; - } - if (i == S_BIN) - exec_cmd(argv, &env); + return (cleanup(argv, env)); + check_exec(argv, env); } } ft_strdel(&cmd); ft_del_words_tables(&argv); } - ft_del_words_tables(&argv); - ft_strdel(&cmd); - ft_envdel(&env); return (0); } diff --git a/srcs/ms_exec.c b/srcs/ms_exec.c index a3cede5..3e57f6e 100644 --- a/srcs/ms_exec.c +++ b/srcs/ms_exec.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/09/26 16:25:00 by tmaze #+# #+# */ -/* Updated: 2019/11/10 15:52:54 by tmaze ### ########.fr */ +/* Updated: 2020/01/25 16:46:29 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,12 +23,13 @@ int ft_isin(char *str, char c) return (-1); } -void put_error(char *file, char *msg) +void *put_error(char *file, char *msg) { ft_putstr("minishell: "); ft_putstr(file); ft_putstr(": "); ft_putendl(msg); + return (NULL); } char *check_path_slash(char *exec) @@ -64,10 +65,7 @@ char *check_path_dot(char *exec, t_env *env) if ((path = ft_envgetelem("PWD", env)) == NULL || path->val == NULL || (tmp = ft_strjoin(path->val, "/")) == NULL) - { - put_error(exec, "memory error"); - return (NULL); - } + return (put_error(exec, "memory error")); if ((ret = ft_strjoin(tmp, exec)) == NULL) put_error(exec, "memory error"); ft_strdel(&tmp); @@ -77,21 +75,52 @@ char *check_path_dot(char *exec, t_env *env) { if (access(ret, X_OK) == 0) return (exec); - put_error(exec, "permission denied"); ft_strdel(&ret); - return (NULL); + return (put_error(exec, "permission denied")); } - put_error(exec, "no such file or directory"); ft_strdel(&ret); + return (put_error(exec, "no such file or directory")); +} + +void *ft_strdel_null(char **s) +{ + ft_strdel(s); return (NULL); } +char *check_path_elems(char **path_elems, char *exec) +{ + int i; + char *tmp; + char *ret; + + i = -1; + while (path_elems[++i]) + { + if ((tmp = ft_strjoin(path_elems[i], "/")) == NULL + && !put_error(exec, "memory error")) + break ; + if ((ret = ft_strjoin(tmp, exec)) == NULL + && !put_error(exec, "memory error") && !ft_strdel_null(&tmp)) + break ; + if (!ft_strdel_null(&tmp) && access(ret, F_OK) == 0) + { + if (access(ret, X_OK) == 0) + break ; + ft_strdel(&ret); + ft_del_words_tables(&path_elems); + return (put_error(exec, "permission denied")); + } + ft_strdel(&ret); + } + return (ret); +} + char *check_path(char *exec, t_env *env) { size_t i; t_env *path; char **path_elems; - char *tmp; char *ret; ret = NULL; @@ -104,36 +133,10 @@ char *check_path(char *exec, t_env *env) if ((path = ft_envgetelem("PATH", env)) == NULL || path->val == NULL || (path_elems = ft_strsplit(path->val, ':')) == NULL) - { - put_error(exec, "could not resolve path"); - return (NULL); - } + return (put_error(exec, "could not resolve path")); i = 0; - while (path_elems[i]) - { - if ((tmp = ft_strjoin(path_elems[i], "/")) == NULL) - put_error(exec, "memory error"); - if (tmp == NULL) - break ; - if ((ret = ft_strjoin(tmp, exec)) == NULL) - { - put_error(exec, "memory error"); - ft_strdel(&tmp); - break ; - } - ft_strdel(&tmp); - if (access(ret, F_OK) == 0) - { - if (access(ret, X_OK) == 0) - break ; - put_error(exec, "permission denied"); - ft_strdel(&ret); - ft_del_words_tables(&path_elems); - return (NULL); - } - ft_strdel(&ret); - i++; - } + if ((ret = check_path_elems(path_elems, exec)) == NULL) + return (NULL); if (path_elems[i] == NULL) put_error(exec, "command not found"); ft_del_words_tables(&path_elems); @@ -141,6 +144,17 @@ char *check_path(char *exec, t_env *env) return (ret); } +void exec_cmd_child(char *path, char **argv, char **env_tab, t_env **env) +{ + execve(path, argv, env_tab); + ft_putendl_fd("minishell: error", 1); + if (ft_strcmp(path, argv[0]) != 0) + ft_strdel(&path); + ft_del_words_tables(&env_tab); + ft_envdel(env); + exit(-1); +} + int exec_cmd(char **argv, t_env **env) { int ret; @@ -151,19 +165,10 @@ int exec_cmd(char **argv, t_env **env) return (-1); if ((path = check_path(argv[0], *env)) == NULL) ft_del_words_tables(&env_tab); - ft_printf("path after resolve: %s\n", path); if (path == NULL) return (-1); if ((ret = fork()) == 0) - { - execve(path, argv, env_tab); - ft_putendl_fd("minishell: error", 1); - if (ft_strcmp(path, argv[0]) != 0) - ft_strdel(&path); - ft_del_words_tables(&env_tab); - ft_envdel(env); - exit(-1); - } + exec_cmd_child(path, argv, env_tab, env); else if (ret == -1) ft_putendl_fd("minishell: error", 1); if (ret == -1) diff --git a/srcs/ms_ext.c b/srcs/ms_ext.c index d9fdcbb..cca3f20 100644 --- a/srcs/ms_ext.c +++ b/srcs/ms_ext.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/10/25 18:21:47 by tmaze #+# #+# */ -/* Updated: 2020/01/24 00:23:59 by tmaze ### ########.fr */ +/* Updated: 2020/01/25 16:53:59 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -61,7 +61,7 @@ char *replace_env(char *src, t_env *elem, int key_size, int i) { ft_strlcpy(ret, src, i + 1); ft_strlcat(ret, elem->val, res_len + 1); - ft_strlcat(ret, src + 1 + key_size, res_len + 1); + ft_strlcat(ret, src + key_size, res_len + 1); } else ft_printf("minishell: memory error\n"); @@ -94,21 +94,20 @@ char **res_ext(char **av, t_env *env) t_env *tmp; char *ret; - i[0] = 0; - while (av && av[i[0]] && !(i[1] = 0)) + i[0] = -1; + while (av && av[++i[0]] && !(i[1] = 0)) { - while (av[i[0]] && av[i[0]][i[1]]) + while (av[i[0]][i[1]]) { - if (av[i[0]][i[1]] == '~' && (tmp = ft_envgetelem("HOME", env)) + if (av[i[0]][i[1]] != '$' && av[i[0]][i[1]] != '~') + i[1]++; + else if (av[i[0]][i[1]] == '~' && (tmp = ft_envgetelem("HOME", env)) != NULL && (ret = replace_env(av[i[0]], tmp, 1, i[1])) != NULL) ft_strreplace(&av[i[0]], ret, &i[1], tmp); else if (av[i[0]][i[1]] == '$' && resolve_complete_key(&av[i[0]], &i[1], env) == NULL) return (NULL); - else if (av[i[0]][i[1]] != '$' && av[i[0]][i[1]] != '~') - i[1]++; } - i[0]++; } return (av); }