File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / dhcpctl / cltest.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:06:54 2012 UTC (11 years, 8 months ago) by misho
Branches: dhcp, MAIN
CVS tags: v4_1_R7p0, v4_1_R7, v4_1_R4, HEAD
dhcp 4.1 r7

    1: /* cltest.c
    2: 
    3:    Example program that uses the dhcpctl library. */
    4: 
    5: /*
    6:  * Copyright (c) 2004,2007,2009 by Internet Systems Consortium, Inc. ("ISC")
    7:  * Copyright (c) 2000-2003 by Internet Software Consortium
    8:  *
    9:  * Permission to use, copy, modify, and distribute this software for any
   10:  * purpose with or without fee is hereby granted, provided that the above
   11:  * copyright notice and this permission notice appear in all copies.
   12:  *
   13:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
   14:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   15:  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
   16:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   17:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   18:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
   19:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   20:  *
   21:  *   Internet Systems Consortium, Inc.
   22:  *   950 Charter Street
   23:  *   Redwood City, CA 94063
   24:  *   <info@isc.org>
   25:  *   https://www.isc.org/
   26:  *
   27:  * This software was contributed to Internet Systems Consortium
   28:  * by Brian Murrell.
   29:  */
   30: 
   31: #include <time.h>
   32: #include <sys/time.h>
   33: #include <stdio.h>
   34: #include <stdlib.h>
   35: #include <string.h>
   36: #include <stdarg.h>
   37: #include <isc-dhcp/result.h>
   38: #include "dhcpctl.h"
   39: 
   40: int main (int, char **);
   41: 
   42: enum modes { up, down, undefined };
   43: 
   44: static void usage (char *s) {
   45: 	fprintf (stderr,
   46: 		 "Usage: %s [-n <username>] [-p <password>] [-a <algorithm>]"
   47: 		 "(-u | -d) <if>\n", s);
   48: 	exit (1);
   49: }
   50: 
   51: int main (argc, argv)
   52: 	int argc;
   53: 	char **argv;
   54: {
   55: 	isc_result_t status, waitstatus;
   56: 	dhcpctl_handle authenticator;
   57: 	dhcpctl_handle connection;
   58: 	dhcpctl_handle interface_handle;
   59: 	dhcpctl_data_string result;
   60: 	int i;
   61: 	int mode = undefined;
   62: 	const char *interface = 0;
   63: 	const char *action;
   64: 	
   65: 	for (i = 1; i < argc; i++) {
   66: 		if (!strcmp (argv[i], "-u")) {
   67: 			mode = up;
   68: 		} else if (!strcmp (argv [i], "-d")) {
   69: 			mode = down;
   70: 		} else if (argv[i][0] == '-') {
   71: 			usage(argv[0]);
   72: 		} else {
   73: 			interface = argv[i];
   74: 		}
   75: 	}
   76: 
   77: 	if (!interface)
   78: 		usage(argv[0]);
   79: 	if (mode == undefined)
   80: 		usage(argv[0]);
   81: 
   82: 	status = dhcpctl_initialize ();
   83: 	if (status != ISC_R_SUCCESS) {
   84: 		fprintf (stderr, "dhcpctl_initialize: %s\n",
   85: 			 isc_result_totext (status));
   86: 		exit (1);
   87: 	}
   88: 
   89: 	authenticator = dhcpctl_null_handle;
   90: 	connection = dhcpctl_null_handle;
   91: 
   92: 	status = dhcpctl_connect (&connection, "127.0.0.1", 7911,
   93: 				  authenticator);
   94: 	if (status != ISC_R_SUCCESS) {
   95: 		fprintf (stderr, "dhcpctl_connect: %s\n",
   96: 			 isc_result_totext (status));
   97: 		exit (1);
   98: 	}
   99: 
  100: 	interface_handle = dhcpctl_null_handle;
  101: 	status = dhcpctl_new_object (&interface_handle,
  102: 				     connection, "interface");
  103: 	if (status != ISC_R_SUCCESS) {
  104: 		fprintf (stderr, "dhcpctl_new_object: %s\n",
  105: 			 isc_result_totext (status));
  106: 		exit (1);
  107: 	}
  108: 
  109: 	status = dhcpctl_set_string_value (interface_handle,
  110: 					   interface, "name");
  111: 	if (status != ISC_R_SUCCESS) {
  112: 		fprintf (stderr, "dhcpctl_set_value: %s\n",
  113: 			 isc_result_totext (status));
  114: 		exit (1);
  115: 	}
  116: 
  117: 	if (mode == up) {
  118: 		/* "up" the interface */
  119: 		printf ("upping interface %s\n", interface);
  120: 		action = "create";
  121: 		status = dhcpctl_open_object (interface_handle, connection,
  122: 					      DHCPCTL_CREATE | DHCPCTL_EXCL);
  123: 		if (status != ISC_R_SUCCESS) {
  124: 			fprintf (stderr, "dhcpctl_open_object: %s\n",
  125: 				 isc_result_totext (status));
  126: 			exit (1);
  127: 		}
  128: 	} else {
  129: 		/* down the interface */
  130: 		printf ("downing interface %s\n", interface);
  131: 		action = "remove";
  132: 		status = dhcpctl_open_object (interface_handle, connection, 0);
  133: 		if (status != ISC_R_SUCCESS) {
  134: 			fprintf (stderr, "dhcpctl_open_object: %s\n",
  135: 				 isc_result_totext (status));
  136: 			exit (1);
  137: 		}
  138: 		status = dhcpctl_wait_for_completion (interface_handle,
  139: 						      &waitstatus);
  140: 		if (status != ISC_R_SUCCESS) {
  141: 			fprintf (stderr, "dhcpctl_wait_for_completion: %s\n",
  142: 				 isc_result_totext (status));
  143: 			exit (1);
  144: 		}
  145: 		if (waitstatus != ISC_R_SUCCESS) {
  146: 			fprintf (stderr, "dhcpctl_wait_for_completion: %s\n",
  147: 				 isc_result_totext (waitstatus));
  148: 			exit (1);
  149: 		}
  150: 		status = dhcpctl_object_remove (connection, interface_handle);
  151: 		if (status != ISC_R_SUCCESS) {
  152: 			fprintf (stderr, "dhcpctl_open_object: %s\n",
  153: 				 isc_result_totext (status));
  154: 			exit (1);
  155: 		}
  156: 	}
  157: 
  158: 	status = dhcpctl_wait_for_completion (interface_handle, &waitstatus);
  159: 	if (status != ISC_R_SUCCESS) {
  160: 		fprintf (stderr, "dhcpctl_wait_for_completion: %s\n",
  161: 			 isc_result_totext (status));
  162: 		exit (1);
  163: 	}
  164: 	if (waitstatus != ISC_R_SUCCESS) {
  165: 		fprintf (stderr, "interface object %s: %s\n", action,
  166: 			 isc_result_totext (waitstatus));
  167: 		exit (1);
  168: 	}
  169: 
  170: 	memset (&result, 0, sizeof result);
  171: 	status = dhcpctl_get_value (&result, interface_handle, "state");
  172: 	if (status != ISC_R_SUCCESS) {
  173: 		fprintf (stderr, "dhcpctl_get_value: %s\n",
  174: 			 isc_result_totext (status));
  175: 		exit (1);
  176: 	}
  177: 
  178: 	exit (0);
  179: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>