fix: signals (^C in $ cat)

This commit is contained in:
mcolonna 2024-06-28 12:55:55 +02:00
parent 368b46e82c
commit 3f3028880b
5 changed files with 28 additions and 26 deletions

View file

@ -10,7 +10,6 @@
x exit (with no options)
- fix
- the builtins should get all arguments and check if they're good
- `$ cat` then ^C
(unnecessary part)
- working history (rl_* functions?)

View file

@ -6,7 +6,7 @@
/* By: jschaft <cecile.schaft@orange.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/23 14:15:12 by mcolonna #+# #+# */
/* Updated: 2024/06/13 13:08:35 by mcolonna ### ########.fr */
/* Updated: 2024/06/28 12:55:17 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,6 +15,13 @@
# include "include.h"
void handle_signals(void);
typedef enum e_sigmode {
SIGMODE_PROMPT, SIGMODE_IGNORE, SIGMODE_DEFAULT
} t_sigmode;
// If sigmode is SIGMODE_PROMPT, ^C redisplays the prompt and ^\ is ignored.
// If sigmode is SIGMODE_IGNORE, ^C and ^\ are ignored.
// If sigmode is SIGMODE_DEFAULT, ^C and ^\ are reset by default.
void handle_signals(t_sigmode sigmode);
#endif

View file

@ -6,7 +6,7 @@
/* By: jschaft <cecile.schaft@orange.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/24 13:48:00 by jschaft #+# #+# */
/* Updated: 2024/06/28 12:03:49 by mcolonna ### ########.fr */
/* Updated: 2024/06/28 12:54:07 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
@ -56,6 +56,7 @@ static int execute_call(
return (minishell_error("errno"), errno);
if (pid == 0)
{
handle_signals(SIGMODE_DEFAULT);
if (dup2(inout[0], 0) < 0 || dup2(inout[1], 1) < 0)
return (minishell_error("errno"), errno);
close_all_pipes(global);

View file

@ -6,7 +6,7 @@
/* By: jschaft <cecile.schaft@orange.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/04/23 14:33:45 by mcolonna #+# #+# */
/* Updated: 2024/06/28 11:51:01 by mcolonna ### ########.fr */
/* Updated: 2024/06/28 12:53:23 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
@ -62,7 +62,9 @@ static void prompt_command(t_env *env)
const char *command_str;
env->mc_command = mem_subclass(fatal_error, env->mc_global);
handle_signals(SIGMODE_PROMPT);
command_str = ask_command(env);
handle_signals(SIGMODE_IGNORE);
if (!command_str)
env->exit = true;
else
@ -93,7 +95,6 @@ int main(const int argc, const char *argv[], char *const envp[])
env.envp = envp;
variables = variables_from_envp(env, envp);
env.variables = &variables;
handle_signals();
start(&env);
while (!env.exit)
prompt_command(&env);

View file

@ -6,7 +6,7 @@
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/12 14:04:30 by mcolonna #+# #+# */
/* Updated: 2024/06/18 15:40:09 by mcolonna ### ########.fr */
/* Updated: 2024/06/28 12:52:32 by mcolonna ### ########.fr */
/* */
/* ************************************************************************** */
@ -21,33 +21,27 @@ static void handle_sigint(int _)
rl_redisplay();
}
void handle_signals(void)
{
struct sigaction sa;
sa.sa_flags = SA_RESTART;
sa.sa_handler = handle_sigint;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGINT, &sa, NULL) == -1)
fatal_error(NULL);
sa.sa_flags = 0;
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGQUIT, &sa, NULL) == -1)
fatal_error(NULL);
}
void handle_signals_default(void)
void handle_signals(t_sigmode sigmode)
{
struct sigaction sa;
sa.sa_flags = 0;
sa.sa_handler = SIG_DFL;
if (sigmode == SIGMODE_PROMPT)
sa.sa_flags = SA_RESTART;
if (sigmode == SIGMODE_PROMPT)
sa.sa_handler = handle_sigint;
else if (sigmode == SIGMODE_IGNORE)
sa.sa_handler = SIG_IGN;
else
sa.sa_handler = SIG_DFL;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGINT, &sa, NULL) == -1)
fatal_error(NULL);
sa.sa_flags = 0;
sa.sa_handler = SIG_DFL;
if (sigmode == SIGMODE_DEFAULT)
sa.sa_handler = SIG_DFL;
else
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGQUIT, &sa, NULL) == -1)
fatal_error(NULL);