/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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)
{
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
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;
heredoc_data = NULL;
if ((*cur)->content.redir_type == INPUT_LIMITER)
{
+ // Handle Here Document (<<)
heredoc_data = read_heredoc((*cur)->next->content.string);
if (!heredoc_data)
{
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
/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
#include <sys/fcntl.h>
#include <unistd.h>
-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
/* By: chuhlig <chuhlig@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
#include <sys/fcntl.h>
#include <sys/types.h>
+
+// 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 <stdio.h>
+
+// 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)
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)
{
{
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