summaryrefslogtreecommitdiff
path: root/lib/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/command.c')
-rw-r--r--lib/command.c74
1 files changed, 70 insertions, 4 deletions
diff --git a/lib/command.c b/lib/command.c
index c86025a3bd..a303781370 100644
--- a/lib/command.c
+++ b/lib/command.c
@@ -125,6 +125,23 @@ vector cmdvec = NULL;
/* Host information structure. */
struct host host;
+/*
+ * Returns host.name if any, otherwise
+ * it returns the system hostname.
+ */
+const char *cmd_hostname_get(void)
+{
+ return host.name;
+}
+
+/*
+ * Returns unix domainname
+ */
+const char *cmd_domainname_get(void)
+{
+ return host.domainname;
+}
+
/* Standard command node structures. */
static struct cmd_node auth_node = {
AUTH_NODE, "Password: ",
@@ -475,8 +492,8 @@ static char *zencrypt(const char *passwd)
/* This function write configuration of this host. */
static int config_write_host(struct vty *vty)
{
- if (host.name)
- vty_out(vty, "hostname %s\n", host.name);
+ if (cmd_hostname_get())
+ vty_out(vty, "hostname %s\n", cmd_hostname_get());
if (host.encrypt) {
if (host.password_encrypt)
@@ -1411,7 +1428,7 @@ DEFUN (show_version,
"Displays zebra version\n")
{
vty_out(vty, "%s %s (%s).\n", FRR_FULL_NAME, FRR_VERSION,
- host.name ? host.name : "");
+ cmd_hostname_get() ? cmd_hostname_get() : "");
vty_out(vty, "%s%s\n", FRR_COPYRIGHT, GIT_INFO);
vty_out(vty, "configured with:\n %s\n", FRR_CONFIG_ARGS);
@@ -1745,6 +1762,40 @@ DEFUN (show_startup_config,
return CMD_SUCCESS;
}
+int cmd_domainname_set(const char *domainname)
+{
+ XFREE(MTYPE_HOST, host.domainname);
+ host.domainname = domainname ? XSTRDUP(MTYPE_HOST, domainname) : NULL;
+ return CMD_SUCCESS;
+}
+
+/* Hostname configuration */
+DEFUN(config_domainname,
+ domainname_cmd,
+ "domainname WORD",
+ "Set system's domain name\n"
+ "This system's domain name\n")
+{
+ struct cmd_token *word = argv[1];
+
+ if (!isalpha((int)word->arg[0])) {
+ vty_out(vty, "Please specify string starting with alphabet\n");
+ return CMD_WARNING_CONFIG_FAILED;
+ }
+
+ return cmd_domainname_set(word->arg);
+}
+
+DEFUN(config_no_domainname,
+ no_domainname_cmd,
+ "no domainname [DOMAINNAME]",
+ NO_STR
+ "Reset system's domain name\n"
+ "domain name of this router\n")
+{
+ return cmd_domainname_set(NULL);
+}
+
int cmd_hostname_set(const char *hostname)
{
XFREE(MTYPE_HOST, host.name);
@@ -2515,9 +2566,12 @@ void install_default(enum node_type node)
* terminal = -1 -- watchfrr / no logging, but minimal config control */
void cmd_init(int terminal)
{
+ struct utsname names;
+
if (array_size(node_names) != NODE_TYPE_MAX)
assert(!"Update the CLI node description array!");
+ uname(&names);
qobj_init();
varhandlers = list_new();
@@ -2526,7 +2580,15 @@ void cmd_init(int terminal)
cmdvec = vector_init(VECTOR_MIN_SIZE);
/* Default host value settings. */
- host.name = NULL;
+ host.name = XSTRDUP(MTYPE_HOST, names.nodename);
+#ifdef HAVE_STRUCT_UTSNAME_DOMAINNAME
+ if ((strcmp(names.domainname, "(none)") == 0))
+ host.domainname = NULL;
+ else
+ host.domainname = XSTRDUP(MTYPE_HOST, names.domainname);
+#else
+ host.domainname = NULL;
+#endif
host.password = NULL;
host.enable = NULL;
host.logfile = NULL;
@@ -2579,6 +2641,8 @@ void cmd_init(int terminal)
install_element(CONFIG_NODE, &hostname_cmd);
install_element(CONFIG_NODE, &no_hostname_cmd);
+ install_element(CONFIG_NODE, &domainname_cmd);
+ install_element(CONFIG_NODE, &no_domainname_cmd);
install_element(CONFIG_NODE, &frr_version_defaults_cmd);
install_element(CONFIG_NODE, &debug_memstats_cmd);
@@ -2644,6 +2708,8 @@ void cmd_terminate()
if (host.name)
XFREE(MTYPE_HOST, host.name);
+ if (host.domainname)
+ XFREE(MTYPE_HOST, host.domainname);
if (host.password)
XFREE(MTYPE_HOST, host.password);
if (host.password_encrypt)