provide return code from paging_request() function

this enables the caller to detect if the paging request was rejected
by the paging layer, especially in case it is already paging this very
subscriber.

In the case of SMS / 04.11, we used to have a memory leak of struct gsm_sms's,
since we would only free them from the paging succeeded/expired callbacks.
diff --git a/openbsc/src/gsm_04_11.c b/openbsc/src/gsm_04_11.c
index 2994d72..8ac596d 100644
--- a/openbsc/src/gsm_04_11.c
+++ b/openbsc/src/gsm_04_11.c
@@ -1025,6 +1025,7 @@
 			   struct gsm_sms *sms)
 {
 	struct gsm_lchan *lchan;
+	int rc;
 
 	/* check if we already have an open lchan to the subscriber.
 	 * if yes, send the SMS this way */
@@ -1034,8 +1035,10 @@
 				     rll_ind_cb, sms);
 
 	/* if not, we have to start paging */
-	paging_request(subscr->net, subscr, RSL_CHANNEED_SDCCH,
-			paging_cb_send_sms, sms);
+	rc = paging_request(subscr->net, subscr, RSL_CHANNEED_SDCCH,
+			    paging_cb_send_sms, sms);
+	if (rc < 0)
+		sms_free(sms);
 
 	return 0;
 }
diff --git a/openbsc/src/paging.c b/openbsc/src/paging.c
index dd22150..062eca8 100644
--- a/openbsc/src/paging.c
+++ b/openbsc/src/paging.c
@@ -213,7 +213,7 @@
 	paging_remove_request(&req->bts->paging, req);
 }
 
-static void _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
+static int _paging_request(struct gsm_bts *bts, struct gsm_subscriber *subscr,
 			    int type, gsm_cbfn *cbfn, void *data)
 {
 	struct gsm_bts_paging_state *bts_entry = &bts->paging;
@@ -221,7 +221,7 @@
 
 	if (paging_pending_request(bts_entry, subscr)) {
 		DEBUGP(DPAG, "Paging request already pending\n");
-		return;
+		return -EEXIST;
 	}
 
 	DEBUGP(DPAG, "Start paging of subscriber %llu on bts %d.\n",
@@ -239,12 +239,15 @@
 
 	if (!bsc_timer_pending(&bts_entry->work_timer))
 		bsc_schedule_timer(&bts_entry->work_timer, 1, 0);
+
+	return 0;
 }
 
-void paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
-		    int type, gsm_cbfn *cbfn, void *data)
+int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
+		   int type, gsm_cbfn *cbfn, void *data)
 {
 	struct gsm_bts *bts = NULL;
+	int rc;
 
 	/* start paging subscriber on all BTS within Location Area */
 	do {
@@ -252,9 +255,13 @@
 		if (!bts)
 			break;
 
-		/* Trigger paging */
-		_paging_request(bts, subscr, type, cbfn, data);
+		/* Trigger paging, pass any error to caller */
+		rc = _paging_request(bts, subscr, type, cbfn, data);
+		if (rc < 0)
+			return rc;
 	} while (1);
+
+	return 0;
 }