Fix most compiler warnings with gcc-4.9.2
diff --git a/openbsc/include/openbsc/Makefile.am b/openbsc/include/openbsc/Makefile.am
index 8d989ff..b55a20c 100644
--- a/openbsc/include/openbsc/Makefile.am
+++ b/openbsc/include/openbsc/Makefile.am
@@ -15,7 +15,7 @@
 		bss.h gsm_data_shared.h ipaccess.h mncc_int.h \
 		arfcn_range_encode.h nat_rewrite_trie.h bsc_nat_callstats.h \
 		osmux.h mgcp_transcode.h rtp.h gprs_utils.h \
-		 gprs_gb_parse.h
+		 gprs_gb_parse.h smpp.h
 
 openbsc_HEADERS = gsm_04_08.h meas_rep.h bsc_api.h
 openbscdir = $(includedir)/openbsc
diff --git a/openbsc/include/openbsc/smpp.h b/openbsc/include/openbsc/smpp.h
new file mode 100644
index 0000000..9941cee
--- /dev/null
+++ b/openbsc/include/openbsc/smpp.h
@@ -0,0 +1,4 @@
+#pragma once
+
+int smpp_openbsc_init(void *ctx, uint16_t port);
+void smpp_openbsc_set_net(struct gsm_network *net);
diff --git a/openbsc/src/libbsc/bsc_api.c b/openbsc/src/libbsc/bsc_api.c
index 5ce0bc4..76ceb2d 100644
--- a/openbsc/src/libbsc/bsc_api.c
+++ b/openbsc/src/libbsc/bsc_api.c
@@ -89,6 +89,7 @@
 		channel = 0x9;
 		break;
 	case GSM_LCHAN_UNKNOWN:
+	default:
 		LOGP(DMSC, LOGL_ERROR, "Unknown lchan type: %p\n", lchan);
 		break;
 	}
@@ -416,7 +417,7 @@
 
 	gh = msgb_l3(msg);
 	if (msgb_l3len(msg) - sizeof(*gh) != 1) {
-		LOGP(DMSC, LOGL_ERROR, "Assignment Compl invalid: %u\n",
+		LOGP(DMSC, LOGL_ERROR, "Assignment Compl invalid: %zu\n",
 		     msgb_l3len(msg) - sizeof(*gh));
 		return;
 	}
@@ -461,7 +462,7 @@
 
 	gh = msgb_l3(msg);
 	if (msgb_l3len(msg) - sizeof(*gh) != 1) {
-		LOGP(DMSC, LOGL_ERROR, "assignemnt failure unhandled: %u\n",
+		LOGP(DMSC, LOGL_ERROR, "assignemnt failure unhandled: %zu\n",
 		     msgb_l3len(msg) - sizeof(*gh));
 		rr_failure = NULL;
 	} else {
diff --git a/openbsc/src/libmgcp/mgcp_protocol.c b/openbsc/src/libmgcp/mgcp_protocol.c
index 5df3577..f22dd20 100644
--- a/openbsc/src/libmgcp/mgcp_protocol.c
+++ b/openbsc/src/libmgcp/mgcp_protocol.c
@@ -309,7 +309,7 @@
 	return len;
 
 buffer_too_small:
-	LOGP(DMGCP, LOGL_ERROR, "SDP buffer too small: %d (needed %d)\n",
+	LOGP(DMGCP, LOGL_ERROR, "SDP buffer too small: %zd (needed %d)\n",
 	     size, len);
 	return -1;
 }
diff --git a/openbsc/src/osmo-nitb/bsc_hack.c b/openbsc/src/osmo-nitb/bsc_hack.c
index 753fd88..3517899 100644
--- a/openbsc/src/osmo-nitb/bsc_hack.c
+++ b/openbsc/src/osmo-nitb/bsc_hack.c
@@ -50,6 +50,7 @@
 #include <osmocom/ctrl/ports.h>
 #include <openbsc/ctrl.h>
 #include <openbsc/osmo_bsc_rf.h>
+#include <openbsc/smpp.h>
 
 #include "../../bscconfig.h"
 
diff --git a/openbsc/src/utils/smpp_mirror.c b/openbsc/src/utils/smpp_mirror.c
index 488c4a1..cf3657e 100644
--- a/openbsc/src/utils/smpp_mirror.c
+++ b/openbsc/src/utils/smpp_mirror.c
@@ -247,7 +247,7 @@
 	return 0;
 }
 
-static void esme_write_cb(struct osmo_fd *ofd, struct msgb *msg)
+static int esme_write_cb(struct osmo_fd *ofd, struct msgb *msg)
 {
 	struct esme *esme = ofd->data;
 	int rc;
@@ -260,8 +260,10 @@
 		exit(99);
 	} else if (rc < msgb_length(msg)) {
 		LOGP(DSMPP, LOGL_ERROR, "[%s] Short write\n", esme->system_id);
-		return;
+		return 0;
 	}
+
+	return 0;
 }
 
 static int smpp_esme_init(struct esme *esme, const char *host, uint16_t port)
diff --git a/openbsc/tests/abis/abis_test.c b/openbsc/tests/abis/abis_test.c
index e7e78d2..df270bf 100644
--- a/openbsc/tests/abis/abis_test.c
+++ b/openbsc/tests/abis/abis_test.c
@@ -61,11 +61,11 @@
 	}
 
 	if (descr[0].len != 13) {
-		printf("WRONG SIZE: %d\n", descr[0].len);
+		printf("WRONG SIZE: %zu\n", descr[0].len);
 		abort();
 	}
 
-	printf("Start: %u len: %zu\n", descr[0].start - simple_config, descr[0].len);
+	printf("Start: %ld len: %zu\n", descr[0].start - simple_config, descr[0].len);
 	printf("file_id:  %s\n", osmo_hexdump(descr[0].file_id, descr[0].file_id_len));
 	printf("file_ver: %s\n", osmo_hexdump(descr[0].file_ver, descr[0].file_ver_len));
 }
@@ -99,20 +99,20 @@
 	}
 
 	if (descr[0].len != 13) {
-		printf("WRONG SIZE0: %d\n", descr[0].len);
+		printf("WRONG SIZE0: %zu\n", descr[0].len);
 		abort();
 	}
 
 	if (descr[1].len != 13) {
-		printf("WRONG SIZE1: %d\n", descr[1].len);
+		printf("WRONG SIZE1: %zu\n", descr[1].len);
 		abort();
 	}
 
-	printf("Start: %u len: %zu\n", descr[0].start - dual_config, descr[0].len);
+	printf("Start: %ld len: %zu\n", descr[0].start - dual_config, descr[0].len);
 	printf("file_id:  %s\n", osmo_hexdump(descr[0].file_id, descr[0].file_id_len));
 	printf("file_ver: %s\n", osmo_hexdump(descr[0].file_ver, descr[0].file_ver_len));
 
-	printf("Start: %u len: %zu\n", descr[1].start - dual_config, descr[1].len);
+	printf("Start: %ld len: %zu\n", descr[1].start - dual_config, descr[1].len);
 	printf("file_id:  %s\n", osmo_hexdump(descr[1].file_id, descr[1].file_id_len));
 	printf("file_ver: %s\n", osmo_hexdump(descr[1].file_ver, descr[1].file_ver_len));
 }
@@ -129,11 +129,11 @@
 		abort();
 	}
 
-	printf("Start: %u len: %zu\n", descr[0].start - load_config, descr[0].len);
+	printf("Start: %ld len: %zu\n", descr[0].start - load_config, descr[0].len);
 	printf("file_id:  %s\n", osmo_hexdump(descr[0].file_id, descr[0].file_id_len));
 	printf("file_ver: %s\n", osmo_hexdump(descr[0].file_ver, descr[0].file_ver_len));
 
-	printf("Start: %u len: %zu\n", descr[1].start - load_config, descr[1].len);
+	printf("Start: %ld len: %zu\n", descr[1].start - load_config, descr[1].len);
 	printf("file_id:  %s\n", osmo_hexdump(descr[1].file_id, descr[1].file_id_len));
 	printf("file_ver: %s\n", osmo_hexdump(descr[1].file_ver, descr[1].file_ver_len));
 
diff --git a/openbsc/tests/gbproxy/gbproxy_test.c b/openbsc/tests/gbproxy/gbproxy_test.c
index 0fc8af2..0c18ab7 100644
--- a/openbsc/tests/gbproxy/gbproxy_test.c
+++ b/openbsc/tests/gbproxy/gbproxy_test.c
@@ -956,7 +956,7 @@
 int gprs_ns_callback(enum gprs_ns_evt event, struct gprs_nsvc *nsvc,
 			 struct msgb *msg, uint16_t bvci)
 {
-	printf("CALLBACK, event %d, msg length %d, bvci 0x%04x\n%s\n\n",
+	printf("CALLBACK, event %d, msg length %ld, bvci 0x%04x\n%s\n\n",
 			event, msgb_bssgp_len(msg), bvci,
 			osmo_hexdump(msgb_l2(msg), msgb_l2len(msg)));
 
@@ -983,15 +983,15 @@
 		real_sendto = dlsym(RTLD_NEXT, "sendto");
 
 	if (dest_host == REMOTE_BSS_ADDR)
-		printf("MESSAGE to BSS at 0x%08x:%d, msg length %d\n%s\n\n",
+		printf("MESSAGE to BSS at 0x%08x:%d, msg length %zu\n%s\n\n",
 		       dest_host, dest_port,
 		       len, osmo_hexdump(buf, len));
 	else if (dest_host == REMOTE_SGSN_ADDR)
-		printf("MESSAGE to SGSN at 0x%08x:%d, msg length %d\n%s\n\n",
+		printf("MESSAGE to SGSN at 0x%08x:%d, msg length %zu\n%s\n\n",
 		       dest_host, dest_port,
 		       len, osmo_hexdump(buf, len));
 	else if (dest_host == REMOTE_SGSN2_ADDR)
-		printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %d\n%s\n\n",
+		printf("MESSAGE to SGSN 2 at 0x%08x:%d, msg length %zu\n%s\n\n",
 		       dest_host, dest_port,
 		       len, osmo_hexdump(buf, len));
 	else
@@ -1015,15 +1015,15 @@
 
 	if (nsei == SGSN_NSEI)
 		printf("NS UNITDATA MESSAGE to SGSN, BVCI 0x%04x, "
-		       "msg length %d (%s)\n",
+		       "msg length %zu (%s)\n",
 		       bvci, len, __func__);
 	else if (nsei == SGSN2_NSEI)
 		printf("NS UNITDATA MESSAGE to SGSN 2, BVCI 0x%04x, "
-		       "msg length %d (%s)\n",
+		       "msg length %zu (%s)\n",
 		       bvci, len, __func__);
 	else
 		printf("NS UNITDATA MESSAGE to BSS, BVCI 0x%04x, "
-		       "msg length %d (%s)\n",
+		       "msg length %zu (%s)\n",
 		       bvci, len, __func__);
 
 	if (received_messages) {
@@ -1253,7 +1253,7 @@
 	struct msgb *msg;
 	int ret;
 	if (data_len > NS_ALLOC_SIZE - NS_ALLOC_HEADROOM) {
-		fprintf(stderr, "message too long: %d\n", data_len);
+		fprintf(stderr, "message too long: %zu\n", data_len);
 		return -1;
 	}