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

1.1     ! misho       1: /* remote.c
        !             2: 
        !             3:    The dhcpctl remote object. */
        !             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: /* dhcpctl_new_authenticator
        !            40: 
        !            41:    synchronous - creates an authenticator object.
        !            42:    returns nonzero status code if the object couldn't be created
        !            43:    stores handle to authenticator through h if successful, and returns zero.
        !            44:    name is the authenticator name (NUL-terminated string).
        !            45:    algorithm is the NUL-terminated string name of the algorithm to use
        !            46:    (currently, only "hmac-md5" is supported).
        !            47:    secret and secret_len is the key secret. */
        !            48: 
        !            49: dhcpctl_status dhcpctl_new_authenticator (dhcpctl_handle *h,
        !            50:                                          const char *name,
        !            51:                                          const char *algorithm,
        !            52:                                          const unsigned char *secret,
        !            53:                                          unsigned secret_len)
        !            54: {
        !            55:        struct auth_key *key = (struct auth_key *)0;
        !            56:        isc_result_t status;
        !            57: 
        !            58:        status = omapi_auth_key_new (&key, MDL);
        !            59:        if (status != ISC_R_SUCCESS)
        !            60:                return status;
        !            61: 
        !            62:        key -> name = dmalloc (strlen (name) + 1, MDL);
        !            63:        if (!key -> name) {
        !            64:                omapi_auth_key_dereference (&key, MDL);
        !            65:                return ISC_R_NOMEMORY;
        !            66:        }
        !            67:        strcpy (key -> name, name);
        !            68: 
        !            69:        /* If the algorithm name isn't an FQDN, tack on the
        !            70:           .SIG-ALG.REG.NET. domain. */
        !            71:        if (strchr (algorithm, '.') == 0) {
        !            72:                static char add[] = ".SIG-ALG.REG.INT.";
        !            73:                key -> algorithm = dmalloc (strlen (algorithm) +
        !            74:                                            sizeof (add), MDL);
        !            75:                if (!key -> algorithm) {
        !            76:                        omapi_auth_key_dereference (&key, MDL);
        !            77:                        return ISC_R_NOMEMORY;
        !            78:                }
        !            79:                strcpy (key -> algorithm, algorithm);
        !            80:                strcat (key -> algorithm, add);
        !            81:        } else {
        !            82:                key -> algorithm = dmalloc (strlen (algorithm) + 1, MDL);
        !            83:                if (!key -> algorithm) {
        !            84:                        omapi_auth_key_dereference (&key, MDL);
        !            85:                        return ISC_R_NOMEMORY;
        !            86:                }
        !            87:                strcpy (key -> algorithm, algorithm);
        !            88:        }
        !            89: 
        !            90:        status = omapi_data_string_new (&key -> key, secret_len, MDL);
        !            91:        if (status != ISC_R_SUCCESS) {
        !            92:                omapi_auth_key_dereference (&key, MDL);
        !            93:                return status;
        !            94:        }
        !            95:        memcpy (key -> key -> value, secret, secret_len);
        !            96:        key -> key -> len = secret_len;
        !            97: 
        !            98:        *h = (dhcpctl_handle) key;
        !            99:        return ISC_R_SUCCESS;
        !           100: }
        !           101: 
        !           102: 
        !           103: /* dhcpctl_new_object
        !           104: 
        !           105:    synchronous - creates a local handle for a host entry.
        !           106:    returns nonzero status code if the local host entry couldn't
        !           107:    be created
        !           108:    stores handle to host through h if successful, and returns zero.
        !           109:    object_type is a pointer to a NUL-terminated string containing
        !           110:    the ascii name of the type of object being accessed - e.g., "host" */
        !           111: 
        !           112: dhcpctl_status dhcpctl_new_object (dhcpctl_handle *h,
        !           113:                                   dhcpctl_handle connection,
        !           114:                                   const char *object_type)
        !           115: {
        !           116:        dhcpctl_remote_object_t *m;
        !           117:        omapi_object_t *g;
        !           118:        isc_result_t status;
        !           119: 
        !           120:        m = (dhcpctl_remote_object_t *)0;
        !           121:        status = omapi_object_allocate((omapi_object_t **)&m,
        !           122:                                       dhcpctl_remote_type, 0, MDL);
        !           123:        if (status != ISC_R_SUCCESS)
        !           124:                return status;
        !           125: 
        !           126:        g = (omapi_object_t *)0;
        !           127:        status = omapi_generic_new (&g, MDL);
        !           128:        if (status != ISC_R_SUCCESS) {
        !           129:                dfree (m, MDL);
        !           130:                return status;
        !           131:        }
        !           132:        status = omapi_object_reference (&m -> inner, g, MDL);
        !           133:        if (status != ISC_R_SUCCESS) {
        !           134:                omapi_object_dereference ((omapi_object_t **)&m, MDL);
        !           135:                omapi_object_dereference (&g, MDL);
        !           136:                return status;
        !           137:        }
        !           138:        status = omapi_object_reference (&g -> outer,
        !           139:                                         (omapi_object_t *)m, MDL);
        !           140: 
        !           141:        if (status != ISC_R_SUCCESS) {
        !           142:                omapi_object_dereference ((omapi_object_t **)&m, MDL);
        !           143:                omapi_object_dereference (&g, MDL);
        !           144:                return status;
        !           145:        }
        !           146: 
        !           147:        status = omapi_typed_data_new (MDL, &m -> rtype,
        !           148:                                       omapi_datatype_string,
        !           149:                                       object_type);
        !           150:        if (status != ISC_R_SUCCESS) {
        !           151:                omapi_object_dereference ((omapi_object_t **)&m, MDL);
        !           152:                omapi_object_dereference (&g, MDL);
        !           153:                return status;
        !           154:        }
        !           155: 
        !           156:        status = omapi_object_reference (h, (omapi_object_t *)m, MDL);
        !           157:        omapi_object_dereference ((omapi_object_t **)&m, MDL);
        !           158:        omapi_object_dereference (&g, MDL);
        !           159:        if (status != ISC_R_SUCCESS)
        !           160:                return status;
        !           161: 
        !           162:        return status;
        !           163: }
        !           164: 
        !           165: /* asynchronous - just queues the request
        !           166:    returns nonzero status code if open couldn't be queued
        !           167:    returns zero if open was queued
        !           168:    h is a handle to an object created by dhcpctl_new_object
        !           169:    connection is a connection to a DHCP server
        !           170:    flags include:
        !           171:      DHCPCTL_CREATE - if the object doesn't exist, create it
        !           172:      DHCPCTL_UPDATE - update the object on the server using the
        !           173:                      attached parameters 
        !           174:      DHCPCTL_EXCL - error if the object exists and DHCPCTL_CREATE
        !           175:                      was also specified */
        !           176: 
        !           177: dhcpctl_status dhcpctl_open_object (dhcpctl_handle h,
        !           178:                                    dhcpctl_handle connection,
        !           179:                                    int flags)
        !           180: {
        !           181:        isc_result_t status;
        !           182:        omapi_object_t *message = (omapi_object_t *)0;
        !           183:        dhcpctl_remote_object_t *remote;
        !           184: 
        !           185:        if (h -> type != dhcpctl_remote_type)
        !           186:                return ISC_R_INVALIDARG;
        !           187:        remote = (dhcpctl_remote_object_t *)h;
        !           188: 
        !           189:        status = omapi_message_new (&message, MDL);
        !           190:        if (status != ISC_R_SUCCESS)
        !           191:                return status;
        !           192:        status = omapi_set_int_value (message, (omapi_object_t *)0,
        !           193:                                      "op", OMAPI_OP_OPEN);
        !           194:        if (status != ISC_R_SUCCESS) {
        !           195:                omapi_object_dereference (&message, MDL);
        !           196:                return status;
        !           197:        }
        !           198:        status = omapi_set_object_value (message, (omapi_object_t *)0,
        !           199:                                         "object", h);
        !           200:        if (status != ISC_R_SUCCESS) {
        !           201:                omapi_object_dereference (&message, MDL);
        !           202:                return status;
        !           203:        }
        !           204:        if (flags & DHCPCTL_CREATE) {
        !           205:                status = omapi_set_boolean_value (message, (omapi_object_t *)0,
        !           206:                                                  "create", 1);
        !           207:                if (status != ISC_R_SUCCESS) {
        !           208:                        omapi_object_dereference (&message, MDL);
        !           209:                        return status;
        !           210:                }
        !           211:        }
        !           212:        if (flags & DHCPCTL_UPDATE) {
        !           213:                status = omapi_set_boolean_value (message, (omapi_object_t *)0,
        !           214:                                                  "update", 1);
        !           215:                if (status != ISC_R_SUCCESS) {
        !           216:                        omapi_object_dereference (&message, MDL);
        !           217:                        return status;
        !           218:                }
        !           219:        }
        !           220:        if (flags & DHCPCTL_EXCL) {
        !           221:                status = omapi_set_boolean_value (message, (omapi_object_t *)0,
        !           222:                                                  "exclusive", 1);
        !           223:                if (status != ISC_R_SUCCESS) {
        !           224:                        omapi_object_dereference (&message, MDL);
        !           225:                        return status;
        !           226:                }
        !           227:        }
        !           228: 
        !           229:        if (remote -> rtype) {
        !           230:                status = omapi_set_value_str (message, (omapi_object_t *)0,
        !           231:                                              "type", remote -> rtype);
        !           232:                if (status != ISC_R_SUCCESS) {
        !           233:                        omapi_object_dereference (&message, MDL);
        !           234:                        return status;
        !           235:                }
        !           236:        }
        !           237: 
        !           238:        status = omapi_message_register (message);
        !           239:        if (status != ISC_R_SUCCESS) {
        !           240:                omapi_object_dereference (&message, MDL);
        !           241:                return status;
        !           242:        }
        !           243: 
        !           244:        status = omapi_protocol_send_message (connection -> outer,
        !           245:                                            (omapi_object_t *)0,
        !           246:                                            message, (omapi_object_t *)0);
        !           247: 
        !           248:        if (status != ISC_R_SUCCESS)
        !           249:                omapi_message_unregister (message);
        !           250: 
        !           251:        omapi_object_dereference (&message, MDL);
        !           252:        return status;
        !           253: }
        !           254: 
        !           255: /* Callback methods (not meant to be called directly) */
        !           256: 
        !           257: isc_result_t dhcpctl_remote_set_value (omapi_object_t *h,
        !           258:                                       omapi_object_t *id,
        !           259:                                       omapi_data_string_t *name,
        !           260:                                       omapi_typed_data_t *value)
        !           261: {
        !           262:        dhcpctl_remote_object_t *ro;
        !           263:        unsigned long rh;
        !           264:        isc_result_t status;
        !           265: 
        !           266:        if (h -> type != dhcpctl_remote_type)
        !           267:                return ISC_R_INVALIDARG;
        !           268:        ro = (dhcpctl_remote_object_t *)h;
        !           269: 
        !           270:        if (!omapi_ds_strcmp (name, "remote-handle")) {
        !           271:                status = omapi_get_int_value (&rh, value);
        !           272:                if (status == ISC_R_SUCCESS)
        !           273:                        ro -> remote_handle = rh;
        !           274:                return status;
        !           275:        }
        !           276: 
        !           277:        if (h -> inner && h -> inner -> type -> set_value)
        !           278:                return (*(h -> inner -> type -> set_value))
        !           279:                        (h -> inner, id, name, value);
        !           280:        return ISC_R_NOTFOUND;
        !           281: }
        !           282: 
        !           283: isc_result_t dhcpctl_remote_get_value (omapi_object_t *h,
        !           284:                                       omapi_object_t *id,
        !           285:                                       omapi_data_string_t *name,
        !           286:                                       omapi_value_t **value)
        !           287: {
        !           288:        if (h -> type != dhcpctl_remote_type)
        !           289:                return ISC_R_INVALIDARG;
        !           290:        
        !           291:        if (h -> inner && h -> inner -> type -> get_value)
        !           292:                return (*(h -> inner -> type -> get_value))
        !           293:                        (h -> inner, id, name, value);
        !           294:        return ISC_R_NOTFOUND;
        !           295: }
        !           296: 
        !           297: isc_result_t dhcpctl_remote_signal_handler (omapi_object_t *o,
        !           298:                                            const char *name, va_list ap)
        !           299: {
        !           300:        dhcpctl_remote_object_t *p;
        !           301:        omapi_typed_data_t *tv;
        !           302: 
        !           303:        if (o -> type != dhcpctl_remote_type)
        !           304:                return ISC_R_INVALIDARG;
        !           305:        p = (dhcpctl_remote_object_t *)o;
        !           306: 
        !           307:        if (!strcmp (name, "updated")) {
        !           308:                p -> waitstatus = ISC_R_SUCCESS;
        !           309:                if (o -> inner -> type == omapi_type_generic)
        !           310:                        omapi_generic_clear_flags (o -> inner);
        !           311:                return omapi_signal_in (o -> inner, "ready");
        !           312:        }
        !           313:        if (!strcmp (name, "status")) {
        !           314:                p -> waitstatus = va_arg (ap, isc_result_t);
        !           315:                if (p -> message)
        !           316:                        omapi_typed_data_dereference (&p -> message, MDL);
        !           317:                tv = va_arg (ap, omapi_typed_data_t *);
        !           318:                if (tv)
        !           319:                        omapi_typed_data_reference (&p -> message, tv, MDL);
        !           320:                return omapi_signal_in (o -> inner, "ready");
        !           321:        }
        !           322: 
        !           323:        if (p -> inner && p -> inner -> type -> signal_handler)
        !           324:                return (*(p -> inner -> type -> signal_handler))
        !           325:                        (p -> inner, name, ap);
        !           326: 
        !           327:        return ISC_R_SUCCESS;
        !           328: }
        !           329: 
        !           330: isc_result_t dhcpctl_remote_destroy (omapi_object_t *h,
        !           331:                                     const char *file, int line)
        !           332: {
        !           333:        dhcpctl_remote_object_t *p;
        !           334:        if (h -> type != dhcpctl_remote_type)
        !           335:                return ISC_R_INVALIDARG;
        !           336:        p = (dhcpctl_remote_object_t *)h;
        !           337:        if (p -> handle)
        !           338:                omapi_object_dereference ((omapi_object_t **)&p -> handle,
        !           339:                                          file, line);
        !           340:        if (p -> rtype)
        !           341:                omapi_typed_data_dereference ((omapi_typed_data_t **)&p->rtype,
        !           342:                                              file, line);
        !           343:        return ISC_R_SUCCESS;
        !           344: }
        !           345: 
        !           346: /* Write all the published values associated with the object through the
        !           347:    specified connection. */
        !           348: 
        !           349: isc_result_t dhcpctl_remote_stuff_values (omapi_object_t *c,
        !           350:                                          omapi_object_t *id,
        !           351:                                          omapi_object_t *p)
        !           352: {
        !           353:        if (p -> type != dhcpctl_remote_type)
        !           354:                return ISC_R_INVALIDARG;
        !           355: 
        !           356:        if (p -> inner && p -> inner -> type -> stuff_values)
        !           357:                return (*(p -> inner -> type -> stuff_values)) (c, id,
        !           358:                                                                p -> inner);
        !           359:        return ISC_R_SUCCESS;
        !           360: }
        !           361: 

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