/* VTY configuration for Control interface
 *
 * (C) 2016 by sysmocom s.m.f.c. GmbH <info@sysmocom.de>
 *
 * All Rights Reserved
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 */

#include <stdlib.h>
#include <osmocom/core/talloc.h>
#include <osmocom/ctrl/control_vty.h>
#include <osmocom/vty/command.h>

static void *ctrl_vty_ctx = NULL;
static const char *ctrl_vty_bind_addr = NULL;

DEFUN(cfg_ctrl_bind_addr,
      cfg_ctrl_bind_addr_cmd,
      "bind A.B.C.D",
      "Set bind address to listen for Control connections\n"
      "Local IP address (default 127.0.0.1)\n")
{
	talloc_free((char*)ctrl_vty_bind_addr);
	ctrl_vty_bind_addr = NULL;
	ctrl_vty_bind_addr = talloc_strdup(ctrl_vty_ctx, argv[0]);
	return CMD_SUCCESS;
}

const char *ctrl_vty_get_bind_addr(void)
{
	if (!ctrl_vty_bind_addr)
		return "127.0.0.1";
	return ctrl_vty_bind_addr;
}

static struct cmd_node ctrl_node = {
	L_CTRL_NODE,
	"%s(config-ctrl)# ",
	1,
};

DEFUN(cfg_ctrl,
      cfg_ctrl_cmd,
      "ctrl", "Configure the Control Interface")
{
	vty->index = NULL;
	vty->node = L_CTRL_NODE;

	return CMD_SUCCESS;
}

static int config_write_ctrl(struct vty *vty)
{
	/* So far there's only one element. Omit the entire section if the bind
	 * element is omitted. */
	if (!ctrl_vty_bind_addr)
		return CMD_SUCCESS;

	vty_out(vty, "ctrl%s", VTY_NEWLINE);
	vty_out(vty, " bind %s%s", ctrl_vty_bind_addr, VTY_NEWLINE);

	return CMD_SUCCESS;
}

int ctrl_vty_init(void *ctx)
{
	ctrl_vty_ctx = ctx;
	install_element(CONFIG_NODE, &cfg_ctrl_cmd);
	install_node(&ctrl_node, config_write_ctrl);

	install_element(L_CTRL_NODE, &cfg_ctrl_bind_addr_cmd);
	return 0;
}

