Добрый вечер, не могу понять как правильно реализовать «<<»
Например при вызове «cat << aa» heredoc вроде нормально срабатывает и в pipe записывает все но кот не завершает работу и его даже никак не убить. Запись в пайп идет при флаге = 4
https://github.com/Quickaxe-Martina/beta21sh
вот весь проект на всякий случай
int ft_fd_flag(char **av, int *fd_in, int *p0, int *p1)
{
int flag = 0;
int i = -1;
int st = 1;
int fd;
int b = 0;
int f[2];
char *str;//////////
int j;/////////
while (av[++i])
{
if (b == 0 && av[i][0] >= '0' && av[i][0] <= '9')
{
st = ft_atoi(av[i]);
}
else if ((av[i][0] == '>' || av[i][0] == '<' || av[i][0] == '&'))
{
ft_strcmp(av[i], ">") == 0 ? flag = 1 : flag;//Направить стандартный поток вывода в файл. Если файл не существует, он будет создан; если существует — перезаписан сверху.
ft_strcmp(av[i], ">>") == 0 ? flag = 2 : flag;//Направить стандартный поток вывода в файл. Если файл не существует, он будет создан; если существует — данные будут дописаны к нему в конец.
ft_strcmp(av[i], "<") == 0 ? flag = 3 : flag;//Использовать файл как источник данных для стандартного потока ввода.
ft_strcmp(av[i], "<<") == 0 ? flag = 4 : flag;//Весь текст между блоками EOF (в общем случае вместо EOF можно использовать любое слово) будет выведен на экран. Важно: перед последним EOF не должно быть пробелов! (heredoc синтаксис).
ft_strcmp(av[i], ">&-") == 0 ? flag = 5 : flag;//Закрыть поток вывода перед вызовом команды
ft_strcmp(av[i], ">&") == 0 ? flag = 6 : flag;//Направить стандартный поток вывода и стандартный поток ошибок в файл. Другая форма записи: >файл 2>&1.
ft_strcmp(av[i], "&>") == 0 ? flag = 6 : flag;
b = 1;
}
else if (b == 1 && flag != 0)
{
if (flag == 1 || flag == 6)
fd = open(av[i], O_CREAT | O_RDWR | O_TRUNC,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);//добавить ошибки
else if (flag == 2)
fd = open(av[i], O_CREAT | O_RDWR | O_APPEND,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
else if (flag == 3)
*fd_in = open(av[i], O_RDONLY);
if (flag == 1 || flag == 2)
{
dup2(fd, st);
close(fd);
}
else if (flag == 6)
{
dup2(fd, 1);
dup2(fd, 2);
close(fd);
}
else if (flag == 5)///////////
{
pipe(f);
*p0 = f[0];
*p1 = f[1];
;
}
else if (flag == 4)
{
pipe(f);
str = ft_strnew(1);
set_input_mode();
while (ft_strcmp(str, av[i]) != 0)
{
j = -1;
while(str[++j])
write(f[1], &str[j], 1);
write(f[1], "\n", 1);
free(str);
str = ft_read_8(ft_main_norm(2), NULL, 2);//FIX IT
write(2, "\n", 1);
}
ft_putchar_fd(EOF, f[1]);
reset_input_mode();
*fd_in = f[0];
}
b = 0;
flag = 0;
st = 1;
}
}
return (fd);
}
void ft_infinit_pipe(t_exectoken *head)
{
int p[2];
pid_t pid;
int fd_in = 0;
int fd;
while (head)
{
pipe(p);
if ((pid = fork()) == -1)
{
exit(1);
}
else if (pid == 0)
{
if (head->left != NULL)///////////////////////////////
{
dup2(p[1], 1);
close(p[1]);
}
if (head->file_opt)
fd = ft_fd_flag(head->file_opt, &fd_in, &p[0], &p[1]);
dup2(fd_in, 0);
close(p[0]);
if (ft_path_fork(head->file_args, pid) == -1)
{
ft_putstr_fd("21sh: command not found: ", 2);
ft_putendl_fd(&(head->file_args[0][1]), 2);
}
exit(0);
}
else
{
wait(NULL);
close(p[1]);
fd_in = p[0];
head = head->left;
}
}
}