/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* heredoc.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: mmoussou "); while (line && ft_strcmp(line, delimiter)) { status = write(fd, line, ft_strlen(line)); if (status == -1) close(fd_manager(fd)); if (status == -1) break ; status = write(fd, "\n", 1); if (status == -1) close(fd_manager(fd)); if (status == -1) break ; free(line); line = readline("heredoc> "); } free(line); status = write(fd, "\0", 1); if (status == -1) close(fd_manager(fd)); return (-(status == -1)); } void __forked(char *delimiter, int fd, t_cmd *cmd) { signal(SIGINT, &__heredoc_sig); free(cmd); get_input(delimiter, fd); ft_envclear(get_env(NULL), free); ft_lstclear_till_nxt(get_list2(NULL), &free_cmd); ft_lstclear(get_list(NULL), &free_token); rl_clear_history(); close(fd); } int __heredoc(char *delimiter, t_cmd *cmd) { int fork_pid; int fd; int heredoc_ret; fd = fd_manager(0); if (fd == -1) { close(fd_manager(-1)); return (-1); } fork_pid = fork(); if (fork_pid == -1) { close(fd_manager(-1)); close(fd); return (-1); } if (!fork_pid) { __forked(delimiter, fd, cmd); exit(0); } else waitpid(fork_pid, &heredoc_ret, 0); return (check_error(heredoc_ret, fd)); } int ft_heredoc(char *delimiter, t_cmd *cmd) { int fd; fd = __heredoc(delimiter, cmd); return (fd); }