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>