[VTY] restructure sms and silent sms commands
diff --git a/openbsc/src/vty_interface_layer3.c b/openbsc/src/vty_interface_layer3.c
index 6fe209e..53b5960 100644
--- a/openbsc/src/vty_interface_layer3.c
+++ b/openbsc/src/vty_interface_layer3.c
@@ -205,89 +205,60 @@
 	return CMD_SUCCESS;
 }
 
-DEFUN(sms_send_ext,
-      sms_send_ext_cmd,
-      "sms send extension EXTEN .LINE",
-      "Send a message to a subscriber identified by EXTEN")
+static struct gsm_subscriber *get_subscr_by_argv(const char *type,
+						 const char *id)
 {
-	struct gsm_subscriber *receiver;
+	if (!strcmp(type, "extension"))
+		return subscr_get_by_extension(gsmnet, id);
+	else if (!strcmp(type, "imsi"))
+		return subscr_get_by_imsi(gsmnet, id);
+	else if (!strcmp(type, "tmsi"))
+		return subscr_get_by_tmsi(gsmnet, atoi(id));
+	else if (!strcmp(type, "id"))
+		return subscr_get_by_id(gsmnet, atoi(id));
+
+	return NULL;
+}
+#define SUBSCR_TYPES "(extension|imsi|tmsi|id)"
+
+DEFUN(subscriber_send_sms,
+      subscriber_send_sms_cmd,
+      "subscriber " SUBSCR_TYPES " EXTEN sms send .LINE",
+      "Select subscriber based on extension")
+{
+	struct gsm_subscriber *subscr = get_subscr_by_argv(argv[0], argv[1]);
 	struct buffer *b;
 	int rc;
 
-	receiver = subscr_get_by_extension(gsmnet, argv[0]);
-	if (!receiver)
+	if (!subscr)
 		return CMD_WARNING;
 
-	b = argv_to_buffer(argc, argv, 1);
-	rc = _send_sms_buffer(receiver, b, 0);
+	b = argv_to_buffer(argc, argv, 2);
+	rc = _send_sms_buffer(subscr, b, 0);
 	buffer_free(b);
 
 	return rc;
 }
 
-DEFUN(sms_send_silent_ext,
-      sms_send_silent_ext_cmd,
-      "sms send silent extension EXTEN .LINE",
-      "Send a silent message to a subscriber identified by EXTEN")
+DEFUN(subscriber_silent_sms,
+      subscriber_silent_sms_cmd,
+      "subscriber " SUBSCR_TYPES " EXTEN silent sms send .LINE",
+      "Select subscriber based on extension")
 {
-	struct gsm_subscriber *receiver;
+	struct gsm_subscriber *subscr = get_subscr_by_argv(argv[0], argv[1]);
 	struct buffer *b;
 	int rc;
 
-	receiver = subscr_get_by_extension(gsmnet, argv[0]);
-	if (!receiver)
+	if (!subscr)
 		return CMD_WARNING;
 
-	b = argv_to_buffer(argc, argv, 1);
-	rc = _send_sms_buffer(receiver, b, 64);
-	buffer_free(b);
-	subscr_put(receiver);
-
-	return rc;
-}
-
-DEFUN(sms_send_imsi,
-      sms_send_imsi_cmd,
-      "sms send imsi IMSI .LINE",
-      "Send a message to a subscriber identified by IMSI")
-{
-	struct gsm_subscriber *receiver;
-	struct buffer *b;
-	int rc;
-
-	receiver = subscr_get_by_imsi(gsmnet, argv[0]);
-	if (!receiver)
-		return CMD_WARNING;
-
-	b = argv_to_buffer(argc, argv, 1);
-	rc = _send_sms_buffer(receiver, b, 0);
+	b = argv_to_buffer(argc, argv, 2);
+	rc = _send_sms_buffer(subscr, b, 0);
 	buffer_free(b);
 
 	return rc;
 }
 
-DEFUN(sms_send_silent_imsi,
-      sms_send_silent_imsi_cmd,
-      "sms send silent imsi IMSI .LINE",
-      "Send a silent message to a subscriber identified by IMSI")
-{
-	struct gsm_subscriber *receiver;
-	struct buffer *b;
-	int rc;
-
-	receiver = subscr_get_by_imsi(gsmnet, argv[0]);
-	if (!receiver)
-		return CMD_WARNING;
-
-	b = argv_to_buffer(argc, argv, 1);
-	rc = _send_sms_buffer(receiver, b, 64);
-	buffer_free(b);
-	subscr_put(receiver);
-
-	return rc;
-}
-
-
 DEFUN(cfg_subscr_name,
       cfg_subscr_name_cmd,
       "name NAME",
@@ -336,7 +307,6 @@
 	return CMD_SUCCESS;
 }
 
-
 int bsc_vty_init_extra(struct gsm_network *net)
 {
 	gsmnet = net;
@@ -345,10 +315,9 @@
 	install_element(VIEW_NODE, &show_subscr_cache_cmd);
 
 	install_element(VIEW_NODE, &sms_send_pend_cmd);
-	install_element(VIEW_NODE, &sms_send_ext_cmd);
-	install_element(VIEW_NODE, &sms_send_imsi_cmd);
-	install_element(VIEW_NODE, &sms_send_silent_ext_cmd);
-	install_element(VIEW_NODE, &sms_send_silent_imsi_cmd);
+
+	install_element(VIEW_NODE, &subscriber_send_sms_cmd);
+	install_element(VIEW_NODE, &subscriber_silent_sms_cmd);
 
 	install_element(CONFIG_NODE, &cfg_subscr_cmd);
 	install_node(&subscr_node, dummy_config_write);