Annotation of embedaddon/dhcp/dhcpctl/cltest.c, revision 1.1.1.1
1.1 misho 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>