aboutsummaryrefslogtreecommitdiff
path: root/src/signal.c
blob: e4a72ad3668dc0f0e5cfaf4b5a51ea3d07de2edc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   signal.c                                           :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: charles <charles.cabergs@gmail.com>        +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2020/07/16 09:16:16 by charles           #+#    #+#             */
/*   Updated: 2020/10/10 13:00:42 by cacharle         ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "eval.h"
#include "minishell.h"

/*
** \brief         Interupt signal handler
**                If no child is running, print a prompt
**                Otherwise the currently running child
** \param signum  Ignored (needed by signal function)
*/

void	signal_sigint(int signum)
{
	(void)signum;
	if (g_state.killed || g_state.is_child)
		return ;
	if (g_child_pid != -1)
	{
		g_state.last_status = 130;
		if (kill(g_child_pid, SIGINT) != -1)
			ft_putchar('\n');
		g_state.killed = true;
	}
	else
	{
		ft_putchar('\n');
		print_prompt();
	}
}

/*
** \brief         Quit signal handler
**                If a child is running send him a SIGQUIT
** \param signum  Ignored (needed by signal function)
*/

void	signal_sigquit(int signum)
{
	if (g_state.killed)
		return ;
	(void)signum;
	if (g_child_pid != -1)
	{
		g_state.last_status = 131;
		kill(g_child_pid, SIGQUIT);
		g_state.killed = true;
		ft_putstr("Quit: 3\n");
	}
}

/*
** \brief         Term signal handler, does nothing
** \param signum  Ignored (needed by signal function)
*/

void	signal_sigterm(int signum)
{
	(void)signum;
}