xref: /minix3/external/bsd/dhcp/dist/dhcpctl/callback.c (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: callback.c,v 1.1.1.2 2014/07/12 11:57:51 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /* callback.c
3*83ee113eSDavid van Moolenbroek 
4*83ee113eSDavid van Moolenbroek    The dhcpctl callback object. */
5*83ee113eSDavid van Moolenbroek 
6*83ee113eSDavid van Moolenbroek /*
7*83ee113eSDavid van Moolenbroek  * Copyright (c) 2004,2007,2009,2014 by Internet Systems Consortium, Inc. ("ISC")
8*83ee113eSDavid van Moolenbroek  * Copyright (c) 1999-2003 by Internet Software Consortium
9*83ee113eSDavid van Moolenbroek  *
10*83ee113eSDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
11*83ee113eSDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
12*83ee113eSDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
13*83ee113eSDavid van Moolenbroek  *
14*83ee113eSDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
15*83ee113eSDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16*83ee113eSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
17*83ee113eSDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18*83ee113eSDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19*83ee113eSDavid van Moolenbroek  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
20*83ee113eSDavid van Moolenbroek  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21*83ee113eSDavid van Moolenbroek  *
22*83ee113eSDavid van Moolenbroek  *   Internet Systems Consortium, Inc.
23*83ee113eSDavid van Moolenbroek  *   950 Charter Street
24*83ee113eSDavid van Moolenbroek  *   Redwood City, CA 94063
25*83ee113eSDavid van Moolenbroek  *   <info@isc.org>
26*83ee113eSDavid van Moolenbroek  *   https://www.isc.org/
27*83ee113eSDavid van Moolenbroek  *
28*83ee113eSDavid van Moolenbroek  */
29*83ee113eSDavid van Moolenbroek 
30*83ee113eSDavid van Moolenbroek #include <sys/cdefs.h>
31*83ee113eSDavid van Moolenbroek __RCSID("$NetBSD: callback.c,v 1.1.1.2 2014/07/12 11:57:51 spz Exp $");
32*83ee113eSDavid van Moolenbroek 
33*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
34*83ee113eSDavid van Moolenbroek #include <omapip/omapip_p.h>
35*83ee113eSDavid van Moolenbroek #include "dhcpctl.h"
36*83ee113eSDavid van Moolenbroek 
37*83ee113eSDavid van Moolenbroek /* dhcpctl_set_callback
38*83ee113eSDavid van Moolenbroek 
39*83ee113eSDavid van Moolenbroek    synchronous, with asynchronous aftereffect
40*83ee113eSDavid van Moolenbroek    handle is some object upon which some kind of process has been
41*83ee113eSDavid van Moolenbroek    started - e.g., an open, an update or a refresh.
42*83ee113eSDavid van Moolenbroek    data is an anonymous pointer containing some information that
43*83ee113eSDavid van Moolenbroek    the callback will use to figure out what event completed.
44*83ee113eSDavid van Moolenbroek    return value of 0 means callback was successfully set, a nonzero
45*83ee113eSDavid van Moolenbroek    status code is returned otherwise.
46*83ee113eSDavid van Moolenbroek    Upon completion of whatever task is in process, the callback
47*83ee113eSDavid van Moolenbroek    will be passed the handle to the object, a status code
48*83ee113eSDavid van Moolenbroek    indicating what happened, and the anonymous pointer passed to  */
49*83ee113eSDavid van Moolenbroek 
dhcpctl_set_callback(dhcpctl_handle h,void * data,void (* func)(dhcpctl_handle,dhcpctl_status,void *))50*83ee113eSDavid van Moolenbroek dhcpctl_status dhcpctl_set_callback (dhcpctl_handle h, void *data,
51*83ee113eSDavid van Moolenbroek 				     void (*func) (dhcpctl_handle,
52*83ee113eSDavid van Moolenbroek 						   dhcpctl_status, void *))
53*83ee113eSDavid van Moolenbroek {
54*83ee113eSDavid van Moolenbroek 	dhcpctl_callback_object_t *callback;
55*83ee113eSDavid van Moolenbroek 	omapi_object_t *inner;
56*83ee113eSDavid van Moolenbroek 
57*83ee113eSDavid van Moolenbroek 	callback = dmalloc (sizeof *callback, MDL);
58*83ee113eSDavid van Moolenbroek 	if (!callback)
59*83ee113eSDavid van Moolenbroek 		return ISC_R_NOMEMORY;
60*83ee113eSDavid van Moolenbroek 
61*83ee113eSDavid van Moolenbroek 	/* Tie the callback object to the innermost object in the chain. */
62*83ee113eSDavid van Moolenbroek 	for (inner = h; inner -> inner; inner = inner -> inner)
63*83ee113eSDavid van Moolenbroek 		;
64*83ee113eSDavid van Moolenbroek 	omapi_object_reference (&inner -> inner,
65*83ee113eSDavid van Moolenbroek 				(omapi_object_t *)callback, MDL);
66*83ee113eSDavid van Moolenbroek 	omapi_object_reference ((omapi_object_t **)&callback -> outer,
67*83ee113eSDavid van Moolenbroek 				inner, MDL);
68*83ee113eSDavid van Moolenbroek 
69*83ee113eSDavid van Moolenbroek 	/* Save the actual handle pointer we were passed for the callback. */
70*83ee113eSDavid van Moolenbroek 	omapi_object_reference (&callback -> object, h, MDL);
71*83ee113eSDavid van Moolenbroek 	callback -> data = data;
72*83ee113eSDavid van Moolenbroek 	callback -> callback = func;
73*83ee113eSDavid van Moolenbroek 
74*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
75*83ee113eSDavid van Moolenbroek }
76*83ee113eSDavid van Moolenbroek 
77*83ee113eSDavid van Moolenbroek /* Callback methods (not meant to be called directly) */
78*83ee113eSDavid van Moolenbroek 
dhcpctl_callback_set_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_typed_data_t * value)79*83ee113eSDavid van Moolenbroek isc_result_t dhcpctl_callback_set_value (omapi_object_t *h,
80*83ee113eSDavid van Moolenbroek 					 omapi_object_t *id,
81*83ee113eSDavid van Moolenbroek 					 omapi_data_string_t *name,
82*83ee113eSDavid van Moolenbroek 					 omapi_typed_data_t *value)
83*83ee113eSDavid van Moolenbroek {
84*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcpctl_callback_type)
85*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
86*83ee113eSDavid van Moolenbroek 
87*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> set_value)
88*83ee113eSDavid van Moolenbroek 		return (*(h -> inner -> type -> set_value))
89*83ee113eSDavid van Moolenbroek 			(h -> inner, id, name, value);
90*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
91*83ee113eSDavid van Moolenbroek }
92*83ee113eSDavid van Moolenbroek 
dhcpctl_callback_get_value(omapi_object_t * h,omapi_object_t * id,omapi_data_string_t * name,omapi_value_t ** value)93*83ee113eSDavid van Moolenbroek isc_result_t dhcpctl_callback_get_value (omapi_object_t *h,
94*83ee113eSDavid van Moolenbroek 					 omapi_object_t *id,
95*83ee113eSDavid van Moolenbroek 					 omapi_data_string_t *name,
96*83ee113eSDavid van Moolenbroek 					 omapi_value_t **value)
97*83ee113eSDavid van Moolenbroek {
98*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcpctl_callback_type)
99*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
100*83ee113eSDavid van Moolenbroek 
101*83ee113eSDavid van Moolenbroek 	if (h -> inner && h -> inner -> type -> get_value)
102*83ee113eSDavid van Moolenbroek 		return (*(h -> inner -> type -> get_value))
103*83ee113eSDavid van Moolenbroek 			(h -> inner, id, name, value);
104*83ee113eSDavid van Moolenbroek 	return ISC_R_NOTFOUND;
105*83ee113eSDavid van Moolenbroek }
106*83ee113eSDavid van Moolenbroek 
dhcpctl_callback_signal_handler(omapi_object_t * o,const char * name,va_list ap)107*83ee113eSDavid van Moolenbroek isc_result_t dhcpctl_callback_signal_handler (omapi_object_t *o,
108*83ee113eSDavid van Moolenbroek 					      const char *name, va_list ap)
109*83ee113eSDavid van Moolenbroek {
110*83ee113eSDavid van Moolenbroek 	dhcpctl_callback_object_t *p;
111*83ee113eSDavid van Moolenbroek 	isc_result_t waitstatus;
112*83ee113eSDavid van Moolenbroek 
113*83ee113eSDavid van Moolenbroek 	if (o -> type != dhcpctl_callback_type)
114*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
115*83ee113eSDavid van Moolenbroek 	p = (dhcpctl_callback_object_t *)o;
116*83ee113eSDavid van Moolenbroek 
117*83ee113eSDavid van Moolenbroek 	/* Not a signal we recognize? */
118*83ee113eSDavid van Moolenbroek 	if (strcmp (name, "ready")) {
119*83ee113eSDavid van Moolenbroek 		if (p -> inner && p -> inner -> type -> signal_handler)
120*83ee113eSDavid van Moolenbroek 			return (*(p -> inner -> type -> signal_handler))
121*83ee113eSDavid van Moolenbroek 				(p -> inner, name, ap);
122*83ee113eSDavid van Moolenbroek 		return ISC_R_NOTFOUND;
123*83ee113eSDavid van Moolenbroek 	}
124*83ee113eSDavid van Moolenbroek 
125*83ee113eSDavid van Moolenbroek 	if (p -> object -> type == dhcpctl_remote_type) {
126*83ee113eSDavid van Moolenbroek 		waitstatus = (((dhcpctl_remote_object_t *)
127*83ee113eSDavid van Moolenbroek 			       (p -> object)) -> waitstatus);
128*83ee113eSDavid van Moolenbroek 	} else
129*83ee113eSDavid van Moolenbroek 		waitstatus = ISC_R_SUCCESS;
130*83ee113eSDavid van Moolenbroek 
131*83ee113eSDavid van Moolenbroek 	/* Do the callback. */
132*83ee113eSDavid van Moolenbroek 	if (p -> callback)
133*83ee113eSDavid van Moolenbroek 		(*(p -> callback)) (p -> object, waitstatus, p -> data);
134*83ee113eSDavid van Moolenbroek 
135*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
136*83ee113eSDavid van Moolenbroek }
137*83ee113eSDavid van Moolenbroek 
dhcpctl_callback_destroy(omapi_object_t * h,const char * file,int line)138*83ee113eSDavid van Moolenbroek isc_result_t dhcpctl_callback_destroy (omapi_object_t *h,
139*83ee113eSDavid van Moolenbroek 				       const char *file, int line)
140*83ee113eSDavid van Moolenbroek {
141*83ee113eSDavid van Moolenbroek 	dhcpctl_callback_object_t *p;
142*83ee113eSDavid van Moolenbroek 	if (h -> type != dhcpctl_callback_type)
143*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
144*83ee113eSDavid van Moolenbroek 	p = (dhcpctl_callback_object_t *)h;
145*83ee113eSDavid van Moolenbroek 	if (p -> handle)
146*83ee113eSDavid van Moolenbroek 		omapi_object_dereference ((omapi_object_t **)&p -> handle,
147*83ee113eSDavid van Moolenbroek 					  file, line);
148*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
149*83ee113eSDavid van Moolenbroek }
150*83ee113eSDavid van Moolenbroek 
151*83ee113eSDavid van Moolenbroek /* Write all the published values associated with the object through the
152*83ee113eSDavid van Moolenbroek    specified connection. */
153*83ee113eSDavid van Moolenbroek 
dhcpctl_callback_stuff_values(omapi_object_t * c,omapi_object_t * id,omapi_object_t * p)154*83ee113eSDavid van Moolenbroek isc_result_t dhcpctl_callback_stuff_values (omapi_object_t *c,
155*83ee113eSDavid van Moolenbroek 					    omapi_object_t *id,
156*83ee113eSDavid van Moolenbroek 					    omapi_object_t *p)
157*83ee113eSDavid van Moolenbroek {
158*83ee113eSDavid van Moolenbroek 	if (p -> type != dhcpctl_callback_type)
159*83ee113eSDavid van Moolenbroek 		return DHCP_R_INVALIDARG;
160*83ee113eSDavid van Moolenbroek 
161*83ee113eSDavid van Moolenbroek 	if (p -> inner && p -> inner -> type -> stuff_values)
162*83ee113eSDavid van Moolenbroek 		return (*(p -> inner -> type -> stuff_values)) (c, id,
163*83ee113eSDavid van Moolenbroek 								p -> inner);
164*83ee113eSDavid van Moolenbroek 	return ISC_R_SUCCESS;
165*83ee113eSDavid van Moolenbroek }
166*83ee113eSDavid van Moolenbroek 
167