Annotation of embedaddon/dhcp/dhcpctl/dhcpctl.c, revision 1.1

1.1     ! misho       1: /* dhcpctl.c
        !             2: 
        !             3:    Subroutines providing general support for objects. */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2004,2007,2009 by Internet Systems Consortium, Inc. ("ISC")
        !             7:  * Copyright (c) 1999-2003 by Internet Software Consortium
        !             8:  *
        !             9:  * Permission to use, copy, modify, and distribute this software for any
        !            10:  * purpose with or without fee is hereby granted, provided that the above
        !            11:  * copyright notice and this permission notice appear in all copies.
        !            12:  *
        !            13:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
        !            14:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            15:  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
        !            16:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            17:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            18:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
        !            19:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            20:  *
        !            21:  *   Internet Systems Consortium, Inc.
        !            22:  *   950 Charter Street
        !            23:  *   Redwood City, CA 94063
        !            24:  *   <info@isc.org>
        !            25:  *   https://www.isc.org/
        !            26:  *
        !            27:  * This software has been written for Internet Systems Consortium
        !            28:  * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
        !            29:  * To learn more about Internet Systems Consortium, see
        !            30:  * ``https://www.isc.org/''.  To learn more about Vixie Enterprises,
        !            31:  * see ``http://www.vix.com''.   To learn more about Nominum, Inc., see
        !            32:  * ``http://www.nominum.com''.
        !            33:  */
        !            34: 
        !            35: #include "dhcpd.h"
        !            36: #include <omapip/omapip_p.h>
        !            37: #include "dhcpctl.h"
        !            38: 
        !            39: omapi_object_type_t *dhcpctl_callback_type;
        !            40: omapi_object_type_t *dhcpctl_remote_type;
        !            41: 
        !            42: /* dhcpctl_initialize ()
        !            43: 
        !            44:    Must be called before any other dhcpctl function. */
        !            45: 
        !            46: dhcpctl_status dhcpctl_initialize ()
        !            47: {
        !            48:        isc_result_t status;
        !            49: 
        !            50:        status = omapi_init();
        !            51:        if (status != ISC_R_SUCCESS)
        !            52:                return status;
        !            53: 
        !            54:        status = omapi_object_type_register (&dhcpctl_callback_type,
        !            55:                                             "dhcpctl-callback",
        !            56:                                             dhcpctl_callback_set_value,
        !            57:                                             dhcpctl_callback_get_value,
        !            58:                                             dhcpctl_callback_destroy,
        !            59:                                             dhcpctl_callback_signal_handler,
        !            60:                                             dhcpctl_callback_stuff_values,
        !            61:                                             0, 0, 0, 0, 0, 0,
        !            62:                                             sizeof
        !            63:                                             (dhcpctl_callback_object_t), 0,
        !            64:                                             RC_MISC);
        !            65:        if (status != ISC_R_SUCCESS)
        !            66:                return status;
        !            67: 
        !            68:        status = omapi_object_type_register (&dhcpctl_remote_type,
        !            69:                                             "dhcpctl-remote",
        !            70:                                             dhcpctl_remote_set_value,
        !            71:                                             dhcpctl_remote_get_value,
        !            72:                                             dhcpctl_remote_destroy,
        !            73:                                             dhcpctl_remote_signal_handler,
        !            74:                                             dhcpctl_remote_stuff_values,
        !            75:                                             0, 0, 0, 0, 0, 0,
        !            76:                                             sizeof (dhcpctl_remote_object_t),
        !            77:                                             0, RC_MISC);
        !            78:        if (status != ISC_R_SUCCESS)
        !            79:                return status;
        !            80: 
        !            81:        return ISC_R_SUCCESS;
        !            82: }
        !            83: 
        !            84: /* dhcpctl_connect
        !            85: 
        !            86:    synchronous
        !            87:    returns nonzero status code if it didn't connect, zero otherwise
        !            88:    stores connection handle through connection, which can be used
        !            89:    for subsequent access to the specified server. 
        !            90:    server_name is the name of the server, and port is the TCP
        !            91:    port on which it is listening.
        !            92:    authinfo is the handle to an object containing authentication
        !            93:    information. */
        !            94: 
        !            95: dhcpctl_status dhcpctl_connect (dhcpctl_handle *connection,
        !            96:                                const char *server_name, int port,
        !            97:                                dhcpctl_handle authinfo)
        !            98: {
        !            99:        isc_result_t status;
        !           100: 
        !           101:        status = omapi_generic_new (connection, MDL);
        !           102:        if (status != ISC_R_SUCCESS) {
        !           103:                return status;
        !           104:        }
        !           105: 
        !           106:        status = omapi_protocol_connect (*connection, server_name,
        !           107:                                         (unsigned)port, authinfo);
        !           108:        if (status == ISC_R_SUCCESS)
        !           109:                return status;
        !           110:        if (status != ISC_R_INCOMPLETE) {
        !           111:                omapi_object_dereference (connection, MDL);
        !           112:                return status;
        !           113:        }
        !           114: 
        !           115:        status = omapi_wait_for_completion (*connection, 0);
        !           116:        if (status != ISC_R_SUCCESS) {
        !           117:                omapi_object_dereference (connection, MDL);
        !           118:                return status;
        !           119:        }
        !           120: 
        !           121:        return status;
        !           122: }
        !           123: 
        !           124: /* dhcpctl_wait_for_completion
        !           125: 
        !           126:    synchronous
        !           127:    returns zero if the callback completes, a nonzero status if
        !           128:    there was some problem relating to the wait operation.   The
        !           129:    status of the queued request will be stored through s, and
        !           130:    will also be either zero for success or nonzero for some kind
        !           131:    of failure.    Never returns until completion or until the
        !           132:    connection to the server is lost.   This performs the same
        !           133:    function as dhcpctl_set_callback and the subsequent callback,
        !           134:    for programs that want to do inline execution instead of using
        !           135:    callbacks. */
        !           136: 
        !           137: dhcpctl_status dhcpctl_wait_for_completion (dhcpctl_handle h,
        !           138:                                            dhcpctl_status *s)
        !           139: {
        !           140:        isc_result_t status;
        !           141:        status = omapi_wait_for_completion (h, 0);
        !           142:        if (status != ISC_R_SUCCESS)
        !           143:                return status;
        !           144:        if (h -> type == dhcpctl_remote_type)
        !           145:                *s = ((dhcpctl_remote_object_t *)h) -> waitstatus;
        !           146:        return ISC_R_SUCCESS;
        !           147: }
        !           148: 
        !           149: /* dhcpctl_get_value
        !           150: 
        !           151:    synchronous
        !           152:    returns zero if the call succeeded, a nonzero status code if
        !           153:    it didn't. 
        !           154:    result is the address of an empty data string (initialized
        !           155:    with bzero or cleared with data_string_forget).   On
        !           156:    successful completion, the addressed data string will contain
        !           157:    the value that was fetched.
        !           158:    dhcpctl_handle refers to some dhcpctl item
        !           159:    value_name refers to some value related to that item - e.g.,
        !           160:    for a handle associated with a completed host lookup, value
        !           161:    could be one of "hardware-address", "dhcp-client-identifier",
        !           162:    "known" or "client-hostname". */
        !           163: 
        !           164: dhcpctl_status dhcpctl_get_value (dhcpctl_data_string *result,
        !           165:                                  dhcpctl_handle h, const char *value_name)
        !           166: {
        !           167:        isc_result_t status;
        !           168:        omapi_value_t *tv = (omapi_value_t *)0;
        !           169:        unsigned len;
        !           170:        int ip;
        !           171: 
        !           172:        status = omapi_get_value_str (h, (omapi_object_t *)0, value_name, &tv);
        !           173:        if (status != ISC_R_SUCCESS)
        !           174:                return status;
        !           175: 
        !           176:        switch (tv -> value -> type) {
        !           177:              case omapi_datatype_int:
        !           178:                len = sizeof (int);
        !           179:                break;
        !           180: 
        !           181:              case omapi_datatype_string:
        !           182:              case omapi_datatype_data:
        !           183:                len = tv -> value -> u.buffer.len;
        !           184:                break;
        !           185: 
        !           186:              case omapi_datatype_object:
        !           187:                len = sizeof (omapi_handle_t);
        !           188:                break;
        !           189: 
        !           190:              default:
        !           191:                omapi_typed_data_dereference (&tv -> value, MDL);
        !           192:                return ISC_R_UNEXPECTED;
        !           193:        }
        !           194: 
        !           195:        status = omapi_data_string_new (result, len, MDL);
        !           196:        if (status != ISC_R_SUCCESS) {
        !           197:                omapi_typed_data_dereference (&tv -> value, MDL);
        !           198:                return status;
        !           199:        }
        !           200: 
        !           201:        switch (tv -> value -> type) {
        !           202:              case omapi_datatype_int:
        !           203:                ip = htonl (tv -> value -> u.integer);
        !           204:                memcpy ((*result) -> value, &ip, sizeof ip);
        !           205:                break;
        !           206: 
        !           207:              case omapi_datatype_string:
        !           208:              case omapi_datatype_data:
        !           209:                memcpy ((*result) -> value,
        !           210:                        tv -> value -> u.buffer.value,
        !           211:                        tv -> value -> u.buffer.len);
        !           212:                break;
        !           213: 
        !           214:              case omapi_datatype_object:
        !           215:                ip = htonl (tv -> value -> u.object -> handle);
        !           216:                memcpy ((*result) -> value, &ip, sizeof ip);
        !           217:                break;
        !           218:        }
        !           219: 
        !           220:        omapi_value_dereference (&tv, MDL);
        !           221:        return ISC_R_SUCCESS;
        !           222: }
        !           223: 
        !           224: /* dhcpctl_get_boolean
        !           225: 
        !           226:    like dhcpctl_get_value, but more convenient for boolean
        !           227:    values, since no data_string needs to be dealt with. */
        !           228: 
        !           229: dhcpctl_status dhcpctl_get_boolean (int *result,
        !           230:                                    dhcpctl_handle h, const char *value_name)
        !           231: {
        !           232:        isc_result_t status;
        !           233:        dhcpctl_data_string data = (dhcpctl_data_string)0;
        !           234:        int rv;
        !           235:        
        !           236:        status = dhcpctl_get_value (&data, h, value_name);
        !           237:        if (status != ISC_R_SUCCESS)
        !           238:                return status;
        !           239:        if (data -> len != sizeof rv) {
        !           240:                omapi_data_string_dereference (&data, MDL);
        !           241:                return ISC_R_UNEXPECTED;
        !           242:        }
        !           243:        memcpy (&rv, data -> value, sizeof rv);
        !           244:        *result = ntohl (rv);
        !           245:        return ISC_R_SUCCESS;
        !           246: }
        !           247: 
        !           248: /* dhcpctl_set_value
        !           249: 
        !           250:    Sets a value on an object referred to by a dhcpctl_handle.
        !           251:    The opposite of dhcpctl_get_value.   Does not update the
        !           252:    server - just sets the value on the handle. */
        !           253: 
        !           254: dhcpctl_status dhcpctl_set_value (dhcpctl_handle h, dhcpctl_data_string value,
        !           255:                                  const char *value_name)
        !           256: {
        !           257:        isc_result_t status;
        !           258:        omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
        !           259:        omapi_data_string_t *name = (omapi_data_string_t *)0;
        !           260: 
        !           261:        status = omapi_data_string_new (&name, strlen (value_name), MDL);
        !           262:        if (status != ISC_R_SUCCESS)
        !           263:                return status;
        !           264:        memcpy (name -> value, value_name, strlen (value_name));
        !           265: 
        !           266:        status = omapi_typed_data_new (MDL, &tv, omapi_datatype_data,
        !           267:                                       value -> len);
        !           268:        if (status != ISC_R_SUCCESS) {
        !           269:                omapi_data_string_dereference (&name, MDL);
        !           270:                return status;
        !           271:        }
        !           272:        memcpy (tv -> u.buffer.value, value -> value, value -> len);
        !           273: 
        !           274:        status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
        !           275:        omapi_data_string_dereference (&name, MDL);
        !           276:        omapi_typed_data_dereference (&tv, MDL);
        !           277:        return status;
        !           278: }
        !           279: 
        !           280: /* dhcpctl_set_string_value
        !           281: 
        !           282:    Sets a NUL-terminated ASCII value on an object referred to by
        !           283:    a dhcpctl_handle.   like dhcpctl_set_value, but saves the
        !           284:    trouble of creating a data_string for a NUL-terminated string.
        !           285:    Does not update the server - just sets the value on the handle. */
        !           286: 
        !           287: dhcpctl_status dhcpctl_set_string_value (dhcpctl_handle h, const char *value,
        !           288:                                         const char *value_name)
        !           289: {
        !           290:        isc_result_t status;
        !           291:        omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
        !           292:        omapi_data_string_t *name = (omapi_data_string_t *)0;
        !           293: 
        !           294:        status = omapi_data_string_new (&name, strlen (value_name), MDL);
        !           295:        if (status != ISC_R_SUCCESS)
        !           296:                return status;
        !           297:        memcpy (name -> value, value_name, strlen (value_name));
        !           298: 
        !           299:        status = omapi_typed_data_new (MDL, &tv, omapi_datatype_string, value);
        !           300:        if (status != ISC_R_SUCCESS) {
        !           301:                omapi_data_string_dereference (&name, MDL);
        !           302:                return status;
        !           303:        }
        !           304: 
        !           305:        status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
        !           306:        omapi_data_string_dereference (&name, MDL);
        !           307:        omapi_typed_data_dereference (&tv, MDL);
        !           308:        return status;
        !           309: }
        !           310: 
        !           311: /* dhcpctl_set_buffer_value
        !           312: 
        !           313:    Sets a value on an object referred to by a dhcpctl_handle.  like
        !           314:    dhcpctl_set_value, but saves the trouble of creating a data_string
        !           315:    for string for which we have a buffer and length.  Does not update
        !           316:    the server - just sets the value on the handle. */
        !           317: 
        !           318: dhcpctl_status dhcpctl_set_data_value (dhcpctl_handle h,
        !           319:                                       const char *value, unsigned len,
        !           320:                                       const char *value_name)
        !           321: {
        !           322:        isc_result_t status;
        !           323:        omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
        !           324:        omapi_data_string_t *name = (omapi_data_string_t *)0;
        !           325:        unsigned ll;
        !           326: 
        !           327:        ll = strlen (value_name);
        !           328:        status = omapi_data_string_new (&name, ll, MDL);
        !           329:        if (status != ISC_R_SUCCESS)
        !           330:                return status;
        !           331:        memcpy (name -> value, value_name, ll);
        !           332: 
        !           333:        status = omapi_typed_data_new (MDL, &tv,
        !           334:                                       omapi_datatype_data, len, value);
        !           335:        if (status != ISC_R_SUCCESS) {
        !           336:                omapi_data_string_dereference (&name, MDL);
        !           337:                return status;
        !           338:        }
        !           339:        memcpy (tv -> u.buffer.value, value, len);
        !           340: 
        !           341:        status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
        !           342:        omapi_data_string_dereference (&name, MDL);
        !           343:        omapi_typed_data_dereference (&tv, MDL);
        !           344:        return status;
        !           345: }
        !           346: 
        !           347: /* dhcpctl_set_null_value
        !           348: 
        !           349:    Sets a null value on an object referred to by a dhcpctl_handle. */
        !           350: 
        !           351: dhcpctl_status dhcpctl_set_null_value (dhcpctl_handle h,
        !           352:                                       const char *value_name)
        !           353: {
        !           354:        isc_result_t status;
        !           355:        omapi_data_string_t *name = (omapi_data_string_t *)0;
        !           356:        unsigned ll;
        !           357: 
        !           358:        ll = strlen (value_name);
        !           359:        status = omapi_data_string_new (&name, ll, MDL);
        !           360:        if (status != ISC_R_SUCCESS)
        !           361:                return status;
        !           362:        memcpy (name -> value, value_name, ll);
        !           363: 
        !           364:        status = omapi_set_value (h, (omapi_object_t *)0, name,
        !           365:                                  (omapi_typed_data_t *)0);
        !           366:        omapi_data_string_dereference (&name, MDL);
        !           367:        return status;
        !           368: }
        !           369: 
        !           370: /* dhcpctl_set_boolean_value
        !           371: 
        !           372:    Sets a boolean value on an object - like dhcpctl_set_value,
        !           373:    only more convenient for booleans. */
        !           374: 
        !           375: dhcpctl_status dhcpctl_set_boolean_value (dhcpctl_handle h, int value,
        !           376:                                          const char *value_name)
        !           377: {
        !           378:        isc_result_t status;
        !           379:        omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
        !           380:        omapi_data_string_t *name = (omapi_data_string_t *)0;
        !           381: 
        !           382:        status = omapi_data_string_new (&name, strlen (value_name), MDL);
        !           383:        if (status != ISC_R_SUCCESS)
        !           384:                return status;
        !           385:        memcpy (name -> value, value_name, strlen (value_name));
        !           386: 
        !           387:        status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
        !           388:        if (status != ISC_R_SUCCESS) {
        !           389:                omapi_data_string_dereference (&name, MDL);
        !           390:                return status;
        !           391:        }
        !           392: 
        !           393:        status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
        !           394:        omapi_data_string_dereference (&name, MDL);
        !           395:        omapi_typed_data_dereference (&tv, MDL);
        !           396:        return status;
        !           397: }
        !           398: 
        !           399: /* dhcpctl_set_int_value
        !           400: 
        !           401:    Sets a boolean value on an object - like dhcpctl_set_value,
        !           402:    only more convenient for booleans. */
        !           403: 
        !           404: dhcpctl_status dhcpctl_set_int_value (dhcpctl_handle h, int value,
        !           405:                                      const char *value_name)
        !           406: {
        !           407:        isc_result_t status;
        !           408:        omapi_typed_data_t *tv = (omapi_typed_data_t *)0;
        !           409:        omapi_data_string_t *name = (omapi_data_string_t *)0;
        !           410: 
        !           411:        status = omapi_data_string_new (&name, strlen (value_name), MDL);
        !           412:        if (status != ISC_R_SUCCESS)
        !           413:                return status;
        !           414:        memcpy (name -> value, value_name, strlen (value_name));
        !           415: 
        !           416:        status = omapi_typed_data_new (MDL, &tv, omapi_datatype_int, value);
        !           417:        if (status != ISC_R_SUCCESS) {
        !           418:                omapi_data_string_dereference (&name, MDL);
        !           419:                return status;
        !           420:        }
        !           421: 
        !           422:        status = omapi_set_value (h, (omapi_object_t *)0, name, tv);
        !           423:        omapi_data_string_dereference (&name, MDL);
        !           424:        omapi_typed_data_dereference (&tv, MDL);
        !           425:        return status;
        !           426: }
        !           427: 
        !           428: /* dhcpctl_object_update
        !           429: 
        !           430:    Queues an update on the object referenced by the handle (there
        !           431:    can't be any other work in progress on the handle).   An
        !           432:    update means local parameters will be sent to the server. */
        !           433: 
        !           434: dhcpctl_status dhcpctl_object_update (dhcpctl_handle connection,
        !           435:                                      dhcpctl_handle h)
        !           436: {
        !           437:        isc_result_t status;
        !           438:        omapi_object_t *message = (omapi_object_t *)0;
        !           439:        dhcpctl_remote_object_t *ro;
        !           440: 
        !           441:        if (h -> type != dhcpctl_remote_type)
        !           442:                return ISC_R_INVALIDARG;
        !           443:        ro = (dhcpctl_remote_object_t *)h;
        !           444: 
        !           445:        status = omapi_message_new (&message, MDL);
        !           446:        if (status != ISC_R_SUCCESS) {
        !           447:                omapi_object_dereference (&message, MDL);
        !           448:                return status;
        !           449:        }
        !           450:        status = omapi_set_int_value (message, (omapi_object_t *)0,
        !           451:                                      "op", OMAPI_OP_UPDATE);
        !           452:        if (status != ISC_R_SUCCESS) {
        !           453:                omapi_object_dereference (&message, MDL);
        !           454:                return status;
        !           455:        }
        !           456: 
        !           457:        status = omapi_set_object_value (message, (omapi_object_t *)0,
        !           458:                                         "object", h);
        !           459:        if (status != ISC_R_SUCCESS) {
        !           460:                omapi_object_dereference (&message, MDL);
        !           461:                return status;
        !           462:        }
        !           463: 
        !           464:        status = omapi_set_int_value (message, (omapi_object_t *)0, "handle",
        !           465:                                      (int)(ro -> remote_handle));
        !           466:        if (status != ISC_R_SUCCESS) {
        !           467:                omapi_object_dereference (&message, MDL);
        !           468:                return status;
        !           469:        }
        !           470: 
        !           471:        omapi_message_register (message);
        !           472:        status = omapi_protocol_send_message (connection -> outer,
        !           473:                                              (omapi_object_t *)0,
        !           474:                                              message, (omapi_object_t *)0);
        !           475:        omapi_object_dereference (&message, MDL);
        !           476:        return status;
        !           477: }
        !           478: 
        !           479: /* Requests a refresh on the object referenced by the handle (there
        !           480:    can't be any other work in progress on the handle).   A
        !           481:    refresh means local parameters are updated from the server. */
        !           482: 
        !           483: dhcpctl_status dhcpctl_object_refresh (dhcpctl_handle connection,
        !           484:                                       dhcpctl_handle h)
        !           485: {
        !           486:        isc_result_t status;
        !           487:        omapi_object_t *message = (omapi_object_t *)0;
        !           488:        dhcpctl_remote_object_t *ro;
        !           489: 
        !           490:        if (h -> type != dhcpctl_remote_type)
        !           491:                return ISC_R_INVALIDARG;
        !           492:        ro = (dhcpctl_remote_object_t *)h;
        !           493: 
        !           494:        status = omapi_message_new (&message, MDL);
        !           495:        if (status != ISC_R_SUCCESS) {
        !           496:                omapi_object_dereference (&message, MDL);
        !           497:                return status;
        !           498:        }
        !           499:        status = omapi_set_int_value (message, (omapi_object_t *)0,
        !           500:                                      "op", OMAPI_OP_REFRESH);
        !           501:        if (status != ISC_R_SUCCESS) {
        !           502:                omapi_object_dereference (&message, MDL);
        !           503:                return status;
        !           504:        }
        !           505:        status = omapi_set_int_value (message, (omapi_object_t *)0,
        !           506:                                      "handle", (int)(ro -> remote_handle));
        !           507:        if (status != ISC_R_SUCCESS) {
        !           508:                omapi_object_dereference (&message, MDL);
        !           509:                return status;
        !           510:        }
        !           511: 
        !           512:        omapi_message_register (message);
        !           513:        status = omapi_protocol_send_message (connection -> outer,
        !           514:                                              (omapi_object_t *)0,
        !           515:                                              message, (omapi_object_t *)0);
        !           516: 
        !           517:        /* We don't want to send the contents of the object down the
        !           518:           wire, but we do need to reference it so that we know what
        !           519:           to do with the update. */
        !           520:        status = omapi_set_object_value (message, (omapi_object_t *)0,
        !           521:                                         "object", h);
        !           522:        if (status != ISC_R_SUCCESS) {
        !           523:                omapi_object_dereference (&message, MDL);
        !           524:                return status;
        !           525:        }
        !           526: 
        !           527:        omapi_object_dereference (&message, MDL);
        !           528:        return status;
        !           529: }
        !           530: 
        !           531: /* Requests the removal of the object referenced by the handle (there
        !           532:    can't be any other work in progress on the handle).   A
        !           533:    removal means that all searchable references to the object on the
        !           534:    server are deleted. */
        !           535: 
        !           536: dhcpctl_status dhcpctl_object_remove (dhcpctl_handle connection,
        !           537:                                      dhcpctl_handle h)
        !           538: {
        !           539:        isc_result_t status;
        !           540:        omapi_object_t *message = (omapi_object_t *)0;
        !           541:        dhcpctl_remote_object_t *ro;
        !           542: 
        !           543:        if (h -> type != dhcpctl_remote_type)
        !           544:                return ISC_R_INVALIDARG;
        !           545:        ro = (dhcpctl_remote_object_t *)h;
        !           546: 
        !           547:        status = omapi_message_new (&message, MDL);
        !           548:        if (status != ISC_R_SUCCESS) {
        !           549:                omapi_object_dereference (&message, MDL);
        !           550:                return status;
        !           551:        }
        !           552:        status = omapi_set_int_value (message, (omapi_object_t *)0,
        !           553:                                      "op", OMAPI_OP_DELETE);
        !           554:        if (status != ISC_R_SUCCESS) {
        !           555:                omapi_object_dereference (&message, MDL);
        !           556:                return status;
        !           557:        }
        !           558: 
        !           559:        status = omapi_set_int_value (message, (omapi_object_t *)0, "handle",
        !           560:                                      (int)(ro -> remote_handle));
        !           561:        if (status != ISC_R_SUCCESS) {
        !           562:                omapi_object_dereference (&message, MDL);
        !           563:                return status;
        !           564:        }
        !           565: 
        !           566:        status = omapi_set_object_value (message, (omapi_object_t *)0,
        !           567:                                         "notify-object", h);
        !           568:        if (status != ISC_R_SUCCESS) {
        !           569:                omapi_object_dereference (&message, MDL);
        !           570:                return status;
        !           571:        }
        !           572: 
        !           573:        omapi_message_register (message);
        !           574:        status = omapi_protocol_send_message (connection -> outer,
        !           575:                                              (omapi_object_t *)0,
        !           576:                                              message, (omapi_object_t *)0);
        !           577:        omapi_object_dereference (&message, MDL);
        !           578:        return status;
        !           579: }
        !           580: 
        !           581: isc_result_t dhcpctl_data_string_dereference (dhcpctl_data_string *vp,
        !           582:                                              const char *file, int line)
        !           583: {
        !           584:        return omapi_data_string_dereference (vp, file, line);
        !           585: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>