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