42_minishell/redirection/redirection.c
2023-03-20 13:18:20 +01:00

121 lines
2.3 KiB
C

#include "redirection_private.h"
int ft_replace_file(t_data *data, char **tab)
{
size_t i;
char *redirection;
i = 0;
while (tab[i] != NULL)
{
if (ft_is_in("<>", tab[i][0]))
{
i++;
redirection = ft_env_filler(data, tab[i]);
if (redirection == NULL)
return (1);
free(tab[i]);
tab[i] = redirection;
ft_quote_remover(tab[i]);
}
i++;
}
return (0);
}
void ft_remove_redirection(char *cmd_str)
{
size_t i;
ssize_t start;
ssize_t stop;
i = 0;
while (cmd_str[i] != '\0')
{
start = -1;
while ((ft_is_in_quote(cmd_str, i) || !ft_is_in("<>", cmd_str[i]))
&& cmd_str[i] != '\0')
i++;
if (ft_is_in("<>", cmd_str[i]))
start = i;
if (start == -1)
continue ;
while (cmd_str[i] == cmd_str[start])
i++;
while (cmd_str[i] == ' ')
i++;
while (cmd_str[i] != '\0' && (cmd_str[i] != ' ' || ft_is_in_quote(cmd_str, i)))
i++;
stop = i - start;
if (start != -1)
{
ft_strshift(cmd_str + start, -1 * stop);
i = start;
}
}
}
int ft_set_redirection(t_data *data, t_cmd *cmd, char **tab)
{
size_t i;
i = 0;
while (tab[i + 1] != NULL)
{
ft_quote_remover(tab[i + 1]);
if (ft_strcmp(tab[i], "<<") == 0)
{
cmd->fd_in[0] = ft_heredoc(data, tab[i + 1]);
if (cmd->fd_in[0] == -2)
return (1);
}
else if (ft_strcmp(tab[i], "<") == 0)
{
if (ft_file_is_readable(data, tab[i + 1]))
cmd->fd_in[0] = open(tab[i + 1], O_RDONLY);
else
return (1);
}
else if(ft_strcmp(tab[i], ">") == 0)
{
if (ft_file_is_writable(data, tab[i + 1]))
cmd->fd_out[0] = open(tab[i + 1], O_WRONLY | O_TRUNC | O_CREAT, 0644);
else
return (1);
}
else if(ft_strcmp(tab[i], ">>") == 0)
{
if (ft_file_is_appendable(data, tab[i + 1]))
cmd->fd_out[0] = open(tab[i + 1], O_WRONLY | O_APPEND | O_CREAT, 0644);
else
return (1);
}
i++;
}
return (0);
}
int ft_redirection(t_data *data, t_cmd *cmd, char *cmd_str)
{
char **tab;
cmd->fd_in[0] = -1;
cmd->fd_in[1] = -1;
cmd->fd_out[0] = -1;
cmd->fd_out[1] = -1;
tab = ft_split_quoted(cmd_str, ' ');
if (tab == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (1);
}
ft_remove_redirection(cmd_str);
if (ft_set_redirection(data, cmd, tab))
{
ft_freer_tab_ultimate(1, tab);
return (1);
}
ft_freer_tab_ultimate(1, tab);
return (0);
}