Annotation of embedaddon/dhcp/dhcpctl/dhcpctl.3, revision 1.1.1.1
1.1 misho 1: .\" -*- nroff -*-
2: .\"
3: .\" Project: DHCP
4: .\" File: dhcpctl.3
1.1.1.1 ! misho 5: .\" RCSId: $Id: dhcpctl.3,v 1.6.8.2.10.1 2011/04/26 00:01:57 sar Exp $
1.1 misho 6: .\"
7: .\" Copyright (c) 2011 by Internet Systems Consortium, Inc. ("ISC")
8: .\" Copyright (c) 2004,2009 by Internet Systems Consortium, Inc. ("ISC")
9: .\" Copyright (c) 2000-2003 by Internet Software Consortium
10: .\" Copyright (c) 2000 Nominum, Inc.
11: .\"
12: .\" Permission to use, copy, modify, and distribute this software for any
13: .\" purpose with or without fee is hereby granted, provided that the above
14: .\" copyright notice and this permission notice appear in all copies.
15: .\"
16: .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
17: .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
18: .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
19: .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20: .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21: .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
22: .\" OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23: .\"
24: .\" Internet Systems Consortium, Inc.
25: .\" 950 Charter Street
26: .\" Redwood City, CA 94063
27: .\" <info@isc.org>
28: .\" https://www.isc.org/
29: .\"
30: .\" Description: dhcpctl man page.
31: .\"
32: .\"
33: .Dd Nov 15, 2000
34: .Dt DHCPCTL 3
35: .Os DHCP 3
36: .ds vT DHCP Programmer's Manual
37: .\"
38: .\"
39: .\"
40: .Sh NAME
41: .Nm dhcpctl_initialize
42: .Nd dhcpctl library initialization.
43: .\"
44: .\"
45: .\"
46: .Sh SYNOPSIS
47: .Fd #include <dhcpctl/dhcpctl.h>
48: .Ft dhcpctl_status
49: .Fo dhcpctl_initialize
50: .Fa void
51: .Fc
52: .\"
53: .Ft dhcpctl_status
54: .Fo dhcpctl_connect
55: .Fa "dhcpctl_handle *cxn"
56: .Fa "const char *host"
57: .Fa "int port"
58: .Fa "dhcpctl_handle auth"
59: .Fc
60: .\"
61: .\"
62: .\"
63: .Ft dhcpctl_status
64: .Fo dhcpctl_wait_for_completion
65: .Fa "dhcpctl_handle object"
66: .Fa "dhcpctl_status *status"
67: .Fc
68: .\"
69: .\"
70: .\"
71: .Ft dhcpctl_status
72: .Fo dhcpctl_get_value
73: .Fa "dhcpctl_data_string *value"
74: .Fa "dhcpctl_handle object"
75: .Fa "const char *name"
76: .Fc
77: .\"
78: .\"
79: .\"
80: .Ft dhcpctl_status
81: .Fo dhcpctl_get_boolean
82: .Fa "int *value"
83: .Fa "dhcpctl_handle object"
84: .Fa "const char *name"
85: .Fc
86: .\"
87: .\"
88: .\"
89: .Ft dhcpctl_status
90: .Fo dhcpctl_set_value
91: .Fa "dhcpctl_handle object"
92: .Fa "dhcpctl_data_string value"
93: .Fa "const char *name"
94: .Fc
95: .\"
96: .\"
97: .\"
98: .Ft dhcpctl_status
99: .Fo dhcpctl_set_string_value
100: .Fa "dhcpctl_handle object"
101: .Fa "const char *value"
102: .Fa "const char *name"
103: .Fc
104: .\"
105: .\"
106: .\"
107: .Ft dhcpctl_status
108: .Fo dhcpctl_set_boolean_value
109: .Fa "dhcpctl_handle object"
110: .Fa "int value"
111: .Fa "const char *name"
112: .Fc
113: .\"
114: .\"
115: .\"
116: .Ft dhcpctl_status
117: .Fo dhcpctl_set_int_value
118: .Fa "dhcpctl_handle object"
119: .Fa "int value"
120: .Fa "const char *name"
121: .Fc
122: .\"
123: .\"
124: .\"
125: .Ft dhcpctl_status
126: .Fo dhcpctl_object_update
127: .Fa "dhcpctl_handle connection"
128: .Fa "dhcpctl_handle object"
129: .Fc
130: .\"
131: .\"
132: .\"
133: .Ft dhcpctl_status
134: .Fo dhcpctl_object_refresh
135: .Fa "dhcpctl_handle connection"
136: .Fa "dhcpctl_handle object"
137: .Fc
138: .\"
139: .\"
140: .\"
141: .Ft dhcpctl_status
142: .Fo dhcpctl_object_remove
143: .Fa "dhcpctl_handle connection"
144: .Fa "dhcpctl_handle object"
145: .Fc
146: .\"
147: .\"
148: .\"
149: .Ft dhcpctl_status
150: .Fo dhcpctl_set_callback
151: .Fa "dhcpctl_handle object"
152: .Fa "void *data"
153: .Fa "void (*function) (dhcpctl_handle, dhcpctl_status, void *)"
154: .Fc
155: .\"
156: .\"
157: .\"
158: .Ft dhcpctl_status
159: .Fo dhcpctl_new_authenticator
160: .Fa "dhcpctl_handle *object"
161: .Fa "const char *name"
162: .Fa "const char *algorithm"
163: .Fa "const char *secret"
164: .Fa "unsigned secret_len"
165: .Fc
166: .\"
167: .\"
168: .\"
169: .Ft dhcpctl_status
170: .Fo dhcpctl_new_object
171: .Fa "dhcpctl_handle *object"
172: .Fa "dhcpctl_handle connection"
173: .Fa "const char *object_type"
174: .Fc
175: .\"
176: .\"
177: .\"
178: .Ft dhcpctl_status
179: .Fo dhcpctl_open_object
180: .Fa "dhcpctl_handle object"
181: .Fa "dhcpctl_handle connection"
182: .Fa "int flags"
183: .Fc
184: .\"
185: .\"
186: .\"
187: .Ft isc_result_t
188: .Fo omapi_data_string_new
189: .Fa dhcpctl_data_string *data
190: .Fa unsigned int length
191: .Fa const char *filename,
192: .Fa int lineno
193: .Fc
194: .\"
195: .\"
196: .\"
197: .Ft isc_result_t
198: .Fo dhcpctl_data_string_dereference
199: .Fa "dhcpctl_data_string *"
200: .Fa "const char *"
201: .Fa "int"
202: .Fc
203: .Sh DESCRIPTION
204: The dhcpctl set of functions provide an API that can be used to communicate
205: with and manipulate a running ISC DHCP server. All functions return a value of
206: .Dv isc_result_t .
207: The return values reflects the result of operations to local data
208: structures. If an operation fails on the server for any reason, then the error
209: result will be returned through the
210: second parameter of the
211: .Fn dhcpctl_wait_for_completion
212: call.
213: .\"
214: .\"
215: .\"
216: .Pp
217: .Fn dhcpctl_initialize
218: sets up the data structures the library needs to do its work. This function
219: must be called once before any other.
220: .Pp
221: .Fn dhcpctl_connect
222: opens a connection to the DHCP server at the given host and port. If an
223: authenticator has been created for the connection, then it is given as the 4th
224: argument. On a successful return the address pointed at by the first
225: argument will have a new connection object assigned to it.
226: .Pp
227: For example:
228: .Bd -literal -offset indent
229: s = dhcpctl_connect(&cxn, "127.0.0.1", 7911, NULL);
230: .Ed
231: .Pp
232: connects to the DHCP server on the localhost via port 7911 (the standard
233: OMAPI port). No authentication is used for the connection.
234: .\"
235: .\"
236: .\"
237: .Pp
238: .Fn dhcpctl_wait_for_completion
239: flushes a pending message to the server and waits for the response. The result
240: of the request as processed on the server is returned via the second
241: parameter.
242: .Bd -literal -offset indent
243: s = dhcpctl_wait_for_completion(cxn, &wv);
244: if (s != ISC_R_SUCCESS)
245: local_failure(s);
246: else if (wv != ISC_R_SUCCESS)
247: server_failure(wc);
248: .Ed
249: .Pp
250: The call to
251: .Fn dhcpctl_wait_for_completion
252: won't return until the remote message processing completes or the connection
253: to the server is lost.
254: .\"
255: .\"
256: .\"
257: .Pp
258: .Fn dhcpctl_get_value
259: extracts a value of an attribute from the handle. The value can be of any
260: length and is treated as a sequence of bytes. The handle must have been
261: created first with
262: .Fn dhcpctl_new_object
263: and opened with
264: .Fn dhcpctl_open_object .
265: The value is returned via the parameter named
266: .Dq value .
267: The last parameter is the name of attribute to retrieve.
268: .Bd -literal -offset indent
269: dhcpctl_data_string value = NULL;
270: dhcpctl_handle lease;
271: time_t thetime;
272:
273: s = dhcpctl_get_value (&value, lease, "ends");
274: assert(s == ISC_R_SUCCESS && value->len == sizeof(thetime));
275: memcpy(&thetime, value->value, value->len);
276: .Ed
277: .\"
278: .\"
279: .\"
280: .Pp
281: .Fn dhcpctl_get_boolean
282: extracts a boolean valued attribute from the object handle.
283: .\"
284: .\"
285: .\"
286: .Pp
287: The
288: .Fn dhcpctl_set_value ,
289: .Fn dhcpctl_set_string_value ,
290: .Fn dhcpctl_set_boolean_value ,
291: and
292: .Fn dhcpctl_set_int_value
293: functions all set a value on the object handle.
294: .\"
295: .\"
296: .\"
297: .Pp
298: .Fn dhcpctl_object_update
299: function queues a request for
300: all the changes made to the object handle be be sent to the remote
301: for processing. The changes made to the atributes on the handle will be
302: applied to remote object if permitted.
303: .\"
304: .\"
305: .\"
306: .Pp
307: .Fn dhcpctl_object_refresh
308: queues up a request for a fresh copy of all the attribute values to be sent
309: from the remote to
310: refresh the values in the local object handle.
311: .\"
312: .\"
313: .\"
314: .Pp
315: .Fn dhcpctl_object_remove
316: queues a request for the removal on the server of the object referenced by the
317: handle.
318: .\"
319: .\"
320: .\"
321: .Pp
322: The
323: .Fn dhcpctl_set_callback
324: function sets up a user-defined function to be called when an event completes
325: on the given object handle. This is needed for asynchronous handling of
326: events, versus the synchronous handling given by
327: .Fn dhcpctl_wait_for_completion .
328: When the function is called the first parameter is the object the event
329: arrived for, the second is the status of the message that was processed, the
330: third is the same value as the second parameter given to
331: .Fn dhcpctl_set_callback .
332: .\"
333: .\"
334: .\"
335: .Pp
336: The
337: .Fn dhcpctl_new_authenticator
338: creates a new authenticator object to be used for signing the messages
339: that cross over the network. The
340: .Dq name ,
341: .Dq algorithm ,
342: and
343: .Dq secret
344: values must all match what the server uses and are defined in its
345: configuration file. The created object is returned through the first parameter
346: and must be used as the 4th parameter to
347: .Fn dhcpctl_connect .
348: Note that the 'secret' value must not be base64 encoded, which is different
349: from how the value appears in the dhcpd.conf file.
350: .\"
351: .\"
352: .\"
353: .Pp
354: .Fn dhcpctl_new_object
355: creates a local handle for an object on the the server. The
356: .Dq object_type
357: parameter is the ascii name of the type of object being accessed. e.g.
358: .Qq lease .
359: This function only sets up local data structures, it does not queue any
360: messages
361: to be sent to the remote side,
362: .Fn dhcpctl_open_object
363: does that.
364: .\"
365: .\"
366: .\"
367: .Pp
368: .Fn dhcpctl_open_object
369: builds and queues the request to the remote side. This function is used with
370: handle created via
371: .Fn dhcpctl_new_object .
372: The flags argument is a bit mask with the following values available for
373: setting:
374: .Bl -tag -offset indent -width 20
375: .It DHCPCTL_CREATE
376: if the object does not exist then the remote will create it
377: .It DHCPCTL_UPDATE
378: update the object on the remote side using the
379: attributes already set in the handle.
380: .It DHCPCTL_EXCL
381: return and error if the object exists and DHCPCTL_CREATE
382: was also specified
383: .El
384: .\"
385: .\"
386: .\"
387: .Pp
388: The
389: .Fn omapi_data_string_new
390: function allocates a new
391: .Ft dhcpctl_data_string
392: object. The data string will be large enough to hold
393: .Dq length
394: bytes of data. The
395: .Dq file
396: and
397: .Dq lineno
398: arguments are the source file location the call is made from, typically by
399: using the
400: .Dv __FILE__
401: and
402: .Dv __LINE__
403: macros or the
404: .Dv MDL
405: macro defined in
406: .
407: .\"
408: .\"
409: .\"
410: .Pp
411: .Fn dhcpctl_data_string_dereference
412: deallocates a data string created by
413: .Fn omapi_data_string_new .
414: The memory for the object won't be freed until the last reference is
415: released.
416: .Sh EXAMPLES
417: .Pp
418: The following program will connect to the DHCP server running on the local
419: host and will get the details of the existing lease for IP address
420: 10.0.0.101. It will then print out the time the lease is due to expire. Note
421: that most error checking has been ommitted for brevity.
422: .Bd -literal -offset indent
423: #include <sys/time.h>
424: #include <stdio.h>
425: #include <stdlib.h>
426: #include <string.h>
427: #include <stdarg.h>
428:
429: #include <sys/socket.h>
430: #include <netinet/in.h>
431: #include <arpa/inet.h>
432:
433: #include "isc-dhcp/result.h"
434: #include "dhcpctl.h"
435:
436: int main (int argc, char **argv) {
437: dhcpctl_data_string ipaddrstring = NULL;
438: dhcpctl_data_string value = NULL;
439: dhcpctl_handle connection = NULL;
440: dhcpctl_handle lease = NULL;
441: isc_result_t waitstatus;
442: struct in_addr convaddr;
443: time_t thetime;
444:
445: dhcpctl_initialize ();
446:
447: dhcpctl_connect (&connection, "127.0.0.1",
448: 7911, 0);
449:
450: dhcpctl_new_object (&lease, connection,
451: "lease");
452:
453: memset (&ipaddrstring, 0, sizeof
454: ipaddrstring);
455:
456: inet_pton(AF_INET, "10.0.0.101",
457: &convaddr);
458:
459: omapi_data_string_new (&ipaddrstring,
460: 4, MDL);
461: memcpy(ipaddrstring->value, &convaddr.s_addr, 4);
462:
463: dhcpctl_set_value (lease, ipaddrstring,
464: "ip-address");
465:
466: dhcpctl_open_object (lease, connection, 0);
467:
468: dhcpctl_wait_for_completion (lease,
469: &waitstatus);
470: if (waitstatus != ISC_R_SUCCESS) {
471: /* server not authoritative */
472: exit (0);
473: }
474:
475: dhcpctl_data_string_dereference(&ipaddrstring,
476: MDL);
477:
478: dhcpctl_get_value (&value, lease, "ends");
479:
480: memcpy(&thetime, value->value, value->len);
481:
482: dhcpctl_data_string_dereference(&value, MDL);
483:
484: fprintf (stdout, "ending time is %s",
485: ctime(&thetime));
486: }
487: .Ed
488: .Sh SEE ALSO
489: omapi(3), omshell(1), dhcpd(8), dhclient(8), dhcpd.conf(5), dhclient.conf(5).
490: .Sh AUTHOR
491: .Em dhcpctl
492: was written by Ted Lemon of Nominum, Inc.
493: This preliminary documentation was written by James Brister of Nominum, Inc.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>