/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* exec.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2018/11/27 15:32:29 by tmaze #+# #+# */ /* Updated: 2019/01/15 15:11:22 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" #define S_BIN 5 char **envlsttotab(t_list *env) { size_t i; size_t env_size; t_list *tmp; char **ret; i = 0; tmp = env; env_size = ft_lstsize(env); if ((ret = (char**)ft_memalloc(sizeof(char*) * (env_size + 1))) == NULL) return (NULL); while (i <= env_size) ret[i++] = NULL; i = 0; while (tmp) { if ((ret[i] = ft_strnew(ft_strlen(((t_envelem*)(tmp->content))->key) + ft_strlen(((t_envelem*)(tmp->content))->val) + 1)) == NULL) { ft_del_words_tables(&ret); return (NULL); } i++; tmp = tmp->next; } return (ret); } /* ** , {"setenv", &cmd_senv}, {"unsetenv", &cmd_senv}, {"env", &cmd_env}}; */ int exec_cmd(char **argv, t_list **env) { int ret; char **env_tab; size_t i; static t_builtin builtins[S_BIN] = {{"echo", &cmd_echo}, {"cd", &cmd_cd}, {"setenv", &cmd_setenv}, {"env", &cmd_env}, {"unsetenv", &cmd_unsetenv}}; i = 0; while (i < S_BIN) if (ft_strcmp(argv[0], builtins[i++].cmd) == 0) return ((*(builtins[i - 1].f))(argv, env)); if ((ret = access(argv[0], X_OK)) == -1) ft_putendl("minishell: file not found or not executable"); if (ret == -1 || (env_tab = envlsttotab(*env)) == NULL) return (-1); if ((ret = fork()) == 0) { execve(argv[0], argv, env_tab); ft_putendl_fd("minishell: error", 2); ft_del_words_tables(&env_tab); exit(-1); } else if (ret == -1) ft_putendl_fd("minishell: error", 2); if (ret == -1) return (-1); waitpid(ret, NULL, 0); ft_del_words_tables(&env_tab); return (0); }