xref: /minix3/external/bsd/dhcp/dist/dhcpctl/omshell.c (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: omshell.c,v 1.1.1.2 2014/07/12 11:57:52 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /* omshell.c
3*83ee113eSDavid van Moolenbroek 
4*83ee113eSDavid van Moolenbroek    Examine and modify omapi objects. */
5*83ee113eSDavid van Moolenbroek 
6*83ee113eSDavid van Moolenbroek /*
7*83ee113eSDavid van Moolenbroek  * Copyright (c) 2009-2011,2013,2014 by Internet Systems Consortium, Inc. ("ISC")
8*83ee113eSDavid van Moolenbroek  * Copyright (c) 2004-2007 by Internet Systems Consortium, Inc. ("ISC")
9*83ee113eSDavid van Moolenbroek  * Copyright (c) 2001-2003 by Internet Software Consortium
10*83ee113eSDavid van Moolenbroek  *
11*83ee113eSDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
12*83ee113eSDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
13*83ee113eSDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
14*83ee113eSDavid van Moolenbroek  *
15*83ee113eSDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
16*83ee113eSDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17*83ee113eSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
18*83ee113eSDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19*83ee113eSDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20*83ee113eSDavid van Moolenbroek  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21*83ee113eSDavid van Moolenbroek  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22*83ee113eSDavid van Moolenbroek  *
23*83ee113eSDavid van Moolenbroek  *   Internet Systems Consortium, Inc.
24*83ee113eSDavid van Moolenbroek  *   950 Charter Street
25*83ee113eSDavid van Moolenbroek  *   Redwood City, CA 94063
26*83ee113eSDavid van Moolenbroek  *   <info@isc.org>
27*83ee113eSDavid van Moolenbroek  *   https://www.isc.org/
28*83ee113eSDavid van Moolenbroek  *
29*83ee113eSDavid van Moolenbroek  */
30*83ee113eSDavid van Moolenbroek 
31*83ee113eSDavid van Moolenbroek #include <sys/cdefs.h>
32*83ee113eSDavid van Moolenbroek __RCSID("$NetBSD: omshell.c,v 1.1.1.2 2014/07/12 11:57:52 spz Exp $");
33*83ee113eSDavid van Moolenbroek 
34*83ee113eSDavid van Moolenbroek #include "config.h"
35*83ee113eSDavid van Moolenbroek 
36*83ee113eSDavid van Moolenbroek #include <time.h>
37*83ee113eSDavid van Moolenbroek #include <sys/time.h>
38*83ee113eSDavid van Moolenbroek #include <stdio.h>
39*83ee113eSDavid van Moolenbroek #include <stdlib.h>
40*83ee113eSDavid van Moolenbroek #include <stdarg.h>
41*83ee113eSDavid van Moolenbroek #include <string.h>
42*83ee113eSDavid van Moolenbroek //#include "result.h"
43*83ee113eSDavid van Moolenbroek #include <syslog.h>
44*83ee113eSDavid van Moolenbroek #include "dhcpctl.h"
45*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
46*83ee113eSDavid van Moolenbroek 
47*83ee113eSDavid van Moolenbroek /* Fixups */
find_class(struct class ** c,const char * n,const char * f,int l)48*83ee113eSDavid van Moolenbroek isc_result_t find_class (struct class **c, const char *n, const char *f, int l)
49*83ee113eSDavid van Moolenbroek {
50*83ee113eSDavid van Moolenbroek 	return 0;
51*83ee113eSDavid van Moolenbroek }
parse_allow_deny(struct option_cache ** oc,struct parse * cfile,int flag)52*83ee113eSDavid van Moolenbroek int parse_allow_deny (struct option_cache **oc, struct parse *cfile, int flag)
53*83ee113eSDavid van Moolenbroek {
54*83ee113eSDavid van Moolenbroek 	return 0;
55*83ee113eSDavid van Moolenbroek }
dhcp(struct packet * packet)56*83ee113eSDavid van Moolenbroek void dhcp (struct packet *packet) { }
bootp(struct packet * packet)57*83ee113eSDavid van Moolenbroek void bootp (struct packet *packet) { }
58*83ee113eSDavid van Moolenbroek 
59*83ee113eSDavid van Moolenbroek #ifdef DHCPv6
60*83ee113eSDavid van Moolenbroek /* XXX: should we warn or something here? */
dhcpv6(struct packet * packet)61*83ee113eSDavid van Moolenbroek void dhcpv6(struct packet *packet) { }
62*83ee113eSDavid van Moolenbroek #endif /* DHCPv6 */
63*83ee113eSDavid van Moolenbroek 
check_collection(struct packet * p,struct lease * l,struct collection * c)64*83ee113eSDavid van Moolenbroek int check_collection (struct packet *p, struct lease *l, struct collection *c)
65*83ee113eSDavid van Moolenbroek {
66*83ee113eSDavid van Moolenbroek 	return 0;
67*83ee113eSDavid van Moolenbroek }
classify(struct packet * packet,struct class * class)68*83ee113eSDavid van Moolenbroek void classify (struct packet *packet, struct class *class) { }
69*83ee113eSDavid van Moolenbroek 
usage(char * s)70*83ee113eSDavid van Moolenbroek static void usage (char *s) {
71*83ee113eSDavid van Moolenbroek 	fprintf (stderr, "Usage: %s\n", s);
72*83ee113eSDavid van Moolenbroek 	exit (1);
73*83ee113eSDavid van Moolenbroek }
74*83ee113eSDavid van Moolenbroek 
check(isc_result_t status,const char * func)75*83ee113eSDavid van Moolenbroek static void check (isc_result_t status, const char *func) {
76*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
77*83ee113eSDavid van Moolenbroek 		fprintf (stderr, "%s: %s\n", func, isc_result_totext (status));
78*83ee113eSDavid van Moolenbroek 		exit (1);
79*83ee113eSDavid van Moolenbroek 	}
80*83ee113eSDavid van Moolenbroek }
81*83ee113eSDavid van Moolenbroek 
82*83ee113eSDavid van Moolenbroek int
main(int argc,char ** argv)83*83ee113eSDavid van Moolenbroek main(int argc, char **argv) {
84*83ee113eSDavid van Moolenbroek 	isc_result_t status, waitstatus;
85*83ee113eSDavid van Moolenbroek 	dhcpctl_handle connection;
86*83ee113eSDavid van Moolenbroek 	dhcpctl_handle authenticator;
87*83ee113eSDavid van Moolenbroek 	dhcpctl_handle oh;
88*83ee113eSDavid van Moolenbroek 	struct data_string secret;
89*83ee113eSDavid van Moolenbroek 	const char *name = 0, *algorithm = "hmac-md5";
90*83ee113eSDavid van Moolenbroek 	int i;
91*83ee113eSDavid van Moolenbroek 	int port = 7911;
92*83ee113eSDavid van Moolenbroek 	const char *server = "127.0.0.1";
93*83ee113eSDavid van Moolenbroek 	struct parse *cfile;
94*83ee113eSDavid van Moolenbroek 	enum dhcp_token token;
95*83ee113eSDavid van Moolenbroek 	const char *val;
96*83ee113eSDavid van Moolenbroek 	char *s;
97*83ee113eSDavid van Moolenbroek 	char buf[1024];
98*83ee113eSDavid van Moolenbroek 	char s1[1024];
99*83ee113eSDavid van Moolenbroek 	int connected = 0;
100*83ee113eSDavid van Moolenbroek 	char hex_buf[1025];
101*83ee113eSDavid van Moolenbroek 
102*83ee113eSDavid van Moolenbroek 	for (i = 1; i < argc; i++) {
103*83ee113eSDavid van Moolenbroek 		usage(argv[0]);
104*83ee113eSDavid van Moolenbroek 	}
105*83ee113eSDavid van Moolenbroek 
106*83ee113eSDavid van Moolenbroek 	/* Initially, log errors to stderr as well as to syslogd. */
107*83ee113eSDavid van Moolenbroek 	openlog ("omshell", LOG_NDELAY, DHCPD_LOG_FACILITY);
108*83ee113eSDavid van Moolenbroek 	status = dhcpctl_initialize ();
109*83ee113eSDavid van Moolenbroek 	if (status != ISC_R_SUCCESS) {
110*83ee113eSDavid van Moolenbroek 		fprintf (stderr, "dhcpctl_initialize: %s\n",
111*83ee113eSDavid van Moolenbroek 			 isc_result_totext (status));
112*83ee113eSDavid van Moolenbroek 		exit (1);
113*83ee113eSDavid van Moolenbroek 	}
114*83ee113eSDavid van Moolenbroek 
115*83ee113eSDavid van Moolenbroek 	memset (&oh, 0, sizeof oh);
116*83ee113eSDavid van Moolenbroek 
117*83ee113eSDavid van Moolenbroek 	do {
118*83ee113eSDavid van Moolenbroek 	    if (!connected) {
119*83ee113eSDavid van Moolenbroek 	    } else if (oh == NULL) {
120*83ee113eSDavid van Moolenbroek 		printf ("obj: <null>\n");
121*83ee113eSDavid van Moolenbroek 	    } else {
122*83ee113eSDavid van Moolenbroek 		dhcpctl_remote_object_t *r = (dhcpctl_remote_object_t *)oh;
123*83ee113eSDavid van Moolenbroek 		omapi_generic_object_t *g =
124*83ee113eSDavid van Moolenbroek 			(omapi_generic_object_t *)(r -> inner);
125*83ee113eSDavid van Moolenbroek 
126*83ee113eSDavid van Moolenbroek 		printf ("obj: ");
127*83ee113eSDavid van Moolenbroek 
128*83ee113eSDavid van Moolenbroek 		if (r -> rtype -> type != omapi_datatype_string) {
129*83ee113eSDavid van Moolenbroek 			printf ("?\n");
130*83ee113eSDavid van Moolenbroek 		} else {
131*83ee113eSDavid van Moolenbroek 			printf ("%.*s\n",
132*83ee113eSDavid van Moolenbroek 				(int)(r -> rtype -> u . buffer . len),
133*83ee113eSDavid van Moolenbroek 				r -> rtype -> u . buffer . value);
134*83ee113eSDavid van Moolenbroek 		}
135*83ee113eSDavid van Moolenbroek 
136*83ee113eSDavid van Moolenbroek 		for (i = 0; i < g -> nvalues; i++) {
137*83ee113eSDavid van Moolenbroek 		    omapi_value_t *v = g -> values [i];
138*83ee113eSDavid van Moolenbroek 
139*83ee113eSDavid van Moolenbroek 		    if (!g -> values [i])
140*83ee113eSDavid van Moolenbroek 			    continue;
141*83ee113eSDavid van Moolenbroek 
142*83ee113eSDavid van Moolenbroek 		    printf ("%.*s = ", (int)v -> name -> len,
143*83ee113eSDavid van Moolenbroek 			    v -> name -> value);
144*83ee113eSDavid van Moolenbroek 
145*83ee113eSDavid van Moolenbroek 		    if (!v -> value) {
146*83ee113eSDavid van Moolenbroek 			printf ("<null>\n");
147*83ee113eSDavid van Moolenbroek 			continue;
148*83ee113eSDavid van Moolenbroek 		    }
149*83ee113eSDavid van Moolenbroek 		    switch (v -> value -> type) {
150*83ee113eSDavid van Moolenbroek 			  case omapi_datatype_int:
151*83ee113eSDavid van Moolenbroek 			    printf ("%d\n",
152*83ee113eSDavid van Moolenbroek 				    v -> value -> u . integer);
153*83ee113eSDavid van Moolenbroek 			    break;
154*83ee113eSDavid van Moolenbroek 
155*83ee113eSDavid van Moolenbroek 			  case omapi_datatype_string:
156*83ee113eSDavid van Moolenbroek 			    printf ("\"%.*s\"\n",
157*83ee113eSDavid van Moolenbroek 				    (int) v -> value -> u.buffer.len,
158*83ee113eSDavid van Moolenbroek 				    v -> value -> u.buffer.value);
159*83ee113eSDavid van Moolenbroek 			    break;
160*83ee113eSDavid van Moolenbroek 
161*83ee113eSDavid van Moolenbroek 			  case omapi_datatype_data:
162*83ee113eSDavid van Moolenbroek 			    print_hex_or_string(v->value->u.buffer.len,
163*83ee113eSDavid van Moolenbroek 						v->value->u.buffer.value,
164*83ee113eSDavid van Moolenbroek 						sizeof(hex_buf), hex_buf);
165*83ee113eSDavid van Moolenbroek 			    printf("%s\n", hex_buf);
166*83ee113eSDavid van Moolenbroek 			    break;
167*83ee113eSDavid van Moolenbroek 
168*83ee113eSDavid van Moolenbroek 			  case omapi_datatype_object:
169*83ee113eSDavid van Moolenbroek 			    printf ("<obj>\n");
170*83ee113eSDavid van Moolenbroek 			    break;
171*83ee113eSDavid van Moolenbroek 		    }
172*83ee113eSDavid van Moolenbroek 		}
173*83ee113eSDavid van Moolenbroek 	    }
174*83ee113eSDavid van Moolenbroek 
175*83ee113eSDavid van Moolenbroek 	    fputs ("> ", stdout);
176*83ee113eSDavid van Moolenbroek 	    fflush (stdout);
177*83ee113eSDavid van Moolenbroek 	    if (fgets (buf, sizeof(buf), stdin) == NULL)
178*83ee113eSDavid van Moolenbroek 		break;
179*83ee113eSDavid van Moolenbroek 
180*83ee113eSDavid van Moolenbroek 	    status = new_parse (&cfile, -1, buf, strlen(buf), "<STDIN>", 1);
181*83ee113eSDavid van Moolenbroek 	    check(status, "new_parse()");
182*83ee113eSDavid van Moolenbroek 
183*83ee113eSDavid van Moolenbroek 	    token = next_token (&val, (unsigned *)0, cfile);
184*83ee113eSDavid van Moolenbroek 	    switch (token) {
185*83ee113eSDavid van Moolenbroek 		  default:
186*83ee113eSDavid van Moolenbroek 		    parse_warn (cfile, "unknown token: %s", val);
187*83ee113eSDavid van Moolenbroek 		    skip_to_semi (cfile);
188*83ee113eSDavid van Moolenbroek 		    break;
189*83ee113eSDavid van Moolenbroek 
190*83ee113eSDavid van Moolenbroek 		  case END_OF_FILE:
191*83ee113eSDavid van Moolenbroek 		  case ENDOFLINE: /* EOL: */
192*83ee113eSDavid van Moolenbroek 		    break;
193*83ee113eSDavid van Moolenbroek 
194*83ee113eSDavid van Moolenbroek 		  case TOKEN_HELP:
195*83ee113eSDavid van Moolenbroek 	          case QUESTIONMARK: /* '?': */
196*83ee113eSDavid van Moolenbroek 		    printf ("Commands:\n");
197*83ee113eSDavid van Moolenbroek 		    printf ("  port <server omapi port>\n");
198*83ee113eSDavid van Moolenbroek 		    printf ("  server <server address>\n");
199*83ee113eSDavid van Moolenbroek 		    printf ("  key <key name> <key value>\n");
200*83ee113eSDavid van Moolenbroek 		    printf ("  connect\n");
201*83ee113eSDavid van Moolenbroek 		    printf ("  new <object-type>\n");
202*83ee113eSDavid van Moolenbroek 		    printf ("  set <name> = <value>\n");
203*83ee113eSDavid van Moolenbroek 		    printf ("  create\n");
204*83ee113eSDavid van Moolenbroek 		    printf ("  open\n");
205*83ee113eSDavid van Moolenbroek 		    printf ("  update\n");
206*83ee113eSDavid van Moolenbroek 		    printf ("  unset <name>\n");
207*83ee113eSDavid van Moolenbroek 		    printf ("  refresh\n");
208*83ee113eSDavid van Moolenbroek 		    printf ("  remove\n");
209*83ee113eSDavid van Moolenbroek 		    skip_to_semi (cfile);
210*83ee113eSDavid van Moolenbroek 		    break;
211*83ee113eSDavid van Moolenbroek 
212*83ee113eSDavid van Moolenbroek 		  case PORT:
213*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
214*83ee113eSDavid van Moolenbroek 		    if (is_identifier (token)) {
215*83ee113eSDavid van Moolenbroek 			    struct servent *se;
216*83ee113eSDavid van Moolenbroek 			    se = getservbyname (val, "tcp");
217*83ee113eSDavid van Moolenbroek 			    if (se)
218*83ee113eSDavid van Moolenbroek 				    port = ntohs (se -> s_port);
219*83ee113eSDavid van Moolenbroek 			    else {
220*83ee113eSDavid van Moolenbroek 				    printf ("unknown service name: %s\n", val);
221*83ee113eSDavid van Moolenbroek 				    break;
222*83ee113eSDavid van Moolenbroek 			    }
223*83ee113eSDavid van Moolenbroek 		    } else if (token == NUMBER) {
224*83ee113eSDavid van Moolenbroek 			    port = atoi (val);
225*83ee113eSDavid van Moolenbroek 		    } else {
226*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
227*83ee113eSDavid van Moolenbroek 			    printf ("usage: port <port>\n");
228*83ee113eSDavid van Moolenbroek 			    break;
229*83ee113eSDavid van Moolenbroek 		    }
230*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
231*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
232*83ee113eSDavid van Moolenbroek 			    printf ("usage: port <server>\n");
233*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
234*83ee113eSDavid van Moolenbroek 			    break;
235*83ee113eSDavid van Moolenbroek 		    }
236*83ee113eSDavid van Moolenbroek 		    break;
237*83ee113eSDavid van Moolenbroek 
238*83ee113eSDavid van Moolenbroek 		  case TOKEN_SERVER:
239*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
240*83ee113eSDavid van Moolenbroek 		    if (token == NUMBER) {
241*83ee113eSDavid van Moolenbroek 			    int alen = (sizeof buf) - 1;
242*83ee113eSDavid van Moolenbroek 			    int len;
243*83ee113eSDavid van Moolenbroek 
244*83ee113eSDavid van Moolenbroek 			    s = &buf [0];
245*83ee113eSDavid van Moolenbroek 			    len = strlen (val);
246*83ee113eSDavid van Moolenbroek 			    if (len + 1 > alen) {
247*83ee113eSDavid van Moolenbroek 			      baddq:
248*83ee113eSDavid van Moolenbroek 				printf ("usage: server <server>\n");
249*83ee113eSDavid van Moolenbroek 				skip_to_semi (cfile);
250*83ee113eSDavid van Moolenbroek 				break;
251*83ee113eSDavid van Moolenbroek 			    }			    strcpy (buf, val);
252*83ee113eSDavid van Moolenbroek 			    s += len;
253*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
254*83ee113eSDavid van Moolenbroek 			    if (token != DOT)
255*83ee113eSDavid van Moolenbroek 				    goto baddq;
256*83ee113eSDavid van Moolenbroek 			    *s++ = '.';
257*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
258*83ee113eSDavid van Moolenbroek 			    if (token != NUMBER)
259*83ee113eSDavid van Moolenbroek 				    goto baddq;
260*83ee113eSDavid van Moolenbroek 			    len = strlen (val);
261*83ee113eSDavid van Moolenbroek 			    if (len + 1 > alen)
262*83ee113eSDavid van Moolenbroek 				    goto baddq;
263*83ee113eSDavid van Moolenbroek 			    strcpy (s, val);
264*83ee113eSDavid van Moolenbroek 			    s += len;
265*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
266*83ee113eSDavid van Moolenbroek 			    if (token != DOT)
267*83ee113eSDavid van Moolenbroek 				    goto baddq;
268*83ee113eSDavid van Moolenbroek 			    *s++ = '.';
269*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
270*83ee113eSDavid van Moolenbroek 			    if (token != NUMBER)
271*83ee113eSDavid van Moolenbroek 				    goto baddq;
272*83ee113eSDavid van Moolenbroek 			    len = strlen (val);
273*83ee113eSDavid van Moolenbroek 			    if (len + 1 > alen)
274*83ee113eSDavid van Moolenbroek 				    goto baddq;
275*83ee113eSDavid van Moolenbroek 			    strcpy (s, val);
276*83ee113eSDavid van Moolenbroek 			    s += len;
277*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
278*83ee113eSDavid van Moolenbroek 			    if (token != DOT)
279*83ee113eSDavid van Moolenbroek 				    goto baddq;
280*83ee113eSDavid van Moolenbroek 			    *s++ = '.';
281*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
282*83ee113eSDavid van Moolenbroek 			    if (token != NUMBER)
283*83ee113eSDavid van Moolenbroek 				    goto baddq;
284*83ee113eSDavid van Moolenbroek 			    len = strlen (val);
285*83ee113eSDavid van Moolenbroek 			    if (len + 1 > alen)
286*83ee113eSDavid van Moolenbroek 				    goto baddq;
287*83ee113eSDavid van Moolenbroek 			    strcpy (s, val);
288*83ee113eSDavid van Moolenbroek 			    val = &buf [0];
289*83ee113eSDavid van Moolenbroek 		    } else if (is_identifier (token)) {
290*83ee113eSDavid van Moolenbroek 			    /* Use val directly. */
291*83ee113eSDavid van Moolenbroek 		    } else {
292*83ee113eSDavid van Moolenbroek 			    printf ("usage: server <server>\n");
293*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
294*83ee113eSDavid van Moolenbroek 			    break;
295*83ee113eSDavid van Moolenbroek 		    }
296*83ee113eSDavid van Moolenbroek 
297*83ee113eSDavid van Moolenbroek 		    s = dmalloc (strlen (val) + 1, MDL);
298*83ee113eSDavid van Moolenbroek 		    if (!server) {
299*83ee113eSDavid van Moolenbroek 			    printf ("no memory to store server name.\n");
300*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
301*83ee113eSDavid van Moolenbroek 			    break;
302*83ee113eSDavid van Moolenbroek 		    }
303*83ee113eSDavid van Moolenbroek 		    strcpy (s, val);
304*83ee113eSDavid van Moolenbroek 		    server = s;
305*83ee113eSDavid van Moolenbroek 
306*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
307*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
308*83ee113eSDavid van Moolenbroek 			    printf ("usage: server <server>\n");
309*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
310*83ee113eSDavid van Moolenbroek 			    break;
311*83ee113eSDavid van Moolenbroek 		    }
312*83ee113eSDavid van Moolenbroek 		    break;
313*83ee113eSDavid van Moolenbroek 
314*83ee113eSDavid van Moolenbroek 		  case KEY:
315*83ee113eSDavid van Moolenbroek 		    token = peek_token(&val, (unsigned *)0, cfile);
316*83ee113eSDavid van Moolenbroek 		    if (token == STRING) {
317*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
318*83ee113eSDavid van Moolenbroek 			    if (!is_identifier (token)) {
319*83ee113eSDavid van Moolenbroek 				    printf ("usage: key <name> <value>\n");
320*83ee113eSDavid van Moolenbroek 				    skip_to_semi (cfile);
321*83ee113eSDavid van Moolenbroek 				    break;
322*83ee113eSDavid van Moolenbroek 			    }
323*83ee113eSDavid van Moolenbroek 			    s = dmalloc (strlen (val) + 1, MDL);
324*83ee113eSDavid van Moolenbroek 			    if (!s) {
325*83ee113eSDavid van Moolenbroek 				    printf ("no memory for key name.\n");
326*83ee113eSDavid van Moolenbroek 				    skip_to_semi (cfile);
327*83ee113eSDavid van Moolenbroek 				    break;
328*83ee113eSDavid van Moolenbroek 			    }
329*83ee113eSDavid van Moolenbroek 			    strcpy (s, val);
330*83ee113eSDavid van Moolenbroek 		    } else {
331*83ee113eSDavid van Moolenbroek 			    s = parse_host_name(cfile);
332*83ee113eSDavid van Moolenbroek 			    if (s == NULL) {
333*83ee113eSDavid van Moolenbroek 				    printf ("usage: key <name> <value>\n");
334*83ee113eSDavid van Moolenbroek 				    skip_to_semi(cfile);
335*83ee113eSDavid van Moolenbroek 				    break;
336*83ee113eSDavid van Moolenbroek 			    }
337*83ee113eSDavid van Moolenbroek 		    }
338*83ee113eSDavid van Moolenbroek 		    name = s;
339*83ee113eSDavid van Moolenbroek 
340*83ee113eSDavid van Moolenbroek 		    memset (&secret, 0, sizeof secret);
341*83ee113eSDavid van Moolenbroek 		    if (!parse_base64 (&secret, cfile)) {
342*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
343*83ee113eSDavid van Moolenbroek 			    break;
344*83ee113eSDavid van Moolenbroek 		    }
345*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
346*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
347*83ee113eSDavid van Moolenbroek 			    printf ("usage: key <name> <secret>\n");
348*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
349*83ee113eSDavid van Moolenbroek 			    break;
350*83ee113eSDavid van Moolenbroek 		    }
351*83ee113eSDavid van Moolenbroek 		    break;
352*83ee113eSDavid van Moolenbroek 
353*83ee113eSDavid van Moolenbroek 		  case CONNECT:
354*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
355*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
356*83ee113eSDavid van Moolenbroek 			    printf ("usage: connect\n");
357*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
358*83ee113eSDavid van Moolenbroek 			    break;
359*83ee113eSDavid van Moolenbroek 		    }
360*83ee113eSDavid van Moolenbroek 
361*83ee113eSDavid van Moolenbroek 		    authenticator = dhcpctl_null_handle;
362*83ee113eSDavid van Moolenbroek 
363*83ee113eSDavid van Moolenbroek 		    if (name) {
364*83ee113eSDavid van Moolenbroek 			status = dhcpctl_new_authenticator (&authenticator,
365*83ee113eSDavid van Moolenbroek 							    name, algorithm,
366*83ee113eSDavid van Moolenbroek 							    secret.data,
367*83ee113eSDavid van Moolenbroek 							    secret.len);
368*83ee113eSDavid van Moolenbroek 
369*83ee113eSDavid van Moolenbroek 			if (status != ISC_R_SUCCESS) {
370*83ee113eSDavid van Moolenbroek 			    fprintf (stderr,
371*83ee113eSDavid van Moolenbroek 				     "Cannot create authenticator: %s\n",
372*83ee113eSDavid van Moolenbroek 				     isc_result_totext (status));
373*83ee113eSDavid van Moolenbroek 			    break;
374*83ee113eSDavid van Moolenbroek 			}
375*83ee113eSDavid van Moolenbroek 		    }
376*83ee113eSDavid van Moolenbroek 
377*83ee113eSDavid van Moolenbroek 		    memset (&connection, 0, sizeof connection);
378*83ee113eSDavid van Moolenbroek 		    status = dhcpctl_connect (&connection,
379*83ee113eSDavid van Moolenbroek 					      server, port, authenticator);
380*83ee113eSDavid van Moolenbroek 		    if (status != ISC_R_SUCCESS) {
381*83ee113eSDavid van Moolenbroek 			    fprintf (stderr, "dhcpctl_connect: %s\n",
382*83ee113eSDavid van Moolenbroek 				     isc_result_totext (status));
383*83ee113eSDavid van Moolenbroek 			    break;
384*83ee113eSDavid van Moolenbroek 		    }
385*83ee113eSDavid van Moolenbroek 		    connected = 1;
386*83ee113eSDavid van Moolenbroek 		    break;
387*83ee113eSDavid van Moolenbroek 
388*83ee113eSDavid van Moolenbroek 		  case TOKEN_NEW:
389*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
390*83ee113eSDavid van Moolenbroek 		    if ((!is_identifier (token) && token != STRING)) {
391*83ee113eSDavid van Moolenbroek 			    printf ("usage: new <object-type>\n");
392*83ee113eSDavid van Moolenbroek 			    break;
393*83ee113eSDavid van Moolenbroek 		    }
394*83ee113eSDavid van Moolenbroek 
395*83ee113eSDavid van Moolenbroek 		    if (oh) {
396*83ee113eSDavid van Moolenbroek 			    printf ("an object is already open.\n");
397*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
398*83ee113eSDavid van Moolenbroek 			    break;
399*83ee113eSDavid van Moolenbroek 		    }
400*83ee113eSDavid van Moolenbroek 
401*83ee113eSDavid van Moolenbroek 		    if (!connected) {
402*83ee113eSDavid van Moolenbroek 			    printf ("not connected.\n");
403*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
404*83ee113eSDavid van Moolenbroek 			    break;
405*83ee113eSDavid van Moolenbroek 		    }
406*83ee113eSDavid van Moolenbroek 
407*83ee113eSDavid van Moolenbroek 		    status = dhcpctl_new_object (&oh, connection, val);
408*83ee113eSDavid van Moolenbroek 		    if (status != ISC_R_SUCCESS) {
409*83ee113eSDavid van Moolenbroek 			    printf ("can't create object: %s\n",
410*83ee113eSDavid van Moolenbroek 				    isc_result_totext (status));
411*83ee113eSDavid van Moolenbroek 			    break;
412*83ee113eSDavid van Moolenbroek 		    }
413*83ee113eSDavid van Moolenbroek 
414*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
415*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
416*83ee113eSDavid van Moolenbroek 			    printf ("usage: new <object-type>\n");
417*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
418*83ee113eSDavid van Moolenbroek 			    break;
419*83ee113eSDavid van Moolenbroek 		    }
420*83ee113eSDavid van Moolenbroek 		    break;
421*83ee113eSDavid van Moolenbroek 
422*83ee113eSDavid van Moolenbroek 		  case TOKEN_CLOSE:
423*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
424*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
425*83ee113eSDavid van Moolenbroek 			    printf ("usage: close\n");
426*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
427*83ee113eSDavid van Moolenbroek 			    break;
428*83ee113eSDavid van Moolenbroek 		    }
429*83ee113eSDavid van Moolenbroek 
430*83ee113eSDavid van Moolenbroek 		    if (!connected) {
431*83ee113eSDavid van Moolenbroek 			    printf ("not connected.\n");
432*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
433*83ee113eSDavid van Moolenbroek 			    break;
434*83ee113eSDavid van Moolenbroek 		    }
435*83ee113eSDavid van Moolenbroek 
436*83ee113eSDavid van Moolenbroek 		    if (!oh) {
437*83ee113eSDavid van Moolenbroek 			    printf ("not open.\n");
438*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
439*83ee113eSDavid van Moolenbroek 			    break;
440*83ee113eSDavid van Moolenbroek 		    }
441*83ee113eSDavid van Moolenbroek 		    omapi_object_dereference (&oh, MDL);
442*83ee113eSDavid van Moolenbroek 
443*83ee113eSDavid van Moolenbroek 		    break;
444*83ee113eSDavid van Moolenbroek 
445*83ee113eSDavid van Moolenbroek 		  case TOKEN_SET:
446*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
447*83ee113eSDavid van Moolenbroek 
448*83ee113eSDavid van Moolenbroek 		    if ((!is_identifier (token) && token != STRING)) {
449*83ee113eSDavid van Moolenbroek 			  set_usage:
450*83ee113eSDavid van Moolenbroek 			    printf ("usage: set <name> = <value>\n");
451*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
452*83ee113eSDavid van Moolenbroek 			    break;
453*83ee113eSDavid van Moolenbroek 		    }
454*83ee113eSDavid van Moolenbroek 
455*83ee113eSDavid van Moolenbroek 		    if (oh == NULL) {
456*83ee113eSDavid van Moolenbroek 			    printf ("no open object.\n");
457*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
458*83ee113eSDavid van Moolenbroek 			    break;
459*83ee113eSDavid van Moolenbroek 		    }
460*83ee113eSDavid van Moolenbroek 
461*83ee113eSDavid van Moolenbroek 		    if (!connected) {
462*83ee113eSDavid van Moolenbroek 			    printf ("not connected.\n");
463*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
464*83ee113eSDavid van Moolenbroek 			    break;
465*83ee113eSDavid van Moolenbroek 		    }
466*83ee113eSDavid van Moolenbroek 
467*83ee113eSDavid van Moolenbroek #ifdef HAVE_STRLCPY
468*83ee113eSDavid van Moolenbroek 		    strlcpy (s1, val, sizeof(s1));
469*83ee113eSDavid van Moolenbroek #else
470*83ee113eSDavid van Moolenbroek 		    s1[0] = 0;
471*83ee113eSDavid van Moolenbroek 		    strncat (s1, val, sizeof(s1)-strlen(s1)-1);
472*83ee113eSDavid van Moolenbroek #endif
473*83ee113eSDavid van Moolenbroek 
474*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
475*83ee113eSDavid van Moolenbroek 		    if (token != EQUAL)
476*83ee113eSDavid van Moolenbroek 			    goto set_usage;
477*83ee113eSDavid van Moolenbroek 
478*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
479*83ee113eSDavid van Moolenbroek 		    switch (token) {
480*83ee113eSDavid van Moolenbroek 			  case STRING:
481*83ee113eSDavid van Moolenbroek 			    dhcpctl_set_string_value (oh, val, s1);
482*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
483*83ee113eSDavid van Moolenbroek 			    break;
484*83ee113eSDavid van Moolenbroek 
485*83ee113eSDavid van Moolenbroek 			  case NUMBER:
486*83ee113eSDavid van Moolenbroek 			    strcpy (buf, val);
487*83ee113eSDavid van Moolenbroek 			    token = peek_token (&val, (unsigned *)0, cfile);
488*83ee113eSDavid van Moolenbroek 			    /* Colon-separated hex list? */
489*83ee113eSDavid van Moolenbroek 			    if (token == COLON)
490*83ee113eSDavid van Moolenbroek 				goto cshl;
491*83ee113eSDavid van Moolenbroek 			    else if (token == DOT) {
492*83ee113eSDavid van Moolenbroek 				s = buf;
493*83ee113eSDavid van Moolenbroek 				val = buf;
494*83ee113eSDavid van Moolenbroek 				do {
495*83ee113eSDavid van Moolenbroek 				    int intval = atoi (val);
496*83ee113eSDavid van Moolenbroek 				    if (intval > 255) {
497*83ee113eSDavid van Moolenbroek 					parse_warn (cfile,
498*83ee113eSDavid van Moolenbroek 						    "dotted octet > 255: %s",
499*83ee113eSDavid van Moolenbroek 						    val);
500*83ee113eSDavid van Moolenbroek 					skip_to_semi (cfile);
501*83ee113eSDavid van Moolenbroek 					goto badnum;
502*83ee113eSDavid van Moolenbroek 				    }
503*83ee113eSDavid van Moolenbroek 				    *s++ = intval;
504*83ee113eSDavid van Moolenbroek 				    token = next_token (&val,
505*83ee113eSDavid van Moolenbroek 							(unsigned *)0, cfile);
506*83ee113eSDavid van Moolenbroek 				    if (token != DOT)
507*83ee113eSDavid van Moolenbroek 					    break;
508*83ee113eSDavid van Moolenbroek 				    /* DOT is zero. */
509*83ee113eSDavid van Moolenbroek 				    while ((token = next_token (&val,
510*83ee113eSDavid van Moolenbroek 					(unsigned *)0, cfile)) == DOT)
511*83ee113eSDavid van Moolenbroek 					*s++ = 0;
512*83ee113eSDavid van Moolenbroek 				} while (token == NUMBER);
513*83ee113eSDavid van Moolenbroek 				dhcpctl_set_data_value (oh, buf,
514*83ee113eSDavid van Moolenbroek 							(unsigned)(s - buf),
515*83ee113eSDavid van Moolenbroek 							s1);
516*83ee113eSDavid van Moolenbroek 				break;
517*83ee113eSDavid van Moolenbroek 			    }
518*83ee113eSDavid van Moolenbroek 			    dhcpctl_set_int_value (oh, atoi (buf), s1);
519*83ee113eSDavid van Moolenbroek 			    token = next_token (&val, (unsigned *)0, cfile);
520*83ee113eSDavid van Moolenbroek 			  badnum:
521*83ee113eSDavid van Moolenbroek 			    break;
522*83ee113eSDavid van Moolenbroek 
523*83ee113eSDavid van Moolenbroek 			  case NUMBER_OR_NAME:
524*83ee113eSDavid van Moolenbroek 			    strcpy (buf, val);
525*83ee113eSDavid van Moolenbroek 			  cshl:
526*83ee113eSDavid van Moolenbroek 			    s = buf;
527*83ee113eSDavid van Moolenbroek 			    val = buf;
528*83ee113eSDavid van Moolenbroek 			    do {
529*83ee113eSDavid van Moolenbroek 				convert_num (cfile, (unsigned char *)s,
530*83ee113eSDavid van Moolenbroek 					     val, 16, 8);
531*83ee113eSDavid van Moolenbroek 				++s;
532*83ee113eSDavid van Moolenbroek 				token = next_token (&val,
533*83ee113eSDavid van Moolenbroek 						    (unsigned *)0, cfile);
534*83ee113eSDavid van Moolenbroek 				if (token != COLON)
535*83ee113eSDavid van Moolenbroek 				    break;
536*83ee113eSDavid van Moolenbroek 				token = next_token (&val,
537*83ee113eSDavid van Moolenbroek 						    (unsigned *)0, cfile);
538*83ee113eSDavid van Moolenbroek 			    } while (token == NUMBER ||
539*83ee113eSDavid van Moolenbroek 				     token == NUMBER_OR_NAME);
540*83ee113eSDavid van Moolenbroek 			    dhcpctl_set_data_value (oh, buf,
541*83ee113eSDavid van Moolenbroek 						    (unsigned)(s - buf), s1);
542*83ee113eSDavid van Moolenbroek 			    break;
543*83ee113eSDavid van Moolenbroek 
544*83ee113eSDavid van Moolenbroek 			  default:
545*83ee113eSDavid van Moolenbroek 			    printf ("invalid value.\n");
546*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
547*83ee113eSDavid van Moolenbroek 		    }
548*83ee113eSDavid van Moolenbroek 
549*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL)
550*83ee113eSDavid van Moolenbroek 			    goto set_usage;
551*83ee113eSDavid van Moolenbroek 		    break;
552*83ee113eSDavid van Moolenbroek 
553*83ee113eSDavid van Moolenbroek 		  case UNSET:
554*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
555*83ee113eSDavid van Moolenbroek 
556*83ee113eSDavid van Moolenbroek 		    if ((!is_identifier (token) && token != STRING)) {
557*83ee113eSDavid van Moolenbroek 			  unset_usage:
558*83ee113eSDavid van Moolenbroek 			    printf ("usage: unset <name>\n");
559*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
560*83ee113eSDavid van Moolenbroek 			    break;
561*83ee113eSDavid van Moolenbroek 		    }
562*83ee113eSDavid van Moolenbroek 
563*83ee113eSDavid van Moolenbroek 		    if (!oh) {
564*83ee113eSDavid van Moolenbroek 			    printf ("no open object.\n");
565*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
566*83ee113eSDavid van Moolenbroek 			    break;
567*83ee113eSDavid van Moolenbroek 		    }
568*83ee113eSDavid van Moolenbroek 
569*83ee113eSDavid van Moolenbroek 		    if (!connected) {
570*83ee113eSDavid van Moolenbroek 			    printf ("not connected.\n");
571*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
572*83ee113eSDavid van Moolenbroek 			    break;
573*83ee113eSDavid van Moolenbroek 		    }
574*83ee113eSDavid van Moolenbroek 
575*83ee113eSDavid van Moolenbroek #if HAVE_STRLCPY
576*83ee113eSDavid van Moolenbroek 		    strlcpy (s1, val, sizeof(s1));
577*83ee113eSDavid van Moolenbroek #else
578*83ee113eSDavid van Moolenbroek 		    s1[0] = 0;
579*83ee113eSDavid van Moolenbroek 		    strncat (s1, val, sizeof(s1)-strlen(s1)-1);
580*83ee113eSDavid van Moolenbroek #endif
581*83ee113eSDavid van Moolenbroek 
582*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
583*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL)
584*83ee113eSDavid van Moolenbroek 			    goto unset_usage;
585*83ee113eSDavid van Moolenbroek 
586*83ee113eSDavid van Moolenbroek 		    dhcpctl_set_null_value (oh, s1);
587*83ee113eSDavid van Moolenbroek 		    break;
588*83ee113eSDavid van Moolenbroek 
589*83ee113eSDavid van Moolenbroek 
590*83ee113eSDavid van Moolenbroek 		  case TOKEN_CREATE:
591*83ee113eSDavid van Moolenbroek 		  case TOKEN_OPEN:
592*83ee113eSDavid van Moolenbroek 		    i = token;
593*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
594*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
595*83ee113eSDavid van Moolenbroek 			    printf ("usage: %s\n", val);
596*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
597*83ee113eSDavid van Moolenbroek 			    break;
598*83ee113eSDavid van Moolenbroek 		    }
599*83ee113eSDavid van Moolenbroek 
600*83ee113eSDavid van Moolenbroek 		    if (!connected) {
601*83ee113eSDavid van Moolenbroek 			    printf ("not connected.\n");
602*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
603*83ee113eSDavid van Moolenbroek 			    break;
604*83ee113eSDavid van Moolenbroek 		    }
605*83ee113eSDavid van Moolenbroek 
606*83ee113eSDavid van Moolenbroek 		    if (!oh) {
607*83ee113eSDavid van Moolenbroek 			    printf ("you must make a new object first!\n");
608*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
609*83ee113eSDavid van Moolenbroek 			    break;
610*83ee113eSDavid van Moolenbroek 		    }
611*83ee113eSDavid van Moolenbroek 
612*83ee113eSDavid van Moolenbroek 		    if (i == TOKEN_CREATE)
613*83ee113eSDavid van Moolenbroek 			    i = DHCPCTL_CREATE | DHCPCTL_EXCL;
614*83ee113eSDavid van Moolenbroek 		    else
615*83ee113eSDavid van Moolenbroek 			    i = 0;
616*83ee113eSDavid van Moolenbroek 
617*83ee113eSDavid van Moolenbroek 		    status = dhcpctl_open_object (oh, connection, i);
618*83ee113eSDavid van Moolenbroek 		    if (status == ISC_R_SUCCESS)
619*83ee113eSDavid van Moolenbroek 			    status = dhcpctl_wait_for_completion
620*83ee113eSDavid van Moolenbroek 				    (oh, &waitstatus);
621*83ee113eSDavid van Moolenbroek 		    if (status == ISC_R_SUCCESS)
622*83ee113eSDavid van Moolenbroek 			    status = waitstatus;
623*83ee113eSDavid van Moolenbroek 		    if (status != ISC_R_SUCCESS) {
624*83ee113eSDavid van Moolenbroek 			    printf ("can't open object: %s\n",
625*83ee113eSDavid van Moolenbroek 				    isc_result_totext (status));
626*83ee113eSDavid van Moolenbroek 			    break;
627*83ee113eSDavid van Moolenbroek 		    }
628*83ee113eSDavid van Moolenbroek 
629*83ee113eSDavid van Moolenbroek 		    break;
630*83ee113eSDavid van Moolenbroek 
631*83ee113eSDavid van Moolenbroek 		  case UPDATE:
632*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
633*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
634*83ee113eSDavid van Moolenbroek 			    printf ("usage: %s\n", val);
635*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
636*83ee113eSDavid van Moolenbroek 			    break;
637*83ee113eSDavid van Moolenbroek 		    }
638*83ee113eSDavid van Moolenbroek 
639*83ee113eSDavid van Moolenbroek 		    if (!connected) {
640*83ee113eSDavid van Moolenbroek 			    printf ("not connected.\n");
641*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
642*83ee113eSDavid van Moolenbroek 			    break;
643*83ee113eSDavid van Moolenbroek 		    }
644*83ee113eSDavid van Moolenbroek 
645*83ee113eSDavid van Moolenbroek 		    if (!oh) {
646*83ee113eSDavid van Moolenbroek 			    printf ("you haven't opened an object yet!\n");
647*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
648*83ee113eSDavid van Moolenbroek 			    break;
649*83ee113eSDavid van Moolenbroek 		    }
650*83ee113eSDavid van Moolenbroek 
651*83ee113eSDavid van Moolenbroek 		    status = dhcpctl_object_update(connection, oh);
652*83ee113eSDavid van Moolenbroek 		    if (status == ISC_R_SUCCESS)
653*83ee113eSDavid van Moolenbroek 			    status = dhcpctl_wait_for_completion
654*83ee113eSDavid van Moolenbroek 				    (oh, &waitstatus);
655*83ee113eSDavid van Moolenbroek 		    if (status == ISC_R_SUCCESS)
656*83ee113eSDavid van Moolenbroek 			    status = waitstatus;
657*83ee113eSDavid van Moolenbroek 		    if (status != ISC_R_SUCCESS) {
658*83ee113eSDavid van Moolenbroek 			    printf ("can't update object: %s\n",
659*83ee113eSDavid van Moolenbroek 				    isc_result_totext (status));
660*83ee113eSDavid van Moolenbroek 			    break;
661*83ee113eSDavid van Moolenbroek 		    }
662*83ee113eSDavid van Moolenbroek 
663*83ee113eSDavid van Moolenbroek 		    break;
664*83ee113eSDavid van Moolenbroek 
665*83ee113eSDavid van Moolenbroek 		  case REMOVE:
666*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
667*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
668*83ee113eSDavid van Moolenbroek 			    printf ("usage: remove\n");
669*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
670*83ee113eSDavid van Moolenbroek 			    break;
671*83ee113eSDavid van Moolenbroek 		    }
672*83ee113eSDavid van Moolenbroek 
673*83ee113eSDavid van Moolenbroek 		    if (!connected) {
674*83ee113eSDavid van Moolenbroek 			    printf ("not connected.\n");
675*83ee113eSDavid van Moolenbroek 			    break;
676*83ee113eSDavid van Moolenbroek 		    }
677*83ee113eSDavid van Moolenbroek 
678*83ee113eSDavid van Moolenbroek 		    if (!oh) {
679*83ee113eSDavid van Moolenbroek 			    printf ("no object.\n");
680*83ee113eSDavid van Moolenbroek 			    break;
681*83ee113eSDavid van Moolenbroek 		    }
682*83ee113eSDavid van Moolenbroek 
683*83ee113eSDavid van Moolenbroek 		    status = dhcpctl_object_remove(connection, oh);
684*83ee113eSDavid van Moolenbroek 		    if (status == ISC_R_SUCCESS)
685*83ee113eSDavid van Moolenbroek 			    status = dhcpctl_wait_for_completion
686*83ee113eSDavid van Moolenbroek 				    (oh, &waitstatus);
687*83ee113eSDavid van Moolenbroek 		    if (status == ISC_R_SUCCESS)
688*83ee113eSDavid van Moolenbroek 			    status = waitstatus;
689*83ee113eSDavid van Moolenbroek 		    if (status != ISC_R_SUCCESS) {
690*83ee113eSDavid van Moolenbroek 			    printf ("can't destroy object: %s\n",
691*83ee113eSDavid van Moolenbroek 				    isc_result_totext (status));
692*83ee113eSDavid van Moolenbroek 			    break;
693*83ee113eSDavid van Moolenbroek 		    }
694*83ee113eSDavid van Moolenbroek 		    omapi_object_dereference (&oh, MDL);
695*83ee113eSDavid van Moolenbroek 		    break;
696*83ee113eSDavid van Moolenbroek 
697*83ee113eSDavid van Moolenbroek 		  case REFRESH:
698*83ee113eSDavid van Moolenbroek 		    token = next_token (&val, (unsigned *)0, cfile);
699*83ee113eSDavid van Moolenbroek 		    if (token != END_OF_FILE && token != EOL) {
700*83ee113eSDavid van Moolenbroek 			    printf ("usage: refresh\n");
701*83ee113eSDavid van Moolenbroek 			    skip_to_semi (cfile);
702*83ee113eSDavid van Moolenbroek 			    break;
703*83ee113eSDavid van Moolenbroek 		    }
704*83ee113eSDavid van Moolenbroek 
705*83ee113eSDavid van Moolenbroek 		    if (!connected) {
706*83ee113eSDavid van Moolenbroek 			    printf ("not connected.\n");
707*83ee113eSDavid van Moolenbroek 			    break;
708*83ee113eSDavid van Moolenbroek 		    }
709*83ee113eSDavid van Moolenbroek 
710*83ee113eSDavid van Moolenbroek 		    if (!oh) {
711*83ee113eSDavid van Moolenbroek 			    printf ("no object.\n");
712*83ee113eSDavid van Moolenbroek 			    break;
713*83ee113eSDavid van Moolenbroek 		    }
714*83ee113eSDavid van Moolenbroek 
715*83ee113eSDavid van Moolenbroek 		    status = dhcpctl_object_refresh(connection, oh);
716*83ee113eSDavid van Moolenbroek 		    if (status == ISC_R_SUCCESS)
717*83ee113eSDavid van Moolenbroek 			    status = dhcpctl_wait_for_completion
718*83ee113eSDavid van Moolenbroek 				    (oh, &waitstatus);
719*83ee113eSDavid van Moolenbroek 		    if (status == ISC_R_SUCCESS)
720*83ee113eSDavid van Moolenbroek 			    status = waitstatus;
721*83ee113eSDavid van Moolenbroek 		    if (status != ISC_R_SUCCESS) {
722*83ee113eSDavid van Moolenbroek 			    printf ("can't refresh object: %s\n",
723*83ee113eSDavid van Moolenbroek 				    isc_result_totext (status));
724*83ee113eSDavid van Moolenbroek 			    break;
725*83ee113eSDavid van Moolenbroek 		    }
726*83ee113eSDavid van Moolenbroek 
727*83ee113eSDavid van Moolenbroek 		    break;
728*83ee113eSDavid van Moolenbroek 	    }
729*83ee113eSDavid van Moolenbroek 	    end_parse (&cfile);
730*83ee113eSDavid van Moolenbroek 	} while (1);
731*83ee113eSDavid van Moolenbroek 
732*83ee113eSDavid van Moolenbroek 	exit (0);
733*83ee113eSDavid van Moolenbroek }
734*83ee113eSDavid van Moolenbroek 
735*83ee113eSDavid van Moolenbroek /* Sigh */
dhcp_set_control_state(control_object_state_t oldstate,control_object_state_t newstate)736*83ee113eSDavid van Moolenbroek isc_result_t dhcp_set_control_state (control_object_state_t oldstate,
737*83ee113eSDavid van Moolenbroek 				     control_object_state_t newstate)
738*83ee113eSDavid van Moolenbroek {
739*83ee113eSDavid van Moolenbroek 	if (newstate != server_shutdown)
740*83ee113eSDavid van Moolenbroek 		return ISC_R_SUCCESS;
741*83ee113eSDavid van Moolenbroek 	exit (0);
742*83ee113eSDavid van Moolenbroek }
743