diff --git a/42sh/Makefile b/42sh/Makefile index c211ff0f..2a2c7a0e 100644 --- a/42sh/Makefile +++ b/42sh/Makefile @@ -29,7 +29,6 @@ INC_DIR = includes/ OBJ_DIR = objs/ SRC_BASE = \ -builtin/bt_cd_process_dotdot.c\ builtin/bt_env_opt.c\ builtin/bt_read_get.c\ builtin/bt_read_term.c\ diff --git a/42sh/includes/exec.h b/42sh/includes/exec.h index 1bf1074b..b14e1d2d 100644 --- a/42sh/includes/exec.h +++ b/42sh/includes/exec.h @@ -140,6 +140,7 @@ struct s_exec }; int exec_reset(void); +int exec_destroy(void); int exec_pushfds(); int exec_popfds(); int process_fork(t_process *p); diff --git a/42sh/libft/src/sys/open_access.c b/42sh/libft/src/sys/open_access.c index 40811fe7..bc1ee88e 100644 --- a/42sh/libft/src/sys/open_access.c +++ b/42sh/libft/src/sys/open_access.c @@ -23,8 +23,6 @@ int open_access(char *file, t_flag a_flag, t_flag o_flag, t_flag o_perm) if (access(file, F_OK) == 0 && access(file, a_flag) != 0) return (-ERR_SET(E_SYS_NOPERM, file)); if ((fd = open(file, o_flag, o_perm)) < 0) - { exit(1); - } return (fd); } diff --git a/42sh/src/builtin/bt_cd_process_dotdot.c b/42sh/src/builtin/bt_cd_process_dotdot.c deleted file mode 100644 index 1d64cd1b..00000000 --- a/42sh/src/builtin/bt_cd_process_dotdot.c +++ /dev/null @@ -1,32 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* bt_cd_process_dotdot.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: ariard +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/03/25 03:54:22 by ariard #+# #+# */ -/* Updated: 2017/03/25 21:19:07 by ariard ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "minishell.h" - -#define CDERR_0 "cd : %s: No such file or directory" -#define CDERR_1 "cd : %s: Permission denied" -#define CDERR_2 "cd : %s: Not a directory" -#define CDERR_3 "cd : unable to proceed: %s" - -int bt_cd_process_dotdot(char *target) -{ - if (access(target, F_OK)) - return (SH_ERR(CDERR_0, target)); - if (access(target, X_OK)) - return (SH_ERR(CDERR_1, target)); - if (!is_directory(target)) - return (SH_ERR(CDERR_2, target)); - if (chdir(target)) - return (SH_ERR(CDERR_3, target)); - setwd("PWD"); - return (0); -} diff --git a/42sh/src/builtin/builtin_cd.c b/42sh/src/builtin/builtin_cd.c index 3a8882dd..af086139 100644 --- a/42sh/src/builtin/builtin_cd.c +++ b/42sh/src/builtin/builtin_cd.c @@ -19,6 +19,10 @@ #define CD_USAGE "usage: cd [-L|-P] [dir]" #define CDERR_0 "cd: too many arguments" #define CDERR_1 "cd %s not set" +#define CDERR_2 "cd : %s: No such file or directory" +#define CDERR_3 "cd : %s: Permission denied" +#define CDERR_4 "cd : %s: Not a directory" +#define CDERR_5 "cd : unable to proceed: %s" static t_cliopts g_cdopts[] = { @@ -27,43 +31,42 @@ static t_cliopts g_cdopts[] = {0, NULL, 0, 0, NULL, 0}, }; -static char *cd_operand_exist(char *arg) +int cd_file_autorisations(char *target, int flag) { - char *target; - - target = NULL; - if (!arg) - { - if (!(target = ft_strdup(ft_getenv(data_singleton()->env, "HOME")))) - SH_ERR(CDERR_1, "HOME"); - } - return (target); + (void)flag; + if (access(target, F_OK)) + return (SH_ERR(CDERR_2, target)); + if (!is_directory(target)) + return (SH_ERR(CDERR_3, target)); + if (access(target, X_OK)) + return (SH_ERR(CDERR_4, target)); + if (chdir(target)) + return (SH_ERR(CDERR_5, target)); + setwd("PWD"); + return (0); } -static char *cd_operand_begin(char *arg) +static char *cd_operand_exist(char *arg) { - char *target; + char *tget; - if (arg && arg[0]) + tget = NULL; + if (!arg) { - if (arg[0] == '/') - target = ft_strdup(arg); - else if (!ft_strncmp(arg, "./", 2) || !ft_strncmp(arg, "../", 3) - || !ft_strcmp(arg, ".") || !ft_strcmp(arg, "..")) - target = ft_str3join(ft_getenv(data_singleton()->env, - "PWD"), "/", arg); - else if (!ft_strcmp(arg, "-")) - { - if (!(target = ft_strdup(ft_getenv(data_singleton()->env, - "OLDPWD")))) - SH_ERR(CDERR_1, "OLDPWD"); - } - else - target = ft_str3join(".", "/", arg); + if (!(tget = ft_strdup(ft_getenv(data_singleton()->env, "HOME")))) + return (SH_ERR(CDERR_1, "HOME") ? NULL : NULL); } else - target = arg; - return (target); + { + if (!ft_strcmp(arg, "-")) + { + if (!(tget = ft_strdup(ft_getenv(data_singleton()->env, "OLDPWD")))) + return (SH_ERR(CDERR_1, "OLDPWD") ? NULL : NULL); + return (tget); + } + return (tget = ft_strdup(arg)); + } + return (tget); } void setwd(char *var) @@ -72,7 +75,7 @@ void setwd(char *var) cwd = getcwd(NULL, 0); builtin_setenv(NULL, (char*[]){"cd", var, cwd, NULL}, NULL); - free(cwd); + ft_strdel(&cwd); } int builtin_cd(const char *path, char *const av[], @@ -86,17 +89,16 @@ int builtin_cd(const char *path, char *const av[], (void)envp; (void)path; data.flag = CD_OPT_L; - ret = 0; if (cliopts_get((char **)av, g_cdopts, &data)) return (1); if (data.av_data[0] && data.av_data[1]) return (SH_ERR(CDERR_0) && SH_ERR(CD_USAGE)); if (!(target = cd_operand_exist(*data.av_data))) - target = cd_operand_begin(*data.av_data); + return (1); oldpwd = getcwd(NULL, 0); - if ((ret = bt_cd_process_dotdot(target))) + if (!(ret = cd_file_autorisations(target, data.flag))) builtin_setenv(NULL, (char*[]){"cd", "OLDPWD", oldpwd, NULL}, NULL); - free(target); - free(oldpwd); + ft_strdel(&target); + ft_strdel(&oldpwd); return (ret); } diff --git a/42sh/src/builtin/builtin_env.c b/42sh/src/builtin/builtin_env.c index f2c6284b..73c3f826 100644 --- a/42sh/src/builtin/builtin_env.c +++ b/42sh/src/builtin/builtin_env.c @@ -25,10 +25,15 @@ static t_cliopts g_env_opts[] = static int bt_env_getcustom(char ***av, t_env_data *data) { + char **split; + if (!av || !*av || !data) return (1); while (**av && ft_strchr(**av, '=')) { + split = ft_strsplit(**av, '='); + bt_env_opt_u(split[0], data); + ft_tabdel(&split); data->custom_env = ft_sstradd(data->custom_env, **av); ++(*av); } diff --git a/42sh/src/exec/exec_reset.c b/42sh/src/exec/exec_reset.c index b9330b38..0e55431e 100644 --- a/42sh/src/exec/exec_reset.c +++ b/42sh/src/exec/exec_reset.c @@ -62,3 +62,19 @@ int exec_reset(void) jobc->current_id = 1; return (0); } + +int exec_destroy(void) +{ + int i; + t_jobc *jobc; + t_exec *exec; + + exec = &data_singleton()->exec; + jobc = &data_singleton()->jobc; + ft_lstdel(&exec->op_stack, ft_lst_cfree); + ft_lstdel(&jobc->first_job, job_free); + i = -1; + while (++i < 10) + ft_lstdel(&exec->fd_save[i], ft_lst_cfree); + return (0); +} diff --git a/42sh/src/exec/process_launch.c b/42sh/src/exec/process_launch.c index ac107417..5a0b711b 100644 --- a/42sh/src/exec/process_launch.c +++ b/42sh/src/exec/process_launch.c @@ -26,6 +26,7 @@ int process_fork(t_process *p) exit(1); process_setgroup(p, 0); process_setsig(); + exec_destroy(); exec_reset(); data_singleton()->opts &= ~SH_INTERACTIVE; data_singleton()->opts &= ~SH_OPTS_JOBC; diff --git a/42sh/src/line_editing/print_del_completion/print_and_del.c b/42sh/src/line_editing/print_del_completion/print_and_del.c index ed0751f1..b52abcd7 100644 --- a/42sh/src/line_editing/print_del_completion/print_and_del.c +++ b/42sh/src/line_editing/print_del_completion/print_and_del.c @@ -89,10 +89,10 @@ int ft_del(char **str, size_t *pos) size_t tmp; tmp = *pos; + if (!(*str && *pos < ft_strlen(*str))) + return (0); if (!(*str = ft_remove_imput(*str, tmp))) return (-1); - if (!(*str && *pos < ft_strlen(*str) + 1)) - return (0); if (*pos) { --(*pos); diff --git a/42sh/src/main/data_exit.c b/42sh/src/main/data_exit.c index 753ea33f..d8911c0f 100644 --- a/42sh/src/main/data_exit.c +++ b/42sh/src/main/data_exit.c @@ -19,13 +19,13 @@ void data_exit(void) data = data_singleton(); ft_strdel(&data->line.input); ft_strdel(&data->binary); - exec_popfds(); + /* exec_popfds(); */ ft_sstrfree(data->env); ft_sstrfree(data->local_var); ft_sstrfree(data->argv); lexer_destroy(&data->lexer); parser_destroy(&data->parser); - ft_lstdel(&data->jobc.first_job, &job_free); + exec_destroy(); ft_lstdel(&data->lst_func, &tree_func_free); ft_save_termios(-1); ft_free_hash_table(); diff --git a/42sh/src/main/shell_init.c b/42sh/src/main/shell_init.c index dc2bd6b8..ec68356f 100644 --- a/42sh/src/main/shell_init.c +++ b/42sh/src/main/shell_init.c @@ -11,7 +11,9 @@ /* ************************************************************************** */ #include "minishell.h" -#define SHELL_USAGE "42sh [-c command | [<]script] [--no-jobcontrol]" +#define SHELL_USAGE1 "usage: 42sh [--no-jobcontrol]" +#define SHELL_USAGE2 " or 42sh -c command" +#define SHELL_USAGE3 " or 42sh script" static t_cliopts g_opts[] = { @@ -87,7 +89,10 @@ int shell_init(int ac, char **av, char **env) if (data_init(ac, av, env) < 0) return (-1); if (cliopts_get(av, g_opts, data)) - return (ft_perror(NULL) && SH_ERR("usage: %s", SHELL_USAGE)); + return (ft_perror(NULL) + && SH_ERR("%s", SHELL_USAGE1) + && SH_ERR("%s", SHELL_USAGE2) + && SH_ERR("%s", SHELL_USAGE3)); if (!isatty(STDIN) || *data->av_data) data->opts &= ~(SH_INTERACTIVE | SH_OPTS_JOBC); if ((data->fd = get_input_fd(data, NULL)) < 0)