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>