From: Christopher Uhlig Date: Mon, 13 Jan 2025 12:30:32 +0000 (+0100) Subject: running version but with comments X-Git-Url: https://git.dkaiser.de/?a=commitdiff_plain;h=8c37f835ba29bcecc1d779edb396d97b18667026;p=42%2Fminishell.git running version but with comments --- diff --git a/src/collect_redirs.c b/src/collect_redirs.c index be0e00f..4b7b955 100644 --- a/src/collect_redirs.c +++ b/src/collect_redirs.c @@ -6,14 +6,50 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/08/02 13:49:31 by dkaiser #+# #+# */ -/* Updated: 2025/01/13 09:52:00 by chuhlig ### ########.fr */ +/* Updated: 2025/01/11 11:43:13 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" +// static t_token *collect_redir(t_token **tokens, t_redirection *result, +// t_token *cur); +// static void collect_and_check_redir(t_token **tokens, t_redirection *result, +// t_token **cur); static void collect_and_check_redir(t_redirection *result, t_token **cur); static void set_redir(t_redirection *redir, int type, char *specifier); +// static int is_output_redir(int i); + +// static char *read_heredoc(char *delimiter) +// { +// char *line; +// char *result; +// size_t len; + +// result = NULL; +// while (1) +// { +// line = readline("> "); +// if (!line || ft_strcmp(line, delimiter) == 0) +// { +// free(line); +// break ; +// } +// if (result) +// len = ft_strlen(result); +// else +// len = 0; +// result = realloc(result, len + ft_strlen(line) + 2); +// if (!result) +// return (NULL); +// ft_strcpy(result + len, line); +// strcat(result, "\n"); +// free(line); +// } +// return (result); +// } + +//v2.0 static char *read_heredoc(char *delimiter) { @@ -73,7 +109,7 @@ t_redirection *collect_redirs(t_token **tokens) while (cur != NULL && cur->next != NULL) { if (cur->type == REDIR_TOKEN && cur->next->type == STRING_TOKEN) - collect_and_check_redir(result, &cur); + collect_and_check_redir(result, &cur);// her is diff else if (cur->type == REDIR_TOKEN) return (free(result), NULL); else @@ -84,12 +120,62 @@ t_redirection *collect_redirs(t_token **tokens) return (result); } +// static void collect_and_check_redir(t_token **tokens, t_redirection *result, +// t_token **cur) +// { +// int is_redir_only; + +// is_redir_only = 0; +// if ((*cur)->previous == NULL && (*cur)->next->next == NULL) +// is_redir_only = 1; +// *cur = collect_redir(tokens, result, *cur); +// if (is_redir_only) +// *tokens = NULL; +// } + +// static t_token *collect_redir(t_token **tokens, t_redirection *result, +// t_token *cur) +// { +// set_redir(&result[is_output_redir(cur->content.redir_type)], +// cur->content.redir_type, cur->next->content.string); +// cur = cur->next; +// free_token_and_connect(cur->previous); +// if (cur->next != NULL) +// { +// if (cur->previous == NULL) +// *tokens = cur->next; +// cur = cur->next; +// free_token_and_connect(cur->previous); +// } +// else +// { +// free_token(cur); +// return (NULL); +// } +// return (cur); +// } + static void set_redir(t_redirection *redir, int type, char *specifier) { redir->type = type; redir->specifier = specifier; } +// static int is_output_redir(int i) +// { +// if (i & (INPUT_FILE | INPUT_LIMITER)) +// return (0); +// else if (i & (OUTPUT_APPEND | OUTPUT_OVERRIDE)) +// return (1); +// else +// { +// panic(UNREACHABLE); +// return (-1); +// } +// } + +//2.0 + static void collect_and_check_redir(t_redirection *result, t_token **cur) { char *heredoc_data; @@ -98,6 +184,7 @@ static void collect_and_check_redir(t_redirection *result, t_token **cur) heredoc_data = NULL; if ((*cur)->content.redir_type == INPUT_LIMITER) { + // Handle Here Document (<<) heredoc_data = read_heredoc((*cur)->next->content.string); if (!heredoc_data) { @@ -107,20 +194,35 @@ static void collect_and_check_redir(t_redirection *result, t_token **cur) set_redir(&result[0], INPUT_LIMITER, heredoc_data); } else if ((*cur)->content.redir_type == INPUT_FILE) + { + // Handle Input File (<) set_redir(&result[0], INPUT_FILE, ft_strdup((*cur)->next->content.string)); + } else if ((*cur)->content.redir_type == OUTPUT_OVERRIDE) + { + // Handle Output File Overwrite (>) set_redir(&result[1], OUTPUT_OVERRIDE, ft_strdup((*cur)->next->content.string)); + } else if ((*cur)->content.redir_type == OUTPUT_APPEND) + { + // Handle Output File Append (>>) set_redir(&result[1], OUTPUT_APPEND, ft_strdup((*cur)->next->content.string)); + } else + { + // Handle unexpected cases printf("Unknown redirection type encountered\n"); + } + // Advance the token pointer to skip the redirection token and its argument next_token = (*cur)->next; - free_token_and_connect(*cur); + free_token_and_connect(*cur); // Free the current redirection token if (next_token) { - *cur = next_token->next; - free_token_and_connect(next_token); + *cur = next_token->next; // Move to the next token after the argument + free_token_and_connect(next_token); // Free the argument token } else - *cur = NULL; -} + { + *cur = NULL; // No more tokens + } +} \ No newline at end of file diff --git a/src/execute_cmd.c b/src/execute_cmd.c index 803d88f..7f93c5a 100644 --- a/src/execute_cmd.c +++ b/src/execute_cmd.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/17 19:21:35 by chuhlig #+# #+# */ -/* Updated: 2025/01/13 09:50:56 by chuhlig ### ########.fr */ +/* Updated: 2025/01/09 16:07:01 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,60 +18,69 @@ #include #include -int execute_cmd(t_cmd *cmd, t_env **env) -{ - char *cmd_path; - pid_t pid; - int status; - int result; - int original_stdout; - int original_stdin; +// static void format_args(char **args, t_env *env); - original_stdout = dup(STDOUT_FILENO); - original_stdin = dup(STDIN_FILENO); - if (handle_redirections(cmd->redirs) == -1) - { - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); - return (EXIT_FAILURE); - } - if (is_builtin(cmd->args[0])) - { - result = execute_builtin(cmd->args, env); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); - return (result); - } - pid = fork(); - if (pid == -1) - { - perror("fork"); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); - return (EXIT_FAILURE); - } - if (pid == 0) - { - cmd_path = get_cmd_path(cmd->args[0], *env); - if (!cmd_path) - { - printf("%s: command not found\n", cmd->args[0]); - exit(EXIT_FAILURE); - } - execve(cmd_path, cmd->args, env_to_strlst(*env)); - perror("execve"); - exit(EXIT_FAILURE); - } - waitpid(pid, &status, 0); - dup2(original_stdout, STDOUT_FILENO); - dup2(original_stdin, STDIN_FILENO); - close(original_stdout); - close(original_stdin); - return (WEXITSTATUS(status)); -} \ No newline at end of file +// int execute_cmd(t_cmd *cmd, t_env **env) +// { +// int result; +// char *cmd_path; +// int fd; + +// if (ft_strncmp(cmd->args[0], "pwd", 4) == 0) +// return (pwd(*env)); +// else if (ft_strncmp(cmd->args[0], "echo", 5) == 0) +// return (echo(cmd->args)); +// else if (ft_strncmp(cmd->args[0], "env", 4) == 0) +// return (ft_env(*env)); +// else if (ft_strncmp(cmd->args[0], "cd", 3) == 0) +// return (cd(env, cmd->args)); +// else if (ft_strncmp(cmd->args[0], "unset", 6) == 0) +// return (unset(cmd->args, env)); +// else if (ft_strncmp(cmd->args[0], "export", 7) == 0) +// return (export(cmd->args, env)); +// format_args(cmd->args, *env); +// cmd_path = get_cmd_path(cmd->args[0], *env); +// cmd->args[0] = cmd_path; +// if (cmd->redirs[0].type == INPUT_FILE) +// { +// fd = open(cmd->redirs[0].specifier, O_RDONLY); +// if (fd < 0) +// return (EXIT_FAILURE); +// dup2(fd, STDIN_FILENO); +// } +// else if (cmd->redirs[0].type == INPUT_LIMITER) +// { +// dbg("INPUT_LIMITER"); +// } +// if (cmd->redirs[1].type == OUTPUT_APPEND) +// { +// dbg("OUTPUT_APPEND"); +// fd = open(cmd->redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 644); +// if (fd < 0) +// return (EXIT_FAILURE); +// dup2(fd, STDOUT_FILENO); +// } +// else if (cmd->redirs[1].type == OUTPUT_OVERRIDE) +// { +// fd = open(cmd->redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 644); +// if (fd < 0) +// return (EXIT_FAILURE); +// dup2(fd, STDOUT_FILENO); +// dbg("OUTPUT_OVERRIDE"); +// } +// result = execve(cmd->args[0], cmd->args, env_to_strlst(*env)); +// return (result); +// } + +// static void format_args(char **args, t_env *env) +// { +// char *formatted; + +// while (*args != NULL) +// { +// formatted = format_string(*args, env); +// /* free(*args); */ +// *args = formatted; +// args++; +// } +// } \ No newline at end of file diff --git a/src/interpreter.c b/src/interpreter.c index 7b0306f..33d945c 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -6,7 +6,7 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/12/17 19:15:49 by chuhlig #+# #+# */ -/* Updated: 2025/01/13 09:53:33 by chuhlig ### ########.fr */ +/* Updated: 2025/01/11 12:52:57 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ @@ -20,6 +20,125 @@ #include #include + +// static int eval_rec(t_node *node, t_env **env, int in_fd); + +// int eval(t_node *node, t_env **env) +// { +// pid_t pid; +// int result; + +// if (node == NULL) +// return (EXIT_FAILURE); +// result = 0; +// pid = fork(); +// if (pid < 0) +// { +// return (EXIT_FAILURE); +// } +// if (pid == 0) +// { +// result = eval_rec(node, env, STDIN_FILENO); +// exit(result); +// } +// else +// { +// waitpid(pid, &result, 0); +// } +// return (result); +// } + +// static int eval_rec(t_node *node, t_env **env, int in_fd) +// { +// pid_t pid; +// int result; +// int p[2]; + +// result = pipe(p); +// if (result == -1) +// return (EXIT_FAILURE); +// if (node->type == PIPE_NODE) +// { +// pid = fork(); +// if (pid < 0) +// { +// return (EXIT_FAILURE); +// } +// if (pid == 0) +// { +// close(p[0]); +// dup2(in_fd, STDIN_FILENO); +// dup2(p[1], STDOUT_FILENO); +// result = execute_cmd(&node->content.pipe.left->content.cmd, env); +// exit(result); +// } +// else +// { +// close(p[1]); +// dup2(p[0], STDIN_FILENO); +// result = eval_rec(node->content.pipe.right, env, p[0]); +// } +// } +// else if (node->type == CMD_NODE) +// { +// result = execute_cmd(&node->content.cmd, env); +// } +// else +// { +// panic(UNREACHABLE); +// return (EXIT_FAILURE); +// } +// return (result); +// } + + +//old interpreter +// #include "minishell.h" +// #include + +// static int eval_pipe(t_pipe *pipe, t_env *env); +// static int eval_cmd(t_cmd *cmd, t_env **env); + +// int eval(t_node *node, t_env **env) +// { +// if (node->type == PIPE_NODE) +// return (eval_pipe(&node->content.pipe, *env)); +// else if (node->type == CMD_NODE) +// return (eval_cmd(&node->content.cmd, env)); +// else +// { +// panic(UNREACHABLE); +// return (-1); +// } +// } + +// static int eval_pipe(t_pipe *pipe, t_env *env) +// { +// dbg("TODO: PIPE"); +// eval_cmd(&pipe->left->content.cmd, &env); +// eval_cmd(&pipe->right->content.cmd, &env); +// return (0); +// } + +// static int eval_cmd(t_cmd *cmd, t_env **env) +// { +// if (ft_strncmp(cmd->args[0], "pwd", 4) == 0) +// pwd(*env); +// else if (ft_strncmp(cmd->args[0], "echo", 5) == 0) +// echo(cmd->args); +// else if (ft_strncmp(cmd->args[0], "env", 4) == 0) +// ft_env(*env); +// else if (ft_strncmp(cmd->args[0], "cd", 3) == 0) +// cd(env, cmd->args); +// else if (ft_strncmp(cmd->args[0], "unset", 6) == 0) +// unset(cmd->args, env); +// else if (ft_strncmp(cmd->args[0], "export", 7) == 0) +// export(cmd->args, env); +// return (0); +// } + +//v2.0 + int is_builtin(char *cmd) { return ((ft_strcmp(cmd, "export") == 0) @@ -49,65 +168,162 @@ int execute_builtin(char **args, t_env **env) return (ft_env(*env)); return (1); } +// v1.0 + +// static int handle_redirections(t_redirection *redirs) +// { +// int fd; +// int pipe_fds[2]; +// if (redirs[0].type == INPUT_LIMITER) +// { +// if (pipe(pipe_fds) == -1) +// { +// perror("pipe"); +// return (-1); +// } +// write(pipe_fds[1], redirs[0].specifier, strlen(redirs[0].specifier)); +// close(pipe_fds[1]); +// dup2(pipe_fds[0], STDIN_FILENO); +// close(pipe_fds[0]); +// } +// else if (redirs[0].type == INPUT_FILE) +// { +// fd = open(redirs[0].specifier, O_RDONLY); +// if (fd == -1) +// { +// perror(redirs[0].specifier); +// return (-1); +// } +// dup2(fd, STDIN_FILENO); +// close(fd); +// } +// if (redirs[1].type == OUTPUT_OVERRIDE) +// { +// fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644); +// if (fd == -1) +// { +// perror(redirs[1].specifier); +// return (-1); +// } +// dup2(fd, STDOUT_FILENO); +// close(fd); +// } +// else if (redirs[1].type == OUTPUT_APPEND) +// { +// fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644); +// if (fd == -1) +// { +// perror(redirs[1].specifier); +// return (-1); +// } +// dup2(fd, STDOUT_FILENO); +// close(fd); +// } +// return (0); +// } +//v 3.0 static int handle_redirections(t_redirection *redirs) { - int fd; + int fd; - if (redirs[0].type == INPUT_FILE) - { - fd = open(redirs[0].specifier, O_RDONLY); - if (fd < 0) - { - perror("open"); - return (-1); - } - dup2(fd, STDIN_FILENO); - close(fd); - } - else if (redirs[0].type == INPUT_LIMITER) - { - fd = open("/tmp/heredoc_tmp", O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) - { - perror("open"); - return (-1); - } - write(fd, redirs[0].specifier, ft_strlen(redirs[0].specifier)); - close(fd); - fd = open("/tmp/heredoc_tmp", O_RDONLY); - if (fd < 0) - { - perror("open"); - return (-1); - } - dup2(fd, STDIN_FILENO); - close(fd); - } - if (redirs[1].type == OUTPUT_OVERRIDE) - { - fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644); - if (fd < 0) - { - perror("open"); - return (-1); - } - dup2(fd, STDOUT_FILENO); - close(fd); - } - else if (redirs[1].type == OUTPUT_APPEND) - { - fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644); - if (fd < 0) - { - perror("open"); - return (-1); - } - dup2(fd, STDOUT_FILENO); - close(fd); - } - return (0); - } + if (redirs[0].type == INPUT_FILE) + { + fd = open(redirs[0].specifier, O_RDONLY); + if (fd < 0) + { + perror("open"); + return (-1); + } + dup2(fd, STDIN_FILENO); + close(fd); + } + else if (redirs[0].type == INPUT_LIMITER) + { + // Handle here document (<<) + // Assuming heredoc_data is stored in redirs[0].specifier + fd = open("/tmp/heredoc_tmp", O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + { + perror("open"); + return (-1); + } + write(fd, redirs[0].specifier, strlen(redirs[0].specifier)); + close(fd); + fd = open("/tmp/heredoc_tmp", O_RDONLY); + if (fd < 0) + { + perror("open"); + return (-1); + } + dup2(fd, STDIN_FILENO); + close(fd); + } + if (redirs[1].type == OUTPUT_OVERRIDE) + { + fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd < 0) + { + perror("open"); + return (-1); + } + dup2(fd, STDOUT_FILENO); + close(fd); + } + else if (redirs[1].type == OUTPUT_APPEND) + { + fd = open(redirs[1].specifier, O_WRONLY | O_CREAT | O_APPEND, 0644); + if (fd < 0) + { + perror("open"); + return (-1); + } + dup2(fd, STDOUT_FILENO); + close(fd); + } + return (0); +} +//v 2.0 +// static int eval_rec(t_node *node, t_env **env, int in_fd) +// { +// pid_t pid; +// int p[2]; +// int result; +// int status; + +// if (node->type == PIPE_NODE) +// { +// pipe(p); +// pid = fork(); +// if (pid == 0) +// { +// close(p[0]); +// dup2(in_fd, STDIN_FILENO); +// dup2(p[1], STDOUT_FILENO); +// result = eval_rec(node->content.pipe.left, env, in_fd); +// exit(result); +// } +// else +// { +// close(p[1]); +// dup2(p[0], STDIN_FILENO); +// result = eval_rec(node->content.pipe.right, env, p[0]); +// waitpid(pid, &status, 0); +// } +// } +// else if (node->type == CMD_NODE) +// { +// result = execute_cmd(&node->content.cmd, env); +// } +// else +// { +// panic("UNREACHABLE"); +// result = EXIT_FAILURE; +// } +// return (result); +// } + +//v 3.0 static int eval_rec(t_node *node, t_env **env, int in_fd) { @@ -157,3 +373,101 @@ int eval(t_node *node, t_env **env) { return (eval_rec(node, env, STDIN_FILENO)); } +//v was auch immmer + +// int execute_cmd(t_cmd *cmd, t_env **env) +// { +// char *cmd_path; +// pid_t pid; +// int status; + +// if (handle_redirections(cmd->redirs) == -1) +// { +// return (EXIT_FAILURE); +// } +// if (is_builtin(cmd->args[0])) +// { +// return (execute_builtin(cmd->args, env)); +// } +// pid = fork(); +// if (pid == -1) +// { +// perror("fork"); +// return (EXIT_FAILURE); +// } +// if (pid == 0) +// { +// cmd_path = get_cmd_path(cmd->args[0], *env); +// if (!cmd_path) +// { +// printf("%s: command not found\n", cmd->args[0]); +// return (EXIT_FAILURE); +// } +// execve(cmd_path, cmd->args, env_to_strlst(*env)); +// perror("execve"); +// exit(EXIT_FAILURE); +// } +// waitpid(pid, &status, 0); +// return (WEXITSTATUS(status)); +// } +int execute_cmd(t_cmd *cmd, t_env **env) +{ + char *cmd_path; + pid_t pid; + int status; + int original_stdout; + int original_stdin; + + original_stdout = dup(STDOUT_FILENO); + original_stdin = dup(STDIN_FILENO); + + if (handle_redirections(cmd->redirs) == -1) + { + dup2(original_stdout, STDOUT_FILENO); + dup2(original_stdin, STDIN_FILENO); + close(original_stdout); + close(original_stdin); + return (EXIT_FAILURE); + } + + if (is_builtin(cmd->args[0])) + { + int result = execute_builtin(cmd->args, env); + dup2(original_stdout, STDOUT_FILENO); + dup2(original_stdin, STDIN_FILENO); + close(original_stdout); + close(original_stdin); + return (result); + } + + pid = fork(); + if (pid == -1) + { + perror("fork"); + dup2(original_stdout, STDOUT_FILENO); + dup2(original_stdin, STDIN_FILENO); + close(original_stdout); + close(original_stdin); + return (EXIT_FAILURE); + } + if (pid == 0) + { + cmd_path = get_cmd_path(cmd->args[0], *env); + if (!cmd_path) + { + printf("%s: command not found\n", cmd->args[0]); + exit(EXIT_FAILURE); + } + execve(cmd_path, cmd->args, env_to_strlst(*env)); + perror("execve"); + exit(EXIT_FAILURE); + } + waitpid(pid, &status, 0); + + dup2(original_stdout, STDOUT_FILENO); + dup2(original_stdin, STDIN_FILENO); + close(original_stdout); + close(original_stdin); + + return (WEXITSTATUS(status)); +} \ No newline at end of file