From b7686df5a8b0fb2426bdf5462544129e1e87122f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kha=C3=AFs=20COLIN?= Date: Mon, 5 May 2025 11:21:18 +0200 Subject: [PATCH] fix(here_doc): do not display C-\ and C- --- src/executing/here_doc/here_doc.c | 60 ++++++++++++++++++------ src/executing/here_doc/here_doc_errors.c | 5 +- src/executing/here_doc/here_doc_utils.c | 25 ++++++++-- src/executing/here_doc/here_doc_utils.h | 9 ++-- src/parser/cmd/cmd_destroy.c | 5 +- 5 files changed, 78 insertions(+), 26 deletions(-) diff --git a/src/executing/here_doc/here_doc.c b/src/executing/here_doc/here_doc.c index 1966648..78ba367 100644 --- a/src/executing/here_doc/here_doc.c +++ b/src/executing/here_doc/here_doc.c @@ -3,10 +3,10 @@ /* ::: :::::::: */ /* here_doc.c :+: :+: :+: */ /* +:+ +:+ +:+ */ -/* By: jguelen +#+ +:+ +#+ */ +/* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2025/03/07 11:42:29 by kcolin #+# #+# */ -/* Updated: 2025/05/02 12:47:33 by jguelen ### ########.fr */ +/* Created: 2025/05/05 11:03:08 by kcolin #+# #+# */ +/* Updated: 2025/05/05 11:40:04 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,33 +18,63 @@ #include "../../ft_errno.h" #include "../../sig/sig.h" #include "here_doc_utils.h" +#include +#include char *expand_line(char *line, t_minishell *app); -void failed_to_open_tmp_file(void); +char *failed_to_open_tmp_file(void); + +static char *tcgetatr_fail(void) +{ + return (ft_errno(FT_EHEREDOC_FAILED), + perror("minishell: tcgetattr"), NULL); +} + +static void eof_warning(char *marker) +{ + ft_dprintf(STDERR_FILENO, "minishell: warning: here-document delimited by \ +end-of-file (wanted `%s')\n", marker); +} + +static char *setup_term_and_signal(int outfd, char *filename, int infd, + struct termios term_save) +{ + struct termios term_new; + + set_here_doc_mode_sig_handling(); + term_new = term_save; + term_new.c_lflag = term_new.c_lflag & ~ECHOCTL; + if (tcsetattr(infd, TCSANOW, &term_new) < 0) + return (perror("minishell: tcsetattr"), + interupted(outfd, filename, infd, &term_save)); + return (filename); +} char *here_doc(t_worddesc *marker, int infd, t_minishell *app) { - int outfd; - char *filename; - char *line; + int outfd; + char *filename; + char *line; + struct termios term_save; + if (tcgetattr(infd, &term_save) < 0) + return (tcgetatr_fail()); outfd = setup_here_doc(marker, infd, &filename); if (outfd < 0) - return (ft_errno(FT_EHEREDOC_FAILED), failed_to_open_tmp_file(), NULL); - set_here_doc_mode_sig_handling(); + return (ft_errno(FT_EHEREDOC_FAILED), failed_to_open_tmp_file()); + if (setup_term_and_signal(outfd, filename, infd, term_save) == NULL) + return (NULL); line = get_next_line(infd); while (line != NULL) { if (is_marker(line, marker)) - return (finalize(outfd, filename)); + return (finalize(outfd, filename, infd, &term_save)); if (!(marker->flags & (W_QUOTED | W_DQUOTE))) line = expand_line(line, app); line = output_line_and_next(infd, outfd, line); } if (g_signum != 0) - return (ft_errno(FT_EHEREDOC_FAILED), interupted(outfd, filename), - NULL); - ft_dprintf(STDERR_FILENO, "minishell: warning: here-document delimited by \ -end-of-file (wanted `%s')\n", marker->word); - return (finalize(outfd, filename)); + return (interupted(outfd, filename, infd, &term_save)); + eof_warning(marker->word); + return (finalize(outfd, filename, infd, &term_save)); } diff --git a/src/executing/here_doc/here_doc_errors.c b/src/executing/here_doc/here_doc_errors.c index 40b78c0..c0533f7 100644 --- a/src/executing/here_doc/here_doc_errors.c +++ b/src/executing/here_doc/here_doc_errors.c @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/03/28 18:29:44 by kcolin #+# #+# */ -/* Updated: 2025/03/28 19:03:45 by kcolin ### ########.fr */ +/* Updated: 2025/05/05 11:24:45 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,7 +14,8 @@ #include "libft.h" #include "../../ft_errno.h" -void failed_to_open_tmp_file(void) +char *failed_to_open_tmp_file(void) { ft_perror("minishell: cannot create temp file for here-document"); + return (NULL); } diff --git a/src/executing/here_doc/here_doc_utils.c b/src/executing/here_doc/here_doc_utils.c index 4677987..1ee2cc3 100644 --- a/src/executing/here_doc/here_doc_utils.c +++ b/src/executing/here_doc/here_doc_utils.c @@ -6,11 +6,12 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/02 14:36:33 by kcolin #+# #+# */ -/* Updated: 2025/05/02 14:36:33 by kcolin ### ########.fr */ +/* Updated: 2025/05/05 11:33:36 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ #include "here_doc_utils.h" +#include #include #include "../../ft_errno.h" #include "here_doc.h" @@ -39,21 +40,37 @@ char *output_line_and_next(int infd, int outfd, char *line) return (line); } -char *finalize(int outfd, char *filename) +char *finalize(int outfd, char *filename, int infd, + struct termios *term_save) { close(outfd); + if (tcsetattr(infd, TCSADRAIN, term_save) < 0) + { + perror("minishell: tcsetattr"); + ft_errno(FT_EHEREDOC_FAILED); + free(filename); + filename = NULL; + } set_interactive_mode_sig_handling(); return (filename); } -int interupted(int outfd, char *filename) +char *interupted(int outfd, char *filename, int infd, + struct termios *term_save) { close(outfd); unlink(filename); free(filename); g_signum = 0; + if (tcsetattr(infd, TCSADRAIN, term_save) < 0) + { + perror("minishell: tcsetattr"); + free(filename); + filename = NULL; + } + ft_errno(FT_EHEREDOC_FAILED); set_interactive_mode_sig_handling(); - return (-1); + return (NULL); } bool is_marker(char *line, t_worddesc *marker) diff --git a/src/executing/here_doc/here_doc_utils.h b/src/executing/here_doc/here_doc_utils.h index 493bdfa..a421083 100644 --- a/src/executing/here_doc/here_doc_utils.h +++ b/src/executing/here_doc/here_doc_utils.h @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/17 11:49:52 by kcolin #+# #+# */ -/* Updated: 2025/04/29 16:37:56 by kcolin ### ########.fr */ +/* Updated: 2025/05/05 11:24:11 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,11 +14,14 @@ # define HERE_DOC_UTILS_H # include "../../parser/worddesc/worddesc.h" +# include int setup_here_doc(t_worddesc *marker, int infd, char **filename); char *output_line_and_next(int infd, int outfd, char *line); -char *finalize(int outfd, char *filename); -int interupted(int outfd, char *filename); +char *finalize(int outfd, char *filename, int infd, + struct termios *term_save); +char *interupted(int outfd, char *filename, int infd, + struct termios *term_save); bool is_marker(char *line, t_worddesc *marker); #endif // HERE_DOC_UTILS_H diff --git a/src/parser/cmd/cmd_destroy.c b/src/parser/cmd/cmd_destroy.c index b9af927..3b34eb8 100644 --- a/src/parser/cmd/cmd_destroy.c +++ b/src/parser/cmd/cmd_destroy.c @@ -6,7 +6,7 @@ /* By: kcolin +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/09 16:53:02 by kcolin #+# #+# */ -/* Updated: 2025/05/02 14:35:54 by kcolin ### ########.fr */ +/* Updated: 2025/05/05 11:22:40 by kcolin ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,7 +23,8 @@ void redirect_destroy(t_redirect *redirect) { next = redirect->next; free(redirect->here_doc_eof); - if (redirect->type == FT_HEREDOC && redirect->redirectee.filename != NULL + if (redirect->type == FT_HEREDOC + && redirect->redirectee.filename != NULL && redirect->redirectee.filename->word != NULL) unlink(redirect->redirectee.filename->word); worddesc_destroy(redirect->redirectee.filename);