File: signal.c

package info (click to toggle)
melon 1.4-1
  • links: PTS
  • area: main
  • in suites: woody
  • size: 956 kB
  • ctags: 158
  • sloc: ansic: 2,427; makefile: 91; sh: 58
file content (149 lines) | stat: -rw-r--r-- 2,855 bytes parent folder | download
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* signal.c -- signals handling
 *
 * Copyright(C) 2001-2002 Elisa Manara <e@entropika.net>
 * This code is released under the GPL License version 2 */


#include <gtk/gtk.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "melon.h"
#include "def.h"

volatile sig_atomic_t end_signal = 0;
volatile sig_atomic_t open_signal = 0;
volatile sig_atomic_t reset_signal = 0;

extern int ignore_pid;

void melon_signals_connect(void);
int melon_error(const char *fmt, ...);
void set_pid_file(char *pid_file_path);
pid_t check_pid(void);
void unset_all (GtkWidget *widget, gpointer data);
gint see_mail (GtkWidget *widget, char *mbox);
void melon_end(void);

gint melon_handle_signals(gpointer data)
{
	if(end_signal) {
		/* TODO: esce sempre con 0??? */
		melon_end();
		exit(0);
	}

	if(open_signal) {
		if (cfg_data.mbox[1][0] == '\0' || none_active_mbox())
			see_mail(NULL, NULL);
		else
			see_mail(NULL, active_mbox[0]);

		open_signal = 0;
	}

	if(reset_signal) {
		unset_all(NULL, NULL);
		reset_signal = 0;
	}

	return 1;
}
	
void sig_handler(int signum)
{
	switch(signum) {
	case SIGINT:
	case SIGQUIT:
	case SIGILL:
	case SIGSEGV:
	case SIGPIPE:
	case SIGTERM:
	case SIGSTOP:
		end_signal++;
		break;
	case SIGUSR1:
		open_signal++;
		break;
	case SIGUSR2:
		reset_signal++;
		break;
	case SIGHUP:
		break;
	default:
	}
}

void melon_signals_connect(void)
{
	signal(SIGHUP,  sig_handler);
	signal(SIGINT,  sig_handler);
	signal(SIGQUIT, sig_handler);
	signal(SIGILL,  sig_handler);
	signal(SIGSEGV, sig_handler);
	signal(SIGPIPE, sig_handler);
	signal(SIGTERM, sig_handler);
	signal(SIGSTOP, sig_handler);
	signal(SIGUSR1, sig_handler);
	signal(SIGUSR2, sig_handler);
}

void melon_init_control(int argc, char **argv) 
{
	pid_t running_pid;
	char action_c[16];

	action_c[0] = '\0';

	running_pid=check_pid();
	if(running_pid < 0) {
		melon_error("Pid error");
		exit(1);
	}
	if(running_pid == 0)
		/* no other melon is running */
		return;

	/* an other melon is running.
	 * We check if there is a good reason
	 * for calling it ;)
	 */
	if(argc > 1) {
		if((strcmp(argv[1], "open")) == 0) {
			kill(running_pid, SIGUSR1);
			exit(0);
		} else if ((strcmp(argv[1], "reset")) == 0) {
			kill(running_pid, SIGUSR2);
			exit(0);
		} else if ((strcmp(argv[1], "stop")) == 0) {
			kill(running_pid, SIGINT);
			exit(0);
		}
	}

	fprintf(stderr, "A melon pid file was found. Maybe another melon "
		"is already running. \n");
	fprintf(stderr, "(I)gnore, (O)verwrite, (Q)uit? ");
	fflush(stderr);
	while(fgets(action_c, 16, stdin)) {
		//printf("action: %s\n", action_c);
		switch(action_c[0]) {
		case 'i':
		case 'I':
			ignore_pid = 1;
			return;
		case 'o':
		case 'O':
			return;
		case 'q':
		case 'Q':
			exit(0);
		default:
			fprintf(stderr, "(I)gnore, (O)verwrite, (Q)uit? ");
			fflush(stderr);
		}
	}
}