modify the signal handler/dispatch code (sorry zecke, no offense, I just had some different ideas)
* introduce new notion of subsystem in addition to signal number
* no need for bitmasks of 'areas' (aka subsystems)
* pass subsystem/signal_nr/... per argument rather than by data structure

diff --git a/src/gsm_04_08.c b/src/gsm_04_08.c
index 0d889fb..c69e246 100644
--- a/src/gsm_04_08.c
+++ b/src/gsm_04_08.c
@@ -685,6 +685,7 @@
 	u_int8_t mi_type = pr->mi[0] & GSM_MI_TYPE_MASK;
 	char mi_string[MI_SIZE];
 	struct gsm_subscriber *subscr;
+	struct paging_signal_data sig_data;
 	int rc = 0;
 
 	mi_to_string(mi_string, sizeof(mi_string), &pr->mi[0], pr->mi_len);
@@ -707,15 +708,11 @@
 		subscr_put(subscr);
 	}
 
-	struct paging_signal_data sig_data = {
-		.data = {
-			.area = S_PAGING,
-		},
-		.subscr = subscr,
-		.bts	= msg->lchan->ts->trx->bts,
-		.lchan	= msg->lchan,
-	};
-	dispatch_signal(&sig_data.data);
+	sig_data.subscr = subscr;
+	sig_data.bts	= msg->lchan->ts->trx->bts;
+	sig_data.lchan	= msg->lchan;
+
+	dispatch_signal(SS_PAGING, S_PAGING_COMPLETED, &sig_data);
 	paging_request_stop(msg->trx->bts, subscr);
 
 	/* FIXME: somehow signal the completion of the PAGING to
diff --git a/src/gsm_04_11.c b/src/gsm_04_11.c
index d354663..a7b603e 100644
--- a/src/gsm_04_11.c
+++ b/src/gsm_04_11.c
@@ -119,14 +119,7 @@
 			"UserData: \"%s\"\n", sms->mti, sms->vpf, sms->msg_ref,
 			sms->pid, sms->dcs, sms->ud_len, sms->user_data);
 
-	struct sms_signal_data sig = {
-		.data = {
-			.area   = S_SMS,
-		},
-
-		.sms = sms,
-	};
-	dispatch_signal(&sig.data);
+	dispatch_signal(SS_SMS, 0, sms);
 
 	free(sms);
 
diff --git a/src/paging.c b/src/paging.c
index ed40c07..8597463 100644
--- a/src/paging.c
+++ b/src/paging.c
@@ -164,7 +164,7 @@
 	INIT_LLIST_HEAD(&bts->paging.pending_requests);
 
 	/* Large number, until we get a proper message */
-	bts->paging.available_slots = 0x0;
+	bts->paging.available_slots = 10;
 }
 
 static int paging_pending_request(struct gsm_bts_paging_state *bts,
@@ -182,20 +182,16 @@
 static void paging_T3113_expired(void *data)
 {
 	struct gsm_paging_request *req = (struct gsm_paging_request *)data;
+	struct paging_signal_data sig_data;
 
 	DEBUGP(DPAG, "T3113 expired for request %p (%s)\n",
 		req, req->subscr->imsi);
 	
-	struct paging_signal_data sig_data = {
-		.data = {
-			.area = S_PAGING,
-		},
-		.subscr = req->subscr,
-		.bts	= req->bts,
-		.lchan	= NULL,
-	};
+	sig_data.subscr = req->subscr,
+	sig_data.bts	= req->bts,
+	sig_data.lchan	= NULL,
 
-	dispatch_signal(&sig_data.data);
+	dispatch_signal(SS_PAGING, S_PAGING_COMPLETED, &sig_data);
 	paging_remove_request(&req->bts->paging, req);
 }
 
diff --git a/src/signal.c b/src/signal.c
index 7eae4d9..a7fc28e 100644
--- a/src/signal.c
+++ b/src/signal.c
@@ -27,34 +27,39 @@
 
 struct signal_handler {
 	struct llist_head entry;
-	int areas;
-
-	int (*sig_handler)(struct signal_data *, void*);
+	unsigned int subsys;
+	signal_cbfn *cbfn;
 	void *data;
 };
 
 
-void register_signal_handler(int areas,
-	int (*handler)(struct signal_data *, void *), void *data)
+int register_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data)
 {
-	struct signal_handler *sig_data =
-		(struct signal_handler *)malloc(sizeof(*sig_data));
+	struct signal_handler *sig_data = malloc(sizeof(*sig_data));
+
+	if (!sig_data)
+		return -ENOMEM;
+
 	memset(sig_data, 0, sizeof(*sig_data));
 
-
-	sig_data->areas = areas;
+	sig_data->subsys = subsys;
 	sig_data->data = data;
-	sig_data->sig_handler = handler;
+	sig_data->cbfn = cbfn;
+
+	/* FIXME: check if we already have a handler for this subsys/cbfn/data */
+
 	llist_add_tail(&sig_data->entry, &signal_handler_list);
+
+	return 0;
 }
 
-void remove_signal_handler(int areas, int (*sig_handler)(struct signal_data *, void *), void *data)
+void unregister_signal_handler(unsigned int subsys, signal_cbfn *cbfn, void *data)
 {
 	struct signal_handler *handler;
 
 	llist_for_each_entry(handler, &signal_handler_list, entry) {
-		if (handler->sig_handler == sig_handler
-		    && handler->data == data && areas == handler->areas) {
+		if (handler->cbfn == cbfn && handler->data == data 
+		    && subsys == handler->subsys) {
 			llist_del(&handler->entry);
 			free(handler);
 			break;
@@ -63,13 +68,13 @@
 }
 
 
-void dispatch_signal(struct signal_data *data)
+void dispatch_signal(unsigned int subsys, unsigned int signal, void *signal_data)
 {
 	struct signal_handler *handler;
 
 	llist_for_each_entry(handler, &signal_handler_list, entry) {
-		if (handler->areas & data->area) {
-		    (*handler->sig_handler)(data, handler->data);
-		}
+		if (handler->subsys != subsys)
+			continue;
+		(*handler->cbfn)(subsys, signal, handler->data, signal_data);
 	}
 }
diff --git a/src/telnet_interface.c b/src/telnet_interface.c
index b9ef139..e889e74 100644
--- a/src/telnet_interface.c
+++ b/src/telnet_interface.c
@@ -49,8 +49,10 @@
 
 /* per network data */
 static int telnet_new_connection(struct bsc_fd *fd, unsigned int what);
-static int telnet_paging_callback(struct signal_data *signal, void *data);
-static int telnet_sms_callback(struct signal_data *signal, void *data);
+static int telnet_paging_callback(unsigned int subsys, unsigned int signal,
+				  void *handler_data, void *signal_data);
+static int telnet_sms_callback(unsigned int subsys, unsigned int signal,
+				void *handler_data, void *signal_data);
 
 static struct bsc_fd server_socket = {
 	.when	    = BSC_FD_READ,
@@ -91,8 +93,8 @@
 	bsc_register_fd(&server_socket);
 
 	/* register callbacks */
-	register_signal_handler(S_PAGING, telnet_paging_callback, network);
-	register_signal_handler(S_SMS, telnet_sms_callback, network);
+	register_signal_handler(SS_PAGING, telnet_paging_callback, network);
+	register_signal_handler(SS_SMS, telnet_sms_callback, network);
 }
 
 void telnet_write_help(int fd) {
@@ -187,6 +189,7 @@
 		return;
 
 	paging_request(bts, subscr, type);	
+	paging_update_buffer_space(bts, 100);
 }
 
 void telnet_put_channel(struct telnet_connection *connection, const char *imsi) {
@@ -364,10 +367,10 @@
 	return 0;
 }
 
-static int telnet_paging_callback(struct signal_data *signal, void *data)
+static int telnet_paging_callback(unsigned int subsys, unsigned int singal,
+				  void *handler_data, void *signal_data)
 {
-	struct paging_signal_data *paging =
-		(struct paging_signal_data *) signal;
+	struct paging_signal_data *paging = signal_data;
 	struct telnet_connection *con;
 
 	llist_for_each_entry(con, &active_connections, entry) {
@@ -385,14 +388,14 @@
 	return 0;
 }
 
-static int telnet_sms_callback(struct signal_data *signal, void *data)
+static int telnet_sms_callback(unsigned int subsys, unsigned int signal,
+				void *handler_data, void *signal_data)
 {
-	struct sms_signal_data *sms =
-		(struct sms_signal_data *) signal;
+	struct sms_submit *sms = signal_data;
 	struct telnet_connection *con;
 
 	llist_for_each_entry(con, &active_connections, entry) {
-		WRITE_CONNECTION(con->fd.fd, "Incoming SMS: %s\n", sms->sms->user_data);
+		WRITE_CONNECTION(con->fd.fd, "Incoming SMS: %s\n", sms->user_data);
 	}
 
 	return 0;