[signal] Move the area into the struct signal_data...

Remove the parameter and move the signal kind into the
signal struct. Make register/deregister fully symmetric.
diff --git a/include/openbsc/signal.h b/include/openbsc/signal.h
index 6a0d6fb..eb4fc8d 100644
--- a/include/openbsc/signal.h
+++ b/include/openbsc/signal.h
@@ -32,6 +32,7 @@
 
 
 struct signal_data {
+	int area;
 };
 
 
@@ -48,10 +49,10 @@
 
 /* Management */
 void register_signal_handler(int areas, int (*sig)(struct signal_data *, void *data), void *data);
-void remove_signal_handler(int (*sig)(struct signal_data *, void *data), void *data);
+void remove_signal_handler(int areas, int (*sig)(struct signal_data *, void *data), void *data);
 
 /* Dispatch */
-void dispatch_signal(int area, struct signal_data *data);
+void dispatch_signal(struct signal_data *data);
 
 
 #endif
diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c
index 6776632..4d77d5d 100644
--- a/src/gsm_04_08.c
+++ b/src/gsm_04_08.c
@@ -701,11 +701,14 @@
 		subscr->name ? subscr->name : subscr->imsi);
 
 	struct paging_signal_data sig_data = {
+		.data = {
+			.area = S_PAGING,
+		},
 		.subscr = subscr,
 		.bts	= msg->lchan->ts->trx->bts,
 		.lchan	= msg->lchan,
 	};
-	dispatch_signal(S_PAGING, &sig_data.data);
+	dispatch_signal(&sig_data.data);
 	paging_request_stop(msg->trx->bts, subscr);
 
 	if (!msg->lchan->subscr)
diff --git a/src/paging.c b/src/paging.c
index 761facd..c7fccad 100644
--- a/src/paging.c
+++ b/src/paging.c
@@ -185,12 +185,15 @@
 		req, req->subscr->imsi);
 	
 	struct paging_signal_data sig_data = {
+		.data = {
+			.area = S_PAGING,
+		},
 		.subscr = req->subscr,
 		.bts	= req->bts,
 		.lchan	= NULL,
 	};
 
-	dispatch_signal(S_PAGING, &sig_data.data);
+	dispatch_signal(&sig_data.data);
 	paging_remove_request(&req->bts->paging, req);
 }
 
diff --git a/src/signal.c b/src/signal.c
index d4a4a7c..ea00672 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -48,12 +48,13 @@
 	llist_add_tail(&signal_handler_list, &sig_data->entry);
 }
 
-void remove_signal_handler(int (*sig_handler)(struct signal_data *, void *), void *data)
+void remove_signal_handler(int areas, int (*sig_handler)(struct signal_data *, void *), void *data)
 {
 	struct signal_handler *handler;
 
 	llist_for_each_entry(handler, &signal_handler_list, entry) {
-		if (handler->sig_handler == sig_handler && handler->data == data) {
+		if (handler->sig_handler == sig_handler
+		    && handler->data == data && areas == handler->areas) {
 			llist_del(&handler->entry);
 			free(handler);
 			break;
@@ -62,12 +63,12 @@
 }
 
 
-void dispatch_signal(int area, struct signal_data *data)
+void dispatch_signal(struct signal_data *data)
 {
 	struct signal_handler *handler;
 
 	llist_for_each_entry(handler, &signal_handler_list, entry) {
-		if (handler->areas & area) {
+		if (handler->areas & data->area) {
 		    (*handler->sig_handler)(data, handler->data);
 		}
 	}