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);
+}