diff options
Diffstat (limited to 'dhcpctl/omshell.c')
-rw-r--r-- | dhcpctl/omshell.c | 99 |
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); |