From 5932e7ca612ac243ff7987a32aae0d16c64d6560 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon Date: Sun, 24 May 2020 18:06:24 +0200 Subject: [PATCH] Handling the SIGINT --- Makefile | 3 ++- include/key_functions.h | 4 ++- include/my_ncurses.h | 4 ++- include/shell.h | 1 + src/execute.c | 2 +- src/key_bindings/default_bindings.c | 2 ++ src/key_bindings/signals.c | 42 +++++++++++++++++++++++++++++ src/shell.c | 1 + tests/loop.c | 5 ++++ 9 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 src/key_bindings/signals.c create mode 100644 tests/loop.c diff --git a/Makefile b/Makefile index 577c084..34ab18a 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,8 @@ SRC = src/shell.c \ src/key_bindings/autocompletion.c \ src/builtin/builtin_bindkey.c \ src/key_bindings/other_bindings.c \ - src/builtin/builtin_vars.c + src/builtin/builtin_vars.c \ + src/key_bindings/signals.c OBJ = $(SRC:%.c=%.o) OBJ += src/main.o diff --git a/include/key_functions.h b/include/key_functions.h index 46022fb..f4f577b 100644 --- a/include/key_functions.h +++ b/include/key_functions.h @@ -46,4 +46,6 @@ int down_history_command(int key, buffer_t *buffer, env_t *env); int quoted_insert_command(int key, buffer_t *buffer, env_t *env); int clear_screen_command(int key, buffer_t *buffer, env_t *env); -int complete_command(int key, buffer_t *buffer, env_t *env); \ No newline at end of file +int complete_command(int key, buffer_t *buffer, env_t *env); + +int tty_sigintr_command(int key, buffer_t *buffer, env_t *env); \ No newline at end of file diff --git a/include/my_ncurses.h b/include/my_ncurses.h index 8cac82c..5c6cf40 100644 --- a/include/my_ncurses.h +++ b/include/my_ncurses.h @@ -71,4 +71,6 @@ my_addstr(window, str)) #define my_clrtobot() (printf("\x1B[J")) void my_npause(my_window *window); -void my_nresume(my_window *window); \ No newline at end of file +void my_nresume(my_window *window); + +extern my_window *stdwin; \ No newline at end of file diff --git a/include/shell.h b/include/shell.h index 556cbfb..73964ee 100644 --- a/include/shell.h +++ b/include/shell.h @@ -85,5 +85,6 @@ char *get_alias(char *cmd, alias_t *alias); char *add_separator(char *cmd, int *return_values, int index); char *get_alias_command(char *cmd, alias_t *alias); +void setup_sigint(void); #define ERROR 84 \ No newline at end of file diff --git a/src/execute.c b/src/execute.c index 10c7e46..d4ef0fe 100644 --- a/src/execute.c +++ b/src/execute.c @@ -101,7 +101,7 @@ bool handle_parent_inout(redirection *inout[2], env_t *env, bool builtin) void run_cmd(char **argv, redirection *inout[2], env_t *env) { pid_t pid; - int status; + int status = 0; char *path; if (strlen(argv[0]) == 0) diff --git a/src/key_bindings/default_bindings.c b/src/key_bindings/default_bindings.c index aa86ead..0f95aca 100644 --- a/src/key_bindings/default_bindings.c +++ b/src/key_bindings/default_bindings.c @@ -25,6 +25,7 @@ const key_function_t key_functions[] = { {"complete-command", &complete_command}, {"clear-screen", &clear_screen_command}, {"quoted-insert", "ed_insert_command}, + {"tty-sigintr", &tty_sigintr_command}, {NULL, NULL} }; @@ -43,6 +44,7 @@ const binding_t emacs_bindings[] = { {'\t', &complete_command}, {CTRL('l'), &clear_screen_command}, {CTRL('v'), "ed_insert_command}, + {CTRL('c'), &tty_sigintr_command}, {0, NULL} }; diff --git a/src/key_bindings/signals.c b/src/key_bindings/signals.c new file mode 100644 index 0000000..c075280 --- /dev/null +++ b/src/key_bindings/signals.c @@ -0,0 +1,42 @@ +/* +** EPITECH PROJECT, 2020 +** ash +** File description: +** signals +*/ + +#include +#include +#include +#include "shell.h" +#include "key_functions.h" +#include "my_ncurses.h" + +void on_sigint(int sig, siginfo_t *info, void *context) +{ + my_addstr(stdwin, "\n"); +} + +void setup_sigint(void) +{ + struct sigaction sa; + + sa.sa_sigaction = &on_sigint; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_SIGINFO; + sigaction(SIGINT, &sa, NULL); +} + +int tty_sigintr_command(int key, buffer_t *buffer, env_t *env) +{ + if (buffer->buffer) { + buffer->buffer[0] = '\0'; + buffer->pos = 0; + env->vars = my_setenv(env->vars, "?", "130"); + } + if (env->window) { + my_addstr(env->window, "\n"); + prompt_prepare(buffer, env); + } + return (0); +} \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index dc0f330..f75f34c 100644 --- a/src/shell.c +++ b/src/shell.c @@ -74,6 +74,7 @@ void start_shell(env_t *env) buffer_t buffer = {NULL, 0, 0, 0, 0, NULL, false}; int key; + setup_sigint(); if (isatty(0)) { env->window = my_initwin(); prompt_prepare(&buffer, env); diff --git a/tests/loop.c b/tests/loop.c new file mode 100644 index 0000000..0d30f42 --- /dev/null +++ b/tests/loop.c @@ -0,0 +1,5 @@ +int main() +{ + while (1); + return (0); +}