diff --git a/Makefile b/Makefile index 6d235b0..6ee72f2 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ endif # Compilator CC = gcc -FLAGS = -Wall -Wextra -Werror -g -fsanitize=address +FLAGS = -Wall -Wextra -Werror # Folders LIBDIR = libft diff --git a/includes/minishell.h b/includes/minishell.h index 41c855a..144f186 100644 --- a/includes/minishell.h +++ b/includes/minishell.h @@ -34,6 +34,7 @@ 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); void *put_error_cd(char *file, char *msg); 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/norm.txt b/norm.txt new file mode 100644 index 0000000..71fa181 --- /dev/null +++ b/norm.txt @@ -0,0 +1,16 @@ +Norme: ./srcs/main.c +Error (line 38): function main has 49 lines +Error (line 38, col 0): main has 6 variables +-- +Norme: ./srcs/cmd_cd.c +Error: 7 functions in the file +Error (line 120): function cmd_cd has 33 lines +-- +Norme: ./srcs/ms_exec.c +Error: 6 functions in the file +Error (line 59): function check_path_dot has 26 lines +Error (line 89): function check_path has 51 lines +Error (line 144): function exec_cmd has 30 lines +-- +Norme: ./srcs/ms_ext.c +Error: 6 functions in the file diff --git a/srcs/cmd_cd.c b/srcs/cmd_cd.c index 5cd0aa3..3374ab4 100644 --- a/srcs/cmd_cd.c +++ b/srcs/cmd_cd.c @@ -12,6 +12,24 @@ #include "minishell.h" +void *put_error_cd(char *file, char *msg) +{ + ft_putstr("cd: "); + ft_putstr(file); + ft_putstr(": "); + ft_putendl(msg); + return (NULL); +} + +int put_error_cd2(char *file, char *msg) +{ + ft_putstr("cd: "); + ft_putstr(file); + ft_putstr(": "); + ft_putendl(msg); + return (1); +} + char *check_path_slash_cd(char *exec) { int i; @@ -24,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")); @@ -43,23 +62,16 @@ int cmd_cd_update_env(char *path, t_env **env, char opt) ft_bzero(p_path, 4096); if (!(pwd = ft_envgetelem("PWD", *env))) - { - put_error_cd(path, "env var PWD undefined"); - return (1); - } + return (put_error_cd2(path, "env var PWD undefined")); if (getcwd(p_path, 4096) == NULL || (oldpwd = ft_strdup(pwd->val)) == NULL || ft_realpath(path, &c_path) == NULL) - { - put_error_cd(path, "error"); - return (1); - } + return (put_error_cd2(path, "error")); if (ft_envupdate("PWD", *env, ((opt == 'P') ? p_path : c_path)) == NULL || ft_envupdate("OLDPWD", *env, oldpwd) == NULL) { - put_error_cd(path, "error"); ft_strdel(&oldpwd); ft_strdel(&c_path); - return (1); + return (put_error_cd2(path, "error")); } ft_strdel(&oldpwd); ft_strdel(&c_path); @@ -106,35 +118,42 @@ char cd_getparams(char **argv, size_t *i) return (ret[0]); } -int cmd_cd(char **argv, t_env **env) +int cmd_cd_switchboard(char **av, t_env **env, char opt, int i) { - t_env *elem; - size_t i; - char *path; - char opt; + t_env *e; + char *p; int ret; - i = 0; - if ((opt = cd_getparams(argv, &i)) == '\0') - return (1); - if (!argv[i] && (elem = ft_envgetelem("HOME", *env)) != NULL && elem->val != NULL) - return (cmd_cd_core(elem->val, env, opt)); - else if (argv[i] && argv[i][0] == '/') - return (cmd_cd_core(argv[i], env, opt)); - else if (argv[i] && argv[i][0] == '-' && (elem = ft_envgetelem("OLDPWD", *env)) != NULL) - return (cmd_cd_core(elem->val, env, opt)); - else if (argv[i] && argv[i][0] != '/' && (elem = ft_envgetelem("PWD", *env)) != NULL && elem->val != NULL) + if ((!av[i] && (e = ft_envgetelem("HOME", *env)) != NULL && e->val + != NULL) || (av[i] && av[i][0] == '-' + && (e = ft_envgetelem("OLDPWD", *env)) != NULL)) + return (cmd_cd_core(e->val, env, opt)); + else if (av[i] && av[i][0] == '/') + return (cmd_cd_core(av[i], env, opt)); + else if (av[i] && av[i][0] != '/' + && (e = ft_envgetelem("PWD", *env)) != NULL && e->val != NULL) { - if ((path = ft_strnew(ft_strlen(elem->val) + ft_strlen(argv[i]) + 1)) == NULL) - put_error_cd(argv[i], "memory error"); - if (path == NULL) + if ((p = ft_strnew(ft_strlen(e->val) + ft_strlen(av[i]) + 1)) == NULL) + put_error_cd(av[i], "memory error"); + if (p == NULL) return (1); - ft_strcpy(path, elem->val); - path[ft_strlen(path)] = '/'; - ft_strcat(path, argv[i]); - ret = cmd_cd_core(path, env, opt); - ft_strdel(&path); + ft_strcpy(p, e->val); + p[ft_strlen(p)] = '/'; + ft_strcat(p, av[i]); + ret = cmd_cd_core(p, env, opt); + ft_strdel(&p); return (ret); } return (1); } + +int cmd_cd(char **argv, t_env **env) +{ + size_t i; + char opt; + + i = 0; + if ((opt = cd_getparams(argv, &i)) == '\0') + return (1); + return (cmd_cd_switchboard(argv, env, opt, i)); +} diff --git a/srcs/main.c b/srcs/main.c index 96d4fe3..d41f6b1 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 */ /* */ /* ************************************************************************** */ @@ -68,55 +68,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 bfeb097..7478f17 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); 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); }