Annotation of embedaddon/dhcp/dhcpctl/remote.c, revision 1.1.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>