summaryrefslogtreecommitdiff
path: root/dhcpctl/omshell.c
diff options
context:
space:
mode:
authorWlodek Wencel <wlodek@isc.org>2022-01-25 18:57:28 +0100
committerWlodek Wencel <wlodek@isc.org>2022-01-25 18:57:28 +0100
commite9d37e26897a349f8483092fd0305ea03a97b0e2 (patch)
tree5ccf3e3afaee5c9cbce00d23db33c4af019de32b /dhcpctl/omshell.c
parent8eec892acc041bbdb361d1c1ac36a26b3d3cc2db (diff)
parent3d53b2f2a0369c2af83c738d4e8194077315cbb4 (diff)
downloadisc-dhcp-e9d37e26897a349f8483092fd0305ea03a97b0e2.tar.gz
resolved merge conflictsv4_4_3b1v4_4
Diffstat (limited to 'dhcpctl/omshell.c')
-rw-r--r--dhcpctl/omshell.c99
1 files changed, 61 insertions, 38 deletions
diff --git a/dhcpctl/omshell.c b/dhcpctl/omshell.c
index d7a05cc4..afbccf69 100644
--- a/dhcpctl/omshell.c
+++ b/dhcpctl/omshell.c
@@ -3,7 +3,7 @@
Examine and modify omapi objects. */
/*
- * Copyright (c) 2004-2017 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2004-2022 Internet Systems Consortium, Inc. ("ISC")
* Copyright (c) 2001-2003 by Internet Software Consortium
*
* This Source Code Form is subject to the terms of the Mozilla Public
@@ -19,8 +19,8 @@
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Internet Systems Consortium, Inc.
- * 950 Charter Street
- * Redwood City, CA 94063
+ * PO Box 360
+ * Newmarket, NH 03857 USA
* <info@isc.org>
* https://www.isc.org/
*
@@ -81,7 +81,7 @@ static void check (isc_result_t status, const char *func) {
}
}
-int
+int
main(int argc, char **argv) {
isc_result_t status, waitstatus;
dhcpctl_handle connection;
@@ -132,7 +132,7 @@ main(int argc, char **argv) {
dhcpctl_remote_object_t *r = (dhcpctl_remote_object_t *)oh;
omapi_generic_object_t *g =
(omapi_generic_object_t *)(r -> inner);
-
+
printf ("obj: ");
if (r -> rtype -> type != omapi_datatype_string) {
@@ -142,16 +142,16 @@ main(int argc, char **argv) {
(int)(r -> rtype -> u . buffer . len),
r -> rtype -> u . buffer . value);
}
-
+
for (i = 0; i < g -> nvalues; i++) {
omapi_value_t *v = g -> values [i];
-
+
if (!g -> values [i])
continue;
printf ("%.*s = ", (int)v -> name -> len,
v -> name -> value);
-
+
if (!v -> value) {
printf ("<null>\n");
continue;
@@ -161,20 +161,20 @@ main(int argc, char **argv) {
printf ("%d\n",
v -> value -> u . integer);
break;
-
+
case omapi_datatype_string:
printf ("\"%.*s\"\n",
(int) v -> value -> u.buffer.len,
v -> value -> u.buffer.value);
break;
-
+
case omapi_datatype_data:
print_hex_or_string(v->value->u.buffer.len,
v->value->u.buffer.value,
sizeof(hex_buf), hex_buf);
printf("%s\n", hex_buf);
break;
-
+
case omapi_datatype_object:
printf ("<obj>\n");
break;
@@ -189,18 +189,18 @@ main(int argc, char **argv) {
status = new_parse (&cfile, -1, buf, strlen(buf), "<STDIN>", 1);
check(status, "new_parse()");
-
+
token = next_token (&val, (unsigned *)0, cfile);
switch (token) {
default:
parse_warn (cfile, "unknown token: %s", val);
skip_to_semi (cfile);
break;
-
+
case END_OF_FILE:
case ENDOFLINE: /* EOL: */
break;
-
+
case TOKEN_HELP:
case QUESTIONMARK: /* '?': */
printf ("Commands:\n");
@@ -208,6 +208,7 @@ main(int argc, char **argv) {
printf (" server <server address>\n");
printf (" key <key name> <key value>\n");
printf (" connect\n");
+ printf (" disconnect\n");
printf (" new <object-type>\n");
printf (" set <name> = <value>\n");
printf (" create\n");
@@ -218,7 +219,7 @@ main(int argc, char **argv) {
printf (" remove\n");
skip_to_semi (cfile);
break;
-
+
case PORT:
token = next_token (&val, (unsigned *)0, cfile);
if (is_identifier (token)) {
@@ -427,19 +428,41 @@ main(int argc, char **argv) {
connected = 1;
break;
+ case DISCONNECT:
+ token = next_token (&val, (unsigned *)0, cfile);
+ if (token != END_OF_FILE && token != EOL) {
+ printf ("usage: disconnect\n");
+ skip_to_semi (cfile);
+ break;
+ }
+
+ if (!connected || !connection) {
+ fprintf (stderr, "not connected\n");
+ break;
+ }
+
+ status = dhcpctl_disconnect (&connection, 0);
+ if (status != ISC_R_SUCCESS) {
+ fprintf (stderr, "dhcpctl_disconnect: %s\n",
+ isc_result_totext (status));
+ break;
+ }
+ connected = 0;
+ break;
+
case TOKEN_NEW:
token = next_token (&val, (unsigned *)0, cfile);
if ((!is_identifier (token) && token != STRING)) {
printf ("usage: new <object-type>\n");
break;
}
-
+
if (oh) {
printf ("an object is already open.\n");
skip_to_semi (cfile);
break;
}
-
+
if (!connected) {
printf ("not connected.\n");
skip_to_semi (cfile);
@@ -452,7 +475,7 @@ main(int argc, char **argv) {
isc_result_totext (status));
break;
}
-
+
token = next_token (&val, (unsigned *)0, cfile);
if (token != END_OF_FILE && token != EOL) {
printf ("usage: new <object-type>\n");
@@ -481,7 +504,7 @@ main(int argc, char **argv) {
break;
}
omapi_object_dereference (&oh, MDL);
-
+
break;
case TOKEN_SET:
@@ -493,13 +516,13 @@ main(int argc, char **argv) {
skip_to_semi (cfile);
break;
}
-
+
if (oh == NULL) {
printf ("no open object.\n");
skip_to_semi (cfile);
break;
}
-
+
if (!connected) {
printf ("not connected.\n");
skip_to_semi (cfile);
@@ -512,7 +535,7 @@ main(int argc, char **argv) {
s1[0] = 0;
strncat (s1, val, sizeof(s1)-strlen(s1)-1);
#endif
-
+
token = next_token (&val, (unsigned *)0, cfile);
if (token != EQUAL)
goto set_usage;
@@ -523,7 +546,7 @@ main(int argc, char **argv) {
dhcpctl_set_string_value (oh, val, s1);
token = next_token (&val, (unsigned *)0, cfile);
break;
-
+
case NUMBER:
strcpy (buf, val);
token = peek_token (&val, (unsigned *)0, cfile);
@@ -561,7 +584,7 @@ main(int argc, char **argv) {
token = next_token (&val, (unsigned *)0, cfile);
badnum:
break;
-
+
case NUMBER_OR_NAME:
strcpy (buf, val);
cshl:
@@ -587,11 +610,11 @@ main(int argc, char **argv) {
printf ("invalid value.\n");
skip_to_semi (cfile);
}
-
+
if (token != END_OF_FILE && token != EOL)
goto set_usage;
break;
-
+
case UNSET:
token = next_token (&val, (unsigned *)0, cfile);
@@ -601,13 +624,13 @@ main(int argc, char **argv) {
skip_to_semi (cfile);
break;
}
-
+
if (!oh) {
printf ("no open object.\n");
skip_to_semi (cfile);
break;
}
-
+
if (!connected) {
printf ("not connected.\n");
skip_to_semi (cfile);
@@ -620,7 +643,7 @@ main(int argc, char **argv) {
s1[0] = 0;
strncat (s1, val, sizeof(s1)-strlen(s1)-1);
#endif
-
+
token = next_token (&val, (unsigned *)0, cfile);
if (token != END_OF_FILE && token != EOL)
goto unset_usage;
@@ -628,7 +651,7 @@ main(int argc, char **argv) {
dhcpctl_set_null_value (oh, s1);
break;
-
+
case TOKEN_CREATE:
case TOKEN_OPEN:
i = token;
@@ -638,7 +661,7 @@ main(int argc, char **argv) {
skip_to_semi (cfile);
break;
}
-
+
if (!connected) {
printf ("not connected.\n");
skip_to_semi (cfile);
@@ -655,7 +678,7 @@ main(int argc, char **argv) {
i = DHCPCTL_CREATE | DHCPCTL_EXCL;
else
i = 0;
-
+
status = dhcpctl_open_object (oh, connection, i);
if (status == ISC_R_SUCCESS)
status = dhcpctl_wait_for_completion
@@ -667,7 +690,7 @@ main(int argc, char **argv) {
isc_result_totext (status));
break;
}
-
+
break;
case UPDATE:
@@ -677,7 +700,7 @@ main(int argc, char **argv) {
skip_to_semi (cfile);
break;
}
-
+
if (!connected) {
printf ("not connected.\n");
skip_to_semi (cfile);
@@ -701,7 +724,7 @@ main(int argc, char **argv) {
isc_result_totext (status));
break;
}
-
+
break;
case REMOVE:
@@ -711,7 +734,7 @@ main(int argc, char **argv) {
skip_to_semi (cfile);
break;
}
-
+
if (!connected) {
printf ("not connected.\n");
break;
@@ -743,7 +766,7 @@ main(int argc, char **argv) {
skip_to_semi (cfile);
break;
}
-
+
if (!connected) {
printf ("not connected.\n");
break;
@@ -765,7 +788,7 @@ main(int argc, char **argv) {
isc_result_totext (status));
break;
}
-
+
break;
}
end_parse (&cfile);