summaryrefslogtreecommitdiff
path: root/dhcpctl/omshell.c
diff options
context:
space:
mode:
authorDamien Neil <source@isc.org>2001-02-27 01:18:31 +0000
committerDamien Neil <source@isc.org>2001-02-27 01:18:31 +0000
commit031d30b778063c4c9edcd097f058a0c50d0c71a4 (patch)
treeaa06dd97a1092cac38e7d51934191682dc8178a9 /dhcpctl/omshell.c
parent311dbab63df64019ba1c1bbc0650afb061143d60 (diff)
downloadisc-dhcp-031d30b778063c4c9edcd097f058a0c50d0c71a4.tar.gz
Extended the OMAPI shell program to allow objects to be opened, displayed,
modified, and updated.
Diffstat (limited to 'dhcpctl/omshell.c')
-rw-r--r--dhcpctl/omshell.c354
1 files changed, 163 insertions, 191 deletions
diff --git a/dhcpctl/omshell.c b/dhcpctl/omshell.c
index 20b2708c..1db047e7 100644
--- a/dhcpctl/omshell.c
+++ b/dhcpctl/omshell.c
@@ -75,6 +75,13 @@ static void usage (char *s) {
exit (1);
}
+static void check (isc_result_t status, const char *func) {
+ if (status != ISC_R_SUCCESS) {
+ fprintf (stderr, "%s: %s\n", func, isc_result_totext (status));
+ exit (1);
+ }
+}
+
int main (int argc, char **argv, char **envp)
{
isc_result_t status, waitstatus;
@@ -84,12 +91,14 @@ int main (int argc, char **argv, char **envp)
dhcpctl_data_string cid, ip_addr;
dhcpctl_data_string result, groupname, identifier;
const char *name = 0, *pass = 0, *algorithm = "hmac-md5";
- int i;
+ int i, j;
int port = 7911;
const char *server = "127.0.0.1";
struct parse *cfile;
enum dhcp_token token;
const char *val;
+ char buf[1024];
+ char s1[1024];
for (i = 1; i < argc; i++) {
if (!strcmp (argv[i], "-n")) {
@@ -150,230 +159,193 @@ int main (int argc, char **argv, char **envp)
memset (&oh, 0, sizeof oh);
- cfile = (struct parse *)0;
- new_parse (&cfile, 0, (char *)0, 0, "<STDIN>");
do {
+ printf ("obj: ");
+ if (oh == NULL) {
+ printf ("<null>\n");
+ } else {
+ dhcpctl_remote_object_t *r =
+ (dhcpctl_remote_object_t *)oh;
+ omapi_generic_object_t *g =
+ (omapi_generic_object_t *)(r -> inner);
+
+ if (r -> rtype -> type != omapi_datatype_string) {
+ printf ("?\n");
+ } else {
+ printf ("%.*s\n",
+ r -> rtype -> u . buffer . len,
+ r -> rtype -> u . buffer . value);
+ }
+
+ for (i = 0; i < g -> nvalues; i++) {
+ omapi_value_t *v = g -> values [i];
+
+ printf ("%.*s = ",
+ v -> name -> len, v -> name -> value);
+
+ switch (v -> value -> type) {
+ case omapi_datatype_int:
+ printf ("%d\n",
+ v -> value -> u . integer);
+ break;
+
+ case omapi_datatype_string:
+ printf ("\"%.*s\"\n",
+ v -> value -> u.buffer.len,
+ v -> value -> u.buffer.value);
+ break;
+
+ case omapi_datatype_data:
+ printf ("%s\n",
+ print_hex_1
+ (v -> value -> u.buffer.len,
+ v -> value -> u.buffer.value,
+ 60));
+ break;
+
+ case omapi_datatype_object:
+ printf ("<obj>\n");
+ break;
+ }
+ }
+ }
+
+ fputs ("> ", stdout);
+ fflush (stdout);
+ if (fgets (buf, sizeof(buf), stdin) == NULL)
+ break;
+
+ status = new_parse (&cfile, 0, buf, strlen(buf), "<STDIN>");
+ check(status, "new_parse()");
+
token = next_token (&val, cfile);
switch (token) {
default:
parse_warn (cfile, "unknown token: %s", val);
- skip_to_semi (cfile);
+ break;
+
+ case EOF:
+ break;
+
+ case TOKEN_HELP:
+ case '?':
+ printf ("Commands:\n");
+ printf (" new <object-type>\n");
+ printf (" set <name> = <value>\n");
+ printf (" create\n");
+ printf (" open\n");
break;
case TOKEN_NEW:
- if (oh) {
- parse_warn (cfile,
- "an object is already open.");
- skip_to_semi (cfile);
+ token = next_token (&val, cfile);
+ if ((!is_identifier (token) && token != STRING) ||
+ next_token (NULL, cfile) != EOF)
+ {
+ printf ("usage: new <object-type>\n");
break;
}
- token = next_token (&val, cfile);
- if (!is_identifier (token) && token != STRING) {
- parse_warn (cfile,
- "expecting an object name.");
- skip_to_semi (cfile);
+
+ if (oh) {
+ printf ("an object is already open.\n");
break;
}
+
status = dhcpctl_new_object (&oh, connection, val);
if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_new_object: %s\n",
- isc_result_totext (status));
- exit (1);
+ printf ("can't create object: %s\n",
+ isc_result_totext (status));
+ break;
}
- parse_semi (cfile);
- break;
-
- }
- } while (1);
-
-#if 0
- memset (&cid, 0, sizeof cid);
- status = omapi_data_string_new (&cid, 6, MDL);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "omapi_data_string_new: %s\n",
- isc_result_totext (status));
- exit (1);
- }
-
- memset (&cid -> value [0], 0, 6);
- status = dhcpctl_set_value (host_handle,
- cid, "hardware-address");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_set_value: %s\n",
- isc_result_totext (status));
- exit (1);
- }
-
- status = dhcpctl_set_string_value (host_handle, "gnorf",
- "name");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_set_string_value: %s\n",
- isc_result_totext (status));
- exit (1);
- }
-
-#if 0
- memset (&ip_addr, 0, sizeof ip_addr);
- status = omapi_data_string_new (&ip_addr, 4, MDL);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "omapi_data_string_new: %s\n",
- isc_result_totext (status));
- exit (1);
- }
-
- ip_addr -> value [0] = 10; ip_addr -> value [1] = 0;
- ip_addr -> value [2] = 0; ip_addr -> value [3] = 2;
+ break;
- status = dhcpctl_set_value (host_handle, ip_addr, "ip-address");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_set_value: %s\n",
- isc_result_totext (status));
- exit (1);
- }
-#endif
+ case TOKEN_CLOSE:
+ if (next_token (NULL, cfile) != EOF) {
+ printf ("usage: close\n");
+ }
- /* Set the known flag to 1. */
- status = dhcpctl_set_boolean_value (host_handle, 1, "known");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_set_boolean_value: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ omapi_object_dereference (&oh, MDL);
-#if 0
- status = dhcpctl_set_string_value (host_handle, "\n\
-option host-name \"bar\";\n\
-option smtp-server 10.0.0.1;",
- "statements");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_set_value: %s\n",
- isc_result_totext (status));
- exit (1);
- }
-#endif
-
- status = dhcpctl_open_object (host_handle, connection,
- DHCPCTL_CREATE | DHCPCTL_EXCL);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_open_object: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ break;
- status = dhcpctl_wait_for_completion (host_handle, &waitstatus);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "create: dhcpctl_wait_for_completion: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ case TOKEN_SET:
+ token = next_token (&val, cfile);
- if (waitstatus != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_open_object: %s\n",
- isc_result_totext (waitstatus));
- exit (1);
- }
+ if ((!is_identifier (token) && token != STRING) ||
+ next_token (NULL, cfile) != '=')
+ {
+ printf ("usage: set <name> = <value>\n");
+ break;
+ }
- cid -> value [0] = 0; cid -> value [1] = 0x10;
- cid -> value [2] = 0x5a; cid -> value [3] = 0xf8;
- cid -> value [4] = 0x00; cid -> value [5] = 0xbb;
+ if (oh == NULL) {
+ printf ("no open object.\n");
+ break;
+ }
- status = dhcpctl_set_value (host_handle,
- cid, "hardware-address");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_set_value: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ s1[0] = '\0';
+ strncat (s1, val, sizeof(s1)-1);
- status = dhcpctl_object_update (connection, host_handle);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_object_update: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ token = next_token (&val, cfile);
+ switch (token) {
+ case STRING:
+ dhcpctl_set_string_value (oh, val, s1);
+ break;
- status = dhcpctl_wait_for_completion (host_handle, &waitstatus);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "update: dhcpctl_wait_for_completion: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ case NUMBER:
+ dhcpctl_set_int_value (oh, atoi (val), s1);
+ break;
- if (waitstatus != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_object_update: %s\n",
- isc_result_totext (waitstatus));
- exit (1);
- }
+ default:
+ printf ("invalid value.\n");
+ }
- status = dhcpctl_object_remove (connection, host_handle);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_object_remove: %s\n",
- isc_result_totext (status));
- exit (1);
- }
- status = dhcpctl_wait_for_completion (host_handle,
- &waitstatus);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr,
- "remove: dhcpctl_wait_for_completion: %s\n",
- isc_result_totext (status));
- exit (1);
- }
- if (waitstatus != ISC_R_SUCCESS) {
- fprintf (stderr,
- "remove: dhcpctl_wait_for_completion: %s\n",
- isc_result_totext (waitstatus));
- exit (1);
- }
+ break;
- omapi_object_dereference (&host_handle, MDL);
+ case TOKEN_CREATE:
+ case TOKEN_OPEN:
+ if (next_token (NULL, cfile) != EOF) {
+ printf ("usage: %s\n", val);
+ }
- status = dhcpctl_new_object (&host_handle, connection, "host");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_new_object: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ i = 0;
+ if (token == TOKEN_CREATE)
+ i = DHCPCTL_CREATE | DHCPCTL_EXCL;
- memset (&cid -> value [0], 0, 6);
+ status = dhcpctl_open_object (oh, connection, i);
+ if (status == ISC_R_SUCCESS)
+ status = dhcpctl_wait_for_completion
+ (oh, &waitstatus);
+ if (status == ISC_R_SUCCESS)
+ status = waitstatus;
+ if (status != ISC_R_SUCCESS) {
+ printf ("can't open object: %s\n",
+ isc_result_totext (status));
+ break;
+ }
- status = dhcpctl_set_value (host_handle,
- cid, "hardware-address");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_set_value: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ break;
- status = dhcpctl_set_string_value (host_handle, "gnorf",
- "name");
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_set_string_value: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ case UPDATE:
+ if (next_token (NULL, cfile) != EOF) {
+ printf ("usage: %s\n", val);
+ }
- status = dhcpctl_open_object (host_handle, connection,
- DHCPCTL_CREATE | DHCPCTL_EXCL);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_open_object 2: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ status = dhcpctl_object_update(connection, oh);
+ if (status == ISC_R_SUCCESS)
+ status = dhcpctl_wait_for_completion
+ (oh, &waitstatus);
+ if (status == ISC_R_SUCCESS)
+ status = waitstatus;
+ if (status != ISC_R_SUCCESS) {
+ printf ("can't update object: %s\n",
+ isc_result_totext (status));
+ break;
+ }
- status = dhcpctl_wait_for_completion (host_handle, &waitstatus);
- if (status != ISC_R_SUCCESS) {
- fprintf (stderr, "create: dhcpctl_wait_for_completion: %s\n",
- isc_result_totext (status));
- exit (1);
- }
+ break;
+ }
+ } while (1);
- if (waitstatus != ISC_R_SUCCESS) {
- fprintf (stderr, "dhcpctl_open_object 2: %s\n",
- isc_result_totext (waitstatus));
- exit (1);
- }
-#endif
exit (0);
}