diff options
Diffstat (limited to 'dhcpctl/cltest.c')
-rw-r--r-- | dhcpctl/cltest.c | 77 |
1 files changed, 61 insertions, 16 deletions
diff --git a/dhcpctl/cltest.c b/dhcpctl/cltest.c index 904f037e..cc4bba83 100644 --- a/dhcpctl/cltest.c +++ b/dhcpctl/cltest.c @@ -46,30 +46,61 @@ int main (int, char **); -enum modes { up, down }; +enum modes { up, down, undefined }; + +static void usage (char *s) { + fprintf (stderr, + "Usage: %s [-n <username>] [-p <password>] [-a <algorithm>]" + "(-u | -d) <if>\n", s); + exit (1); +} int main (argc, argv) int argc; char **argv; { isc_result_t status, waitstatus; + dhcpctl_handle authenticator; dhcpctl_handle connection; dhcpctl_handle host_handle, group_handle, interface_handle; dhcpctl_data_string cid; dhcpctl_data_string result, groupname, identifier; int i; - int mode; + int mode = undefined; + char *name = 0, *pass = 0, *algorithm = "hmac-md5", *interface = 0; const char *action; - - if (!strcmp (argv [1], "-u")) { - mode = up; - } else if (!strcmp (argv [1], "-d")) { - mode = down; - } else { - fprintf (stderr, "Unknown switch \"%s\"\n", argv [1]); - exit (1); + + for (i = 1; i < argc; i++) { + if (!strcmp (argv[i], "-u")) { + mode = up; + } else if (!strcmp (argv [1], "-d")) { + mode = down; + } else if (!strcmp (argv[i], "-n")) { + if (++i == argc) + usage(argv[0]); + name = argv[i]; + } else if (!strcmp (argv[i], "-p")) { + if (++i == argc) + usage(argv[0]); + pass = argv[i]; + } else if (!strcmp (argv[i], "-a")) { + if (++i == argc) + usage(argv[0]); + algorithm = argv[i]; + } else if (argv[i][0] == '-') { + usage(argv[0]); + } else { + interface = argv[i]; + } } + if (!interface) + usage(argv[0]); + if (mode == undefined) + usage(argv[0]); + if ((name || pass) && !(name && pass)) + usage(argv[0]); + status = dhcpctl_initialize (); if (status != ISC_R_SUCCESS) { fprintf (stderr, "dhcpctl_initialize: %s\n", @@ -77,16 +108,29 @@ int main (argc, argv) exit (1); } - memset (&connection, 0, sizeof connection); + authenticator = dhcpctl_null_handle; + + if (name) { + status = dhcpctl_new_authenticator (&authenticator, + name, algorithm, pass, + strlen (pass) + 1); + if (status != ISC_R_SUCCESS) { + fprintf (stderr, "Cannot create authenticator: %s\n", + isc_result_totext (status)); + exit (1); + } + } + + connection = dhcpctl_null_handle; status = dhcpctl_connect (&connection, "127.0.0.1", 7911, - (dhcpctl_handle)0); + authenticator); if (status != ISC_R_SUCCESS) { fprintf (stderr, "dhcpctl_connect: %s\n", isc_result_totext (status)); exit (1); } - memset (&interface_handle, 0, sizeof interface_handle); + interface_handle = dhcpctl_null_handle; status = dhcpctl_new_object (&interface_handle, connection, "interface"); if (status != ISC_R_SUCCESS) { @@ -95,7 +139,8 @@ int main (argc, argv) exit (1); } - status = dhcpctl_set_string_value (interface_handle, argv [2], "name"); + status = dhcpctl_set_string_value (interface_handle, + interface, "name"); if (status != ISC_R_SUCCESS) { fprintf (stderr, "dhcpctl_set_value: %s\n", isc_result_totext (status)); @@ -104,7 +149,7 @@ int main (argc, argv) if (mode == up) { /* "up" the interface */ - printf ("upping interface %s\n", argv [2]); + printf ("upping interface %s\n", interface); action = "create"; status = dhcpctl_open_object (interface_handle, connection, DHCPCTL_CREATE | DHCPCTL_EXCL); @@ -115,7 +160,7 @@ int main (argc, argv) } } else { /* down the interface */ - printf ("downing interface %s\n", argv [2]); + printf ("downing interface %s\n", interface); action = "remove"; status = dhcpctl_open_object (interface_handle, connection, 0); if (status != ISC_R_SUCCESS) { |