mirror of
https://codeberg.org/la-chouette/minishell.git
synced 2025-12-06 07:28:09 +01:00
fix(here_doc): do not display C-\ and C-<backspace>
This commit is contained in:
parent
083a2bb2a2
commit
b7686df5a8
5 changed files with 78 additions and 26 deletions
|
|
@ -3,10 +3,10 @@
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* here_doc.c :+: :+: :+: */
|
/* here_doc.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: jguelen <jguelen@student.42.fr> +#+ +:+ +#+ */
|
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/03/07 11:42:29 by kcolin #+# #+# */
|
/* Created: 2025/05/05 11:03:08 by kcolin #+# #+# */
|
||||||
/* Updated: 2025/05/02 12:47:33 by jguelen ### ########.fr */
|
/* Updated: 2025/05/05 11:40:04 by kcolin ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -18,33 +18,63 @@
|
||||||
#include "../../ft_errno.h"
|
#include "../../ft_errno.h"
|
||||||
#include "../../sig/sig.h"
|
#include "../../sig/sig.h"
|
||||||
#include "here_doc_utils.h"
|
#include "here_doc_utils.h"
|
||||||
|
#include <termios.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
char *expand_line(char *line, t_minishell *app);
|
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)
|
char *here_doc(t_worddesc *marker, int infd, t_minishell *app)
|
||||||
{
|
{
|
||||||
int outfd;
|
int outfd;
|
||||||
char *filename;
|
char *filename;
|
||||||
char *line;
|
char *line;
|
||||||
|
struct termios term_save;
|
||||||
|
|
||||||
|
if (tcgetattr(infd, &term_save) < 0)
|
||||||
|
return (tcgetatr_fail());
|
||||||
outfd = setup_here_doc(marker, infd, &filename);
|
outfd = setup_here_doc(marker, infd, &filename);
|
||||||
if (outfd < 0)
|
if (outfd < 0)
|
||||||
return (ft_errno(FT_EHEREDOC_FAILED), failed_to_open_tmp_file(), NULL);
|
return (ft_errno(FT_EHEREDOC_FAILED), failed_to_open_tmp_file());
|
||||||
set_here_doc_mode_sig_handling();
|
if (setup_term_and_signal(outfd, filename, infd, term_save) == NULL)
|
||||||
|
return (NULL);
|
||||||
line = get_next_line(infd);
|
line = get_next_line(infd);
|
||||||
while (line != NULL)
|
while (line != NULL)
|
||||||
{
|
{
|
||||||
if (is_marker(line, marker))
|
if (is_marker(line, marker))
|
||||||
return (finalize(outfd, filename));
|
return (finalize(outfd, filename, infd, &term_save));
|
||||||
if (!(marker->flags & (W_QUOTED | W_DQUOTE)))
|
if (!(marker->flags & (W_QUOTED | W_DQUOTE)))
|
||||||
line = expand_line(line, app);
|
line = expand_line(line, app);
|
||||||
line = output_line_and_next(infd, outfd, line);
|
line = output_line_and_next(infd, outfd, line);
|
||||||
}
|
}
|
||||||
if (g_signum != 0)
|
if (g_signum != 0)
|
||||||
return (ft_errno(FT_EHEREDOC_FAILED), interupted(outfd, filename),
|
return (interupted(outfd, filename, infd, &term_save));
|
||||||
NULL);
|
eof_warning(marker->word);
|
||||||
ft_dprintf(STDERR_FILENO, "minishell: warning: here-document delimited by \
|
return (finalize(outfd, filename, infd, &term_save));
|
||||||
end-of-file (wanted `%s')\n", marker->word);
|
|
||||||
return (finalize(outfd, filename));
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/03/28 18:29:44 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 "libft.h"
|
||||||
#include "../../ft_errno.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");
|
ft_perror("minishell: cannot create temp file for here-document");
|
||||||
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,12 @@
|
||||||
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/05/02 14:36:33 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 "here_doc_utils.h"
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "../../ft_errno.h"
|
#include "../../ft_errno.h"
|
||||||
#include "here_doc.h"
|
#include "here_doc.h"
|
||||||
|
|
@ -39,21 +40,37 @@ char *output_line_and_next(int infd, int outfd, char *line)
|
||||||
return (line);
|
return (line);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *finalize(int outfd, char *filename)
|
char *finalize(int outfd, char *filename, int infd,
|
||||||
|
struct termios *term_save)
|
||||||
{
|
{
|
||||||
close(outfd);
|
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();
|
set_interactive_mode_sig_handling();
|
||||||
return (filename);
|
return (filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
int interupted(int outfd, char *filename)
|
char *interupted(int outfd, char *filename, int infd,
|
||||||
|
struct termios *term_save)
|
||||||
{
|
{
|
||||||
close(outfd);
|
close(outfd);
|
||||||
unlink(filename);
|
unlink(filename);
|
||||||
free(filename);
|
free(filename);
|
||||||
g_signum = 0;
|
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();
|
set_interactive_mode_sig_handling();
|
||||||
return (-1);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_marker(char *line, t_worddesc *marker)
|
bool is_marker(char *line, t_worddesc *marker)
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/17 11:49:52 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
|
# define HERE_DOC_UTILS_H
|
||||||
|
|
||||||
# include "../../parser/worddesc/worddesc.h"
|
# include "../../parser/worddesc/worddesc.h"
|
||||||
|
# include <termios.h>
|
||||||
|
|
||||||
int setup_here_doc(t_worddesc *marker, int infd, char **filename);
|
int setup_here_doc(t_worddesc *marker, int infd, char **filename);
|
||||||
char *output_line_and_next(int infd, int outfd, char *line);
|
char *output_line_and_next(int infd, int outfd, char *line);
|
||||||
char *finalize(int outfd, char *filename);
|
char *finalize(int outfd, char *filename, int infd,
|
||||||
int interupted(int outfd, char *filename);
|
struct termios *term_save);
|
||||||
|
char *interupted(int outfd, char *filename, int infd,
|
||||||
|
struct termios *term_save);
|
||||||
bool is_marker(char *line, t_worddesc *marker);
|
bool is_marker(char *line, t_worddesc *marker);
|
||||||
|
|
||||||
#endif // HERE_DOC_UTILS_H
|
#endif // HERE_DOC_UTILS_H
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
/* By: kcolin <kcolin@42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2025/04/09 16:53:02 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;
|
next = redirect->next;
|
||||||
free(redirect->here_doc_eof);
|
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)
|
&& redirect->redirectee.filename->word != NULL)
|
||||||
unlink(redirect->redirectee.filename->word);
|
unlink(redirect->redirectee.filename->word);
|
||||||
worddesc_destroy(redirect->redirectee.filename);
|
worddesc_destroy(redirect->redirectee.filename);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue