File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / dhcpctl / remote.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:06:54 2012 UTC (12 years ago) by misho
Branches: dhcp, MAIN
CVS tags: v4_1_R7p0, v4_1_R7, v4_1_R4, HEAD
dhcp 4.1 r7

    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>