make telnet interface use VTY code

diff --git a/src/telnet_interface.c b/src/telnet_interface.c
index 3d3ed76..422af3b 100644
--- a/src/telnet_interface.c
+++ b/src/telnet_interface.c
@@ -35,8 +35,6 @@
 #include <openbsc/paging.h>
 #include <openbsc/signal.h>
 
-extern void telnet_parse(struct telnet_connection *connection, char *line);
-
 #define WRITE_CONNECTION(fd, msg...) \
 	int ret; \
 	char buf[4096]; \
@@ -64,6 +62,8 @@
 	struct sockaddr_in sock_addr;
 	int fd, on = 1;
 
+	bsc_vty_init(network);
+
 	fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
 	if (fd < 0) {
@@ -93,26 +93,10 @@
 	bsc_register_fd(&server_socket);
 
 	/* register callbacks */
+#if 0
 	register_signal_handler(SS_PAGING, telnet_paging_callback, network);
 	register_signal_handler(SS_SMS, telnet_sms_callback, network);
-}
-
-void telnet_write_help(int fd) {
-	int ret;
-	static char *msg =
-		"Help for the ad-hoc telnet command line interface\n"
-		"The generic pattern is CMD LEN DATA\\n or just CMD\n"
-		"where CMD is one of the following:\n"
-		"help\n"
-		"page IMSI (type)\n"
-		"call IMSI (number)\n"
-		"get_channel IMSI Add use count on an active channel\n"
-		"put_channel IMSI Remove use count on an active channel\n"
-		"show  This will show the channel allocation\n"
-		"48 IMSI 0xAB 0xEF...Send GSM 04.08. proto and msg byte then data\n"
-		"11 IMSI 0xAB 0xEF...Send GSM 04.11\n";
-
-	ret = write(fd, msg, strlen(msg));
+#endif
 }
 
 static void print_welcome(int fd) {
@@ -142,200 +126,10 @@
 	return 0;
 }
 
-void telnet_error_client(int fd) {
-	int ret;
-	static char *msg = "Something went wrong. Please try again.\n";
-
-	printf("Error\n");
-	ret = write(fd, msg, strlen(msg));
-}
-
-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_page(struct telnet_connection *connection, const char *imsi, int type) {
-	int ret;
-	static const char* error[] = {
-		"paging: IMSI not found\n",
-		"paging: No channel allocated for IMSI -> will allocate\n" };
-	struct gsm_bts *bts = &connection->network->bts[connection->bts];
-	struct gsm_lchan *lchan = find_channel(bts, imsi, error, connection->fd.fd);
-
-	if (lchan) {
-		static const char *msg = "paging: A Channel is already allocated.\n";
-		ret = write(connection->fd.fd, msg, strlen(msg));
-		return;
-	}
-
-	struct gsm_subscriber *subscr = subscr_get_by_imsi(imsi);
-	if (!subscr)
-		return;
-
-	paging_request(bts, subscr, type, NULL, NULL);	
-}
-
-void telnet_put_channel(struct telnet_connection *connection, const char *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) {
-	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,
-		const char *origin) {
-	static const char* error[] = {
-		"call: IMSI not found\n",
-		"call: 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;
-
-	/* TODO: add the origin */
-	gsm48_cc_tx_setup(lchan, NULL);
-}
-
-void telnet_send_gsm_48(struct telnet_connection *connection) {
-	static const char* error[] = {
-		"48: IMSI not found\n",
-		"48: No channel allocated for IMSI\n" };
-	int ret;
-	struct gsm_bts *bts = &connection->network->bts[connection->bts];
-	struct gsm_lchan *lchan = find_channel(bts, connection->imsi, error, connection->fd.fd);
-
-	if (!lchan)
-		return;
-
-	if (connection->read < 2) {
-		static const char *msg = "48: Need at least two bytes";
-		ret = write(connection->fd.fd, msg, strlen(msg));
-		return;
-	}
-
-	struct msgb *msg = gsm48_msgb_alloc();
-	struct gsm48_hdr *gh;
-	int i;
-
-	gh = (struct gsm48_hdr *) msgb_put(msg, sizeof(*gh) + connection->read-2);
-	msg->lchan = lchan;
-
-	gh->proto_discr = connection->commands[0];
-	gh->msg_type = connection->commands[1];
-	for (i = 2; i < connection->read; ++i)
-	    gh->data[i-2] = connection->commands[i];
-
-	gsm48_sendmsg(msg);
-}
-
-void telnet_send_gsm_11(struct telnet_connection *connection) {
-	printf("sending gsm04.11 message\n");
-}
-
-static void show_bts(int fd, struct gsm_bts *bts) {
-	WRITE_CONNECTION(fd,
-		 "BTS #%u on link %u  LOC: %u TRX: %d CCCH0: arfcn:%u,#%u\n",
-		 bts->nr, bts->bts_nr, bts->location_area_code,
-		 bts->num_trx, bts->c0->arfcn, bts->c0->nr)
-}
-
-static void show_trx(int fd, struct gsm_bts_trx *trx) {
-	WRITE_CONNECTION(fd,
-		 "  TRX: %u ARFCN: %u\n",
-		trx->nr, trx->arfcn)
-}
-
-static void show_ts(int fd, struct gsm_bts_trx_ts *ts) {
-	WRITE_CONNECTION(fd,
-		"     TS: #%u pchan: %12s flags: %u\n",
-		ts->nr, gsm_pchan_name(ts->pchan), ts->flags);
-}
-
-static void show_lchan(int fd, struct gsm_lchan *lchan) {
-	struct gsm_subscriber *subscr = lchan->subscr;
-	WRITE_CONNECTION(fd,
-		"       LCHAN: #%u type: %7s  count: %d subscriber: %s/%s/%s use: %d loc: %p\n",
-		lchan->nr, gsm_lchan_name(lchan->type),
-		lchan->use_count,
-		subscr ? subscr->imsi : "na",
-		subscr ? subscr->tmsi : "na",
-		subscr ? subscr->name : "na",
-		lchan->use_count, lchan->loc_operation);
-}
-
-void telnet_list_channels(struct telnet_connection *connection) {
-	int bts_no, trx, lchan_no, ts_no;
-	struct gsm_network *network = connection->network;
-
-	for (bts_no = 0; bts_no < network->num_bts; ++bts_no) {
-		struct gsm_bts *bts = &network->bts[bts_no];
-		show_bts(connection->fd.fd, bts);
-
-		for (trx = 0; trx < bts->num_trx; ++trx) {
-			show_trx(connection->fd.fd, &bts->trx[trx]);
-			for (ts_no = 0; ts_no < 8; ++ts_no) {
-				show_ts(connection->fd.fd, &bts->trx[trx].ts[ts_no]);
-				for (lchan_no = 0; lchan_no < TS_MAX_LCHAN; ++lchan_no) {
-					struct gsm_lchan *lchan =
-						&bts->trx[trx].ts[ts_no].lchan[lchan_no];
-					show_lchan(connection->fd.fd, lchan);
-				}
-			}
-		}
-	}
-}
-
-static int client_data(struct bsc_fd *fd, unsigned int what) {
-	char buf[4096];
-	int ret;
-
-	ret = read(fd->fd, buf, sizeof(buf)-1);
-	buf[ret] = '\0';
-
-	/* connection is gone */
-	if (ret <= 0)
-		return telnet_close_client(fd);
-
-	/* time to parse. This code assumes that the input is line based */
-	telnet_parse((struct telnet_connection*)fd->data, buf);
-
-	return 0;
+static int client_data(struct bsc_fd *fd, unsigned int what)
+{
+	struct telnet_connection *conn = fd->data;
+	return vty_read(conn->vty);
 }
 
 static int telnet_new_connection(struct bsc_fd *fd, unsigned int what) {
@@ -363,9 +157,14 @@
 
 	print_welcome(new_connection);
 
+	connection->vty = vty_create(new_connection);
+	if (!connection->vty)
+		return -1;
+
 	return 0;
 }
 
+#if 0
 static int telnet_paging_callback(unsigned int subsys, unsigned int singal,
 				  void *handler_data, void *signal_data)
 {
@@ -399,3 +198,4 @@
 
 	return 0;
 }
+#endif