VTY: Add hlr node and bind ip field

With this patch the address osmo-hlr binds to can be changed to
something else than 0.0.0.0

Change-Id: I79f7a300480f308b21116dd14d1698be38725afd
diff --git a/src/hlr_vty.c b/src/hlr_vty.c
index e4eef8f..946117e 100644
--- a/src/hlr_vty.c
+++ b/src/hlr_vty.c
@@ -20,12 +20,94 @@
  *
  */
 
+#include <osmocom/core/talloc.h>
 #include <osmocom/vty/vty.h>
 #include <osmocom/vty/command.h>
 #include <osmocom/vty/logging.h>
 
 #include "hlr_vty.h"
 
+static struct hlr *g_hlr = NULL;
+
+struct cmd_node hlr_node = {
+	HLR_NODE,
+	"%s(config-hlr)# ",
+	1,
+};
+
+DEFUN(cfg_hlr,
+      cfg_hlr_cmd,
+      "hlr",
+      "Configure the HLR")
+{
+	vty->node = HLR_NODE;
+	return CMD_SUCCESS;
+}
+
+struct cmd_node gsup_node = {
+	GSUP_NODE,
+	"%s(config-hlr-gsup)# ",
+	1,
+};
+
+DEFUN(cfg_gsup,
+      cfg_gsup_cmd,
+      "gsup",
+      "Configure GSUP options")
+{
+	vty->node = GSUP_NODE;
+	return CMD_SUCCESS;
+}
+
+static int config_write_hlr(struct vty *vty)
+{
+	vty_out(vty, "hlr%s", VTY_NEWLINE);
+	return CMD_SUCCESS;
+}
+
+static int config_write_hlr_gsup(struct vty *vty)
+{
+	vty_out(vty, " gsup%s", VTY_NEWLINE);
+	if (g_hlr->gsup_bind_addr)
+		vty_out(vty, "  bind ip %s%s", g_hlr->gsup_bind_addr, VTY_NEWLINE);
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_hlr_gsup_bind_ip,
+      cfg_hlr_gsup_bind_ip_cmd,
+      "bind ip A.B.C.D",
+      "Listen/Bind related socket option\n"
+      IP_STR
+      "IPv4 Address to bind the GSUP interface to\n")
+{
+	if(g_hlr->gsup_bind_addr)
+		talloc_free(g_hlr->gsup_bind_addr);
+	g_hlr->gsup_bind_addr = talloc_strdup(g_hlr, argv[0]);
+
+	return CMD_SUCCESS;
+}
+
+int hlr_vty_go_parent(struct vty *vty)
+{
+	switch (vty->node) {
+	case GSUP_NODE:
+		vty->node = HLR_NODE;
+		vty->index = NULL;
+		break;
+	default:
+	case HLR_NODE:
+		vty->node = CONFIG_NODE;
+		vty->index = NULL;
+		break;
+	case CONFIG_NODE:
+		vty->node = ENABLE_NODE;
+		vty->index = NULL;
+		break;
+	}
+
+	return vty->node;
+}
+
 int hlr_vty_is_config_node(struct vty *vty, int node)
 {
 	switch (node) {
@@ -38,7 +120,19 @@
 	}
 }
 
-void hlr_vty_init(const struct log_info *cat)
+void hlr_vty_init(struct hlr *hlr, const struct log_info *cat)
 {
+	g_hlr = hlr;
+
 	logging_vty_add_cmds(cat);
+
+	install_element(CONFIG_NODE, &cfg_hlr_cmd);
+	install_node(&hlr_node, config_write_hlr);
+	install_default(HLR_NODE);
+
+	install_element(HLR_NODE, &cfg_gsup_cmd);
+	install_node(&gsup_node, config_write_hlr_gsup);
+	install_default(GSUP_NODE);
+
+	install_element(GSUP_NODE, &cfg_hlr_gsup_bind_ip_cmd);
 }