109 lines
1.9 KiB
C
109 lines
1.9 KiB
C
#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);
|
|
}
|
|
}
|