Branch data Line data Source code
1 : : #include "precizer.h"
2 : :
3 : : /**
4 : : * @brief Configure terminal input and handlers for graceful interruption
5 : : *
6 : : * Initialize signals interception like Ctrl+C
7 : : * The application controls signals like Ctrl+C to
8 : : * prevent database corruption.
9 : : * It always try to complete work in correct way and
10 : : * sync data from memory to disk even user interrupts
11 : : * running of the program. MSYS console sessions disable QuickEdit
12 : : * during processing so mouse selection does not pause file traversal
13 : : *
14 : : */
15 : 696 : Return init_signals(void)
16 : : {
17 : : /* Status returned by this function through provide()
18 : : Default value assumes successful completion */
19 : 696 : Return status = SUCCESS;
20 : :
21 : : /// Disable key echo in terminal
22 : : struct termios term;
23 : 696 : tcgetattr(fileno(stdin),&term);
24 : 696 : term.c_lflag &= (unsigned int)~(ICANON|ECHO); // knock down keybuffer
25 : 696 : tcsetattr(fileno(stdin),TCSANOW,&term);
26 : :
27 : : // kill -USR2 <pid>
28 [ - + ]: 696 : if((signal(SIGUSR2,&signal_notify_quit_handler)==SIG_ERR)!=0)
29 : : {
30 : 0 : slog(ERROR,"Failed set signal SIGUSR2\n");
31 : 0 : status = FAILURE;
32 : : } else {
33 : 696 : slog(TRACE,"Set signal SIGUSR2 OK:pid:%i\n",getpid());
34 : : }
35 : :
36 : : // Ctrl-C
37 [ - + ]: 696 : if((signal(SIGINT,&signal_notify_quit_handler)==SIG_ERR)!=0)
38 : : {
39 : 0 : slog(ERROR,"Failed set signal SIGINT\n");
40 : 0 : status = FAILURE;
41 : : } else {
42 : 696 : slog(TRACE,"Set signal SIGINT OK:pid:%i\n",getpid());
43 : : }
44 : :
45 : : // Default kill Termination signal (15)
46 [ - + ]: 696 : if((signal(SIGTERM,&signal_notify_quit_handler)==SIG_ERR)!=0)
47 : : {
48 : 0 : slog(ERROR,"Failed set signal SIGTERM\n");
49 : 0 : status = FAILURE;
50 : : } else {
51 : 696 : slog(TRACE,"Set signal SIGTERM OK:pid:%i\n",getpid());
52 : : }
53 : :
54 : : #ifdef __MSYS__
55 : : if(SUCCESS == status)
56 : : {
57 : : // Disable QuickEdit so mouse selection in the Windows console cannot pause file traversal
58 : : disable_console_quick_edit();
59 : : }
60 : : #endif
61 : :
62 : 696 : slog(TRACE,"Signals initialized\n");
63 : :
64 : 696 : provide(status);
65 : : }
|