save commit

This commit is contained in:
2026-02-09 20:47:43 +01:00
parent e983f7fe64
commit 280fa51f94
39 changed files with 3400 additions and 239 deletions

View File

@@ -0,0 +1,108 @@
#include "minishell.h"
static int open_redir(t_redir *r)
{
if (r->type == REDIR_IN)
return open(r->target, O_RDONLY);
if (r->type == REDIR_OUT)
return open(r->target, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (r->type == REDIR_APPEND)
return open(r->target, O_WRONLY | O_CREAT | O_APPEND, 0644);
return -1;
}
int prepare_heredocs(t_pipeline *p, t_shell *sh)
{
size_t i;
g_signal = 0;
for (i = 0; i < p->count; i++)
{
t_redir *r = p->cmds[i]->redirs;
while (r)
{
if (r->type == REDIR_HEREDOC)
{
int fds[2];
char *line;
ms_set_heredoc_signals();
if (pipe(fds) == -1)
return 1;
while (1)
{
line = readline("> ");
if (!line)
break;
if (strcmp(line, r->target) == 0)
{
free(line);
break;
}
write(fds[1], line, strlen(line));
write(fds[1], "\n", 1);
free(line);
}
close(fds[1]);
r->fd = fds[0];
ms_setup_signals(sh);
if (g_signal == SIGINT)
{
sh->exit_status = 130;
return 1;
}
}
r = r->next;
}
}
return 0;
}
int apply_redirections(t_command *cmd, int *saved_stdin, int *saved_stdout)
{
t_redir *r = cmd->redirs;
*saved_stdin = -1;
*saved_stdout = -1;
while (r)
{
int fd = -1;
if (r->type == REDIR_HEREDOC)
fd = r->fd;
else
fd = open_redir(r);
if (fd == -1)
{
perror(r->target);
return 1;
}
if (r->type == REDIR_IN || r->type == REDIR_HEREDOC)
{
if (*saved_stdin == -1)
*saved_stdin = dup(STDIN_FILENO);
dup2(fd, STDIN_FILENO);
}
else
{
if (*saved_stdout == -1)
*saved_stdout = dup(STDOUT_FILENO);
dup2(fd, STDOUT_FILENO);
}
if (r->type != REDIR_HEREDOC)
close(fd);
r = r->next;
}
return 0;
}
void restore_redirections(int saved_stdin, int saved_stdout)
{
if (saved_stdin != -1)
{
dup2(saved_stdin, STDIN_FILENO);
close(saved_stdin);
}
if (saved_stdout != -1)
{
dup2(saved_stdout, STDOUT_FILENO);
close(saved_stdout);
}
}