From c51d31b8b751585153500729c25ae2f02d179e45 Mon Sep 17 00:00:00 2001 From: Charles Cabergs Date: Sun, 13 Sep 2020 21:01:18 +0200 Subject: Refactoring eval file structure, Added comment to builtin --- src/eval/cmd.c | 78 ++++++++++++++++------------------------------------------ 1 file changed, 21 insertions(+), 57 deletions(-) (limited to 'src/eval/cmd.c') diff --git a/src/eval/cmd.c b/src/eval/cmd.c index 82e30c9..223725c 100644 --- a/src/eval/cmd.c +++ b/src/eval/cmd.c @@ -6,7 +6,7 @@ /* By: charles +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/06/14 10:41:31 by charles #+# #+# */ -/* Updated: 2020/09/13 14:19:37 by charles ### ########.fr */ +/* Updated: 2020/09/13 21:00:38 by charles ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,68 +17,16 @@ int g_last_status = 0; void token_debug(void *v); -/* -** \brief Wrap a function in a fork -** \param fd_in fork input file descriptor -** \param fd_out fork output file descriptor -** \param passed param of the wrapped function -** \param wrapped function to wrap -*/ - -int fork_wrap( - int fds[2], - void *passed, - int (*wrapped)(void *param), - pid_t *child_pid -) -{ - int status; - bool waiting; - pid_t pid; - - waiting = child_pid == NULL; - if (waiting) - child_pid = &pid; - if ((*child_pid = fork()) == -1) - return (EVAL_FATAL); - if (*child_pid == 0) - { - if ((fds[FD_READ] != FD_NONE && dup2(fds[FD_READ], STDIN_FILENO) == -1) || - (fds[FD_WRITE] != FD_NONE && dup2(fds[FD_WRITE], STDOUT_FILENO) == -1)) - exit(EXIT_FAILURE); - if ((status = wrapped(passed)) == EVAL_FATAL) // FIXME detect fatal in child (pipe ?) - exit(EXIT_FAILURE); - exit(status); - } - g_child_pid = *child_pid; - if (waiting) - { - waitpid(*child_pid, child_pid, 0); - close(fds[FD_WRITE]); - /* close(fds[FD_READ]); */ - return (WEXITSTATUS(*child_pid)); - } - return (0); -} - -int forked_cmd(void *void_param) +int wrapped_cmd(void *void_param) { t_fork_param_cmd *param; int status; - struct stat statbuf; param = void_param; if (param->builtin != NULL) return (param->builtin->func(param->argv, param->env)); else { - if (stat(param->exec_path, &statbuf) == -1) - return (errorf_ret(126, "%s: %s\n", param->exec_path, strerror(errno))); - if (S_ISDIR(statbuf.st_mode)) - return (errorf_ret(126, "%s: Is a directory\n", param->exec_path)); - if (!(statbuf.st_mode & 0444)) - return (errorf_ret(126, "%s: %s\n", param->exec_path, strerror(EACCES))); - errno = 0; status = execve(param->exec_path, param->argv, (char**)param->env->data); if (status == -1) { @@ -90,6 +38,19 @@ int forked_cmd(void *void_param) } } +int check_exec_path(char *exec_path) +{ + struct stat statbuf; + + if (stat(exec_path, &statbuf) == -1) + return (errorf_ret(126, "%s: %s\n", exec_path, strerror(errno))); + if (S_ISDIR(statbuf.st_mode)) + return (errorf_ret(126, "%s: Is a directory\n", exec_path)); + if (!(statbuf.st_mode & 0444)) + return (errorf_ret(126, "%s: %s\n", exec_path, strerror(EACCES))); + return (0); +} + int eval_cmd(int fds[2], t_env env, t_path path, t_ast *ast, pid_t *child_pid) { t_fork_param_cmd param; @@ -108,6 +69,9 @@ int eval_cmd(int fds[2], t_env env, t_path path, t_ast *ast, pid_t *child_pid) if (argv[0] == NULL) return (0); param.builtin = builtin_search_func(argv[0]); + if (param.builtin != NULL && !param.builtin->forked && child_pid == NULL) + return (param.builtin->func(argv, env)); + if (param.builtin == NULL) { param.exec_path = exec_search_path(path, env_search(env, "PATH"), argv[0]); @@ -117,13 +81,13 @@ int eval_cmd(int fds[2], t_env env, t_path path, t_ast *ast, pid_t *child_pid) ft_split_destroy(argv); return (127); } + if ((status = check_exec_path(param.exec_path)) != 0) + return (status); } - else if (!param.builtin->forked && child_pid == NULL) - return (param.builtin->func(argv, env)); param.argv = argv; param.env = env; - status = fork_wrap(fds, ¶m, &forked_cmd, child_pid); + status = fork_wrap(fds, ¶m, &wrapped_cmd, child_pid); ft_split_destroy(argv); g_last_status = status; return (status); -- cgit