Implement put_channel/get_channel, save on which bts we currently operate

Allow to change the refcount for a given channel. Store which
bts is our primary bts. A command to switch the primary bts will
be added as well. This makes entering and parsing of commands more
easy.
diff --git a/src/telnet_interface.c b/src/telnet_interface.c
index 6875548..dc93df1 100644
--- a/src/telnet_interface.c
+++ b/src/telnet_interface.c
@@ -27,6 +27,7 @@
 
 #include <openbsc/telnet_interface.h>
 #include <openbsc/gsm_subscriber.h>
+#include <openbsc/chan_alloc.h>
 
 extern void telnet_parse(struct telnet_connection *connection, char *line);
 
@@ -136,12 +137,50 @@
 	printf("going to page: '%s' %d\n", imsi, page);
 }
 
+static struct gsm_lchan* find_channel(struct gsm_bts *bts, const char *imsi,
+			    const char **error, int fd) {
+	int ret;
+	struct gsm_lchan *lchan;
+	struct gsm_subscriber *subscr;
+
+	subscr = subscr_get_by_imsi(imsi);
+	if (!subscr) {
+		ret = write(fd, error[0], strlen(error[0]));
+		return NULL;
+	}
+
+	lchan = lchan_find(bts, subscr);
+	if (!lchan)
+		ret = write(fd, error[1], strlen(error[1]));
+
+	subscr_put(subscr);
+	return lchan;
+}
+
 void telnet_put_channel(struct telnet_connection *connection, const char *imsi) {
-	printf("put_channel: '%s'\n", imsi);
+	static const char* error[] = {
+		"put_channel: IMSI not found\n",
+		"put_channel: No channel allocated for IMSI\n" };
+	struct gsm_bts *bts = &connection->network->bts[connection->bts];
+	struct gsm_lchan *lchan = find_channel(bts, imsi, error, connection->fd.fd);
+
+	if (!lchan)
+		return;
+
+	put_lchan(lchan);
 }
 
 void telnet_get_channel(struct telnet_connection *connection, const char *imsi) {
-	printf("get_channel: '%s'\n", imsi);
+	static const char* error[] = {
+		"get_channel: IMSI not found\n",
+		"get_channel: No channel allocated for IMSI\n" };
+	struct gsm_bts *bts = &connection->network->bts[connection->bts];
+	struct gsm_lchan *lchan = find_channel(bts, imsi, error, connection->fd.fd);
+
+	if (!lchan)
+		return;
+
+	use_lchan(lchan);
 }
 
 void telnet_call(struct telnet_connection *connection, const char* imsi,
@@ -245,6 +284,7 @@
 	connection->fd.fd = new_connection;
 	connection->fd.when = BSC_FD_READ;
 	connection->fd.cb = client_data;
+	connection->bts = 0;
 	bsc_register_fd(&connection->fd);
 	llist_add_tail(&connection->entry, &active_connections);