xref: /minix3/external/bsd/dhcp/dist/omapip/isclib.c (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: isclib.c,v 1.2 2014/07/12 12:09:37 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /*
3*83ee113eSDavid van Moolenbroek  * Copyright(c) 2009-2010,2013-2014 by Internet Systems Consortium, Inc.("ISC")
4*83ee113eSDavid van Moolenbroek  *
5*83ee113eSDavid van Moolenbroek  * Permission to use, copy, modify, and distribute this software for any
6*83ee113eSDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
7*83ee113eSDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
8*83ee113eSDavid van Moolenbroek  *
9*83ee113eSDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
10*83ee113eSDavid van Moolenbroek  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*83ee113eSDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
12*83ee113eSDavid van Moolenbroek  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*83ee113eSDavid van Moolenbroek  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*83ee113eSDavid van Moolenbroek  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
15*83ee113eSDavid van Moolenbroek  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*83ee113eSDavid van Moolenbroek  *
17*83ee113eSDavid van Moolenbroek  *   Internet Systems Consortium, Inc.
18*83ee113eSDavid van Moolenbroek  *   950 Charter Street
19*83ee113eSDavid van Moolenbroek  *   Redwood City, CA 94063
20*83ee113eSDavid van Moolenbroek  *   <info@isc.org>
21*83ee113eSDavid van Moolenbroek  *   http://www.isc.org/
22*83ee113eSDavid van Moolenbroek  *
23*83ee113eSDavid van Moolenbroek  */
24*83ee113eSDavid van Moolenbroek 
25*83ee113eSDavid van Moolenbroek #include <sys/cdefs.h>
26*83ee113eSDavid van Moolenbroek __RCSID("$NetBSD: isclib.c,v 1.2 2014/07/12 12:09:37 spz Exp $");
27*83ee113eSDavid van Moolenbroek 
28*83ee113eSDavid van Moolenbroek /*Trying to figure out what we need to define to get things to work.
29*83ee113eSDavid van Moolenbroek   It looks like we want/need the export library but need the fdwatchcommand
30*83ee113eSDavid van Moolenbroek   which may be a problem */
31*83ee113eSDavid van Moolenbroek 
32*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
33*83ee113eSDavid van Moolenbroek 
34*83ee113eSDavid van Moolenbroek #include <sys/time.h>
35*83ee113eSDavid van Moolenbroek #include <signal.h>
36*83ee113eSDavid van Moolenbroek 
37*83ee113eSDavid van Moolenbroek dhcp_context_t dhcp_gbl_ctx;
38*83ee113eSDavid van Moolenbroek int shutdown_signal = 0;
39*83ee113eSDavid van Moolenbroek 
40*83ee113eSDavid van Moolenbroek #if defined (NSUPDATE)
41*83ee113eSDavid van Moolenbroek 
42*83ee113eSDavid van Moolenbroek /* This routine will open up the /etc/resolv.conf file and
43*83ee113eSDavid van Moolenbroek  * send any nameservers it finds to the DNS client code.
44*83ee113eSDavid van Moolenbroek  * It may be moved to be part of the dns client code instead
45*83ee113eSDavid van Moolenbroek  * of being in the DHCP code
46*83ee113eSDavid van Moolenbroek  */
47*83ee113eSDavid van Moolenbroek static isc_result_t
dhcp_dns_client_setservers(void)48*83ee113eSDavid van Moolenbroek dhcp_dns_client_setservers(void)
49*83ee113eSDavid van Moolenbroek {
50*83ee113eSDavid van Moolenbroek 	isc_result_t result;
51*83ee113eSDavid van Moolenbroek 	irs_resconf_t *resconf = NULL;
52*83ee113eSDavid van Moolenbroek 	isc_sockaddrlist_t *nameservers;
53*83ee113eSDavid van Moolenbroek 	isc_sockaddr_t *sa;
54*83ee113eSDavid van Moolenbroek 
55*83ee113eSDavid van Moolenbroek 	result = irs_resconf_load(dhcp_gbl_ctx.mctx, _PATH_RESOLV_CONF,
56*83ee113eSDavid van Moolenbroek 				  &resconf);
57*83ee113eSDavid van Moolenbroek 	if (result != ISC_R_SUCCESS && result != ISC_R_FILENOTFOUND) {
58*83ee113eSDavid van Moolenbroek 		log_error("irs_resconf_load failed: %d.", result);
59*83ee113eSDavid van Moolenbroek 		return (result);
60*83ee113eSDavid van Moolenbroek 	}
61*83ee113eSDavid van Moolenbroek 
62*83ee113eSDavid van Moolenbroek 	nameservers = irs_resconf_getnameservers(resconf);
63*83ee113eSDavid van Moolenbroek 
64*83ee113eSDavid van Moolenbroek 	/* Initialize port numbers */
65*83ee113eSDavid van Moolenbroek 	for (sa = ISC_LIST_HEAD(*nameservers);
66*83ee113eSDavid van Moolenbroek 	     sa != NULL;
67*83ee113eSDavid van Moolenbroek 	     sa = ISC_LIST_NEXT(sa, link)) {
68*83ee113eSDavid van Moolenbroek 		switch (sa->type.sa.sa_family) {
69*83ee113eSDavid van Moolenbroek 		case AF_INET:
70*83ee113eSDavid van Moolenbroek 			sa->type.sin.sin_port = htons(NS_DEFAULTPORT);
71*83ee113eSDavid van Moolenbroek 			break;
72*83ee113eSDavid van Moolenbroek 		case AF_INET6:
73*83ee113eSDavid van Moolenbroek 			sa->type.sin6.sin6_port = htons(NS_DEFAULTPORT);
74*83ee113eSDavid van Moolenbroek 			break;
75*83ee113eSDavid van Moolenbroek 		default:
76*83ee113eSDavid van Moolenbroek 			break;
77*83ee113eSDavid van Moolenbroek 		}
78*83ee113eSDavid van Moolenbroek 	}
79*83ee113eSDavid van Moolenbroek 
80*83ee113eSDavid van Moolenbroek 	result = dns_client_setservers(dhcp_gbl_ctx.dnsclient,
81*83ee113eSDavid van Moolenbroek 				       dns_rdataclass_in,
82*83ee113eSDavid van Moolenbroek 				       NULL, nameservers);
83*83ee113eSDavid van Moolenbroek 	if (result != ISC_R_SUCCESS) {
84*83ee113eSDavid van Moolenbroek 		log_error("dns_client_setservers failed: %d.",
85*83ee113eSDavid van Moolenbroek 			  result);
86*83ee113eSDavid van Moolenbroek 	}
87*83ee113eSDavid van Moolenbroek 	return (result);
88*83ee113eSDavid van Moolenbroek }
89*83ee113eSDavid van Moolenbroek #endif
90*83ee113eSDavid van Moolenbroek 
91*83ee113eSDavid van Moolenbroek void
isclib_cleanup(void)92*83ee113eSDavid van Moolenbroek isclib_cleanup(void)
93*83ee113eSDavid van Moolenbroek {
94*83ee113eSDavid van Moolenbroek #if defined (NSUPDATE)
95*83ee113eSDavid van Moolenbroek 	if (dhcp_gbl_ctx.dnsclient != NULL)
96*83ee113eSDavid van Moolenbroek 		dns_client_destroy((dns_client_t **)&dhcp_gbl_ctx.dnsclient);
97*83ee113eSDavid van Moolenbroek #endif
98*83ee113eSDavid van Moolenbroek 
99*83ee113eSDavid van Moolenbroek 	if (dhcp_gbl_ctx.task != NULL) {
100*83ee113eSDavid van Moolenbroek 		isc_task_shutdown(dhcp_gbl_ctx.task);
101*83ee113eSDavid van Moolenbroek 		isc_task_detach(&dhcp_gbl_ctx.task);
102*83ee113eSDavid van Moolenbroek 	}
103*83ee113eSDavid van Moolenbroek 
104*83ee113eSDavid van Moolenbroek 	if (dhcp_gbl_ctx.timermgr != NULL)
105*83ee113eSDavid van Moolenbroek 		isc_timermgr_destroy(&dhcp_gbl_ctx.timermgr);
106*83ee113eSDavid van Moolenbroek 
107*83ee113eSDavid van Moolenbroek 	if (dhcp_gbl_ctx.socketmgr != NULL)
108*83ee113eSDavid van Moolenbroek 		isc_socketmgr_destroy(&dhcp_gbl_ctx.socketmgr);
109*83ee113eSDavid van Moolenbroek 
110*83ee113eSDavid van Moolenbroek 	if (dhcp_gbl_ctx.taskmgr != NULL)
111*83ee113eSDavid van Moolenbroek 		isc_taskmgr_destroy(&dhcp_gbl_ctx.taskmgr);
112*83ee113eSDavid van Moolenbroek 
113*83ee113eSDavid van Moolenbroek 	if (dhcp_gbl_ctx.actx_started != ISC_FALSE) {
114*83ee113eSDavid van Moolenbroek 		isc_app_ctxfinish(dhcp_gbl_ctx.actx);
115*83ee113eSDavid van Moolenbroek 		dhcp_gbl_ctx.actx_started = ISC_FALSE;
116*83ee113eSDavid van Moolenbroek 	}
117*83ee113eSDavid van Moolenbroek 
118*83ee113eSDavid van Moolenbroek 	if (dhcp_gbl_ctx.actx != NULL)
119*83ee113eSDavid van Moolenbroek 		isc_appctx_destroy(&dhcp_gbl_ctx.actx);
120*83ee113eSDavid van Moolenbroek 
121*83ee113eSDavid van Moolenbroek 	if (dhcp_gbl_ctx.mctx != NULL)
122*83ee113eSDavid van Moolenbroek 		isc_mem_detach(&dhcp_gbl_ctx.mctx);
123*83ee113eSDavid van Moolenbroek 
124*83ee113eSDavid van Moolenbroek 	return;
125*83ee113eSDavid van Moolenbroek }
126*83ee113eSDavid van Moolenbroek 
127*83ee113eSDavid van Moolenbroek isc_result_t
dhcp_context_create(int flags,struct in_addr * local4,struct in6_addr * local6)128*83ee113eSDavid van Moolenbroek dhcp_context_create(int flags,
129*83ee113eSDavid van Moolenbroek 		    struct in_addr  *local4,
130*83ee113eSDavid van Moolenbroek 		    struct in6_addr *local6) {
131*83ee113eSDavid van Moolenbroek 	isc_result_t result;
132*83ee113eSDavid van Moolenbroek 
133*83ee113eSDavid van Moolenbroek 	if ((flags & DHCP_CONTEXT_PRE_DB) != 0) {
134*83ee113eSDavid van Moolenbroek 		/*
135*83ee113eSDavid van Moolenbroek 		 * Set up the error messages, this isn't the right place
136*83ee113eSDavid van Moolenbroek 		 * for this call but it is convienent for now.
137*83ee113eSDavid van Moolenbroek 		 */
138*83ee113eSDavid van Moolenbroek 		result = dhcp_result_register();
139*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS) {
140*83ee113eSDavid van Moolenbroek 			log_fatal("register_table() %s: %u", "failed", result);
141*83ee113eSDavid van Moolenbroek 		}
142*83ee113eSDavid van Moolenbroek 
143*83ee113eSDavid van Moolenbroek 		memset(&dhcp_gbl_ctx, 0, sizeof (dhcp_gbl_ctx));
144*83ee113eSDavid van Moolenbroek 
145*83ee113eSDavid van Moolenbroek 		isc_lib_register();
146*83ee113eSDavid van Moolenbroek 
147*83ee113eSDavid van Moolenbroek 		/* get the current time for use as the random seed */
148*83ee113eSDavid van Moolenbroek 		gettimeofday(&cur_tv, (struct timezone *)0);
149*83ee113eSDavid van Moolenbroek 		isc_random_seed(cur_tv.tv_sec);
150*83ee113eSDavid van Moolenbroek 
151*83ee113eSDavid van Moolenbroek #if defined (NSUPDATE)
152*83ee113eSDavid van Moolenbroek 		result = dns_lib_init();
153*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
154*83ee113eSDavid van Moolenbroek 			goto cleanup;
155*83ee113eSDavid van Moolenbroek #else
156*83ee113eSDavid van Moolenbroek 		/* The dst library is inited as part of dns_lib_init, we don't
157*83ee113eSDavid van Moolenbroek 		 * need it if NSUPDATE is enabled */
158*83ee113eSDavid van Moolenbroek 		result = dst_lib_init(dhcp_gbl_ctx.mctx, NULL, 0);
159*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
160*83ee113eSDavid van Moolenbroek 			goto cleanup;
161*83ee113eSDavid van Moolenbroek 
162*83ee113eSDavid van Moolenbroek #endif
163*83ee113eSDavid van Moolenbroek 		result = isc_mem_create(0, 0, &dhcp_gbl_ctx.mctx);
164*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
165*83ee113eSDavid van Moolenbroek 			goto cleanup;
166*83ee113eSDavid van Moolenbroek 
167*83ee113eSDavid van Moolenbroek 		result = isc_appctx_create(dhcp_gbl_ctx.mctx,
168*83ee113eSDavid van Moolenbroek 					   &dhcp_gbl_ctx.actx);
169*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
170*83ee113eSDavid van Moolenbroek 			goto cleanup;
171*83ee113eSDavid van Moolenbroek 
172*83ee113eSDavid van Moolenbroek 		result = isc_app_ctxstart(dhcp_gbl_ctx.actx);
173*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
174*83ee113eSDavid van Moolenbroek 			return (result);
175*83ee113eSDavid van Moolenbroek 		dhcp_gbl_ctx.actx_started = ISC_TRUE;
176*83ee113eSDavid van Moolenbroek 
177*83ee113eSDavid van Moolenbroek 		result = isc_taskmgr_createinctx(dhcp_gbl_ctx.mctx,
178*83ee113eSDavid van Moolenbroek 						 dhcp_gbl_ctx.actx,
179*83ee113eSDavid van Moolenbroek 						 1, 0,
180*83ee113eSDavid van Moolenbroek 						 &dhcp_gbl_ctx.taskmgr);
181*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
182*83ee113eSDavid van Moolenbroek 			goto cleanup;
183*83ee113eSDavid van Moolenbroek 
184*83ee113eSDavid van Moolenbroek 		result = isc_socketmgr_createinctx(dhcp_gbl_ctx.mctx,
185*83ee113eSDavid van Moolenbroek 						   dhcp_gbl_ctx.actx,
186*83ee113eSDavid van Moolenbroek 						   &dhcp_gbl_ctx.socketmgr);
187*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
188*83ee113eSDavid van Moolenbroek 			goto cleanup;
189*83ee113eSDavid van Moolenbroek 
190*83ee113eSDavid van Moolenbroek 		result = isc_timermgr_createinctx(dhcp_gbl_ctx.mctx,
191*83ee113eSDavid van Moolenbroek 						  dhcp_gbl_ctx.actx,
192*83ee113eSDavid van Moolenbroek 						  &dhcp_gbl_ctx.timermgr);
193*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
194*83ee113eSDavid van Moolenbroek 			goto cleanup;
195*83ee113eSDavid van Moolenbroek 
196*83ee113eSDavid van Moolenbroek 		result = isc_task_create(dhcp_gbl_ctx.taskmgr, 0, &dhcp_gbl_ctx.task);
197*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
198*83ee113eSDavid van Moolenbroek 			goto cleanup;
199*83ee113eSDavid van Moolenbroek 	}
200*83ee113eSDavid van Moolenbroek 
201*83ee113eSDavid van Moolenbroek #if defined (NSUPDATE)
202*83ee113eSDavid van Moolenbroek 	if ((flags & DHCP_CONTEXT_POST_DB) != 0) {
203*83ee113eSDavid van Moolenbroek 		isc_sockaddr_t localaddr4, *localaddr4_ptr = NULL;
204*83ee113eSDavid van Moolenbroek 		isc_sockaddr_t localaddr6, *localaddr6_ptr = NULL;
205*83ee113eSDavid van Moolenbroek 		if (local4 != NULL) {
206*83ee113eSDavid van Moolenbroek 			isc_sockaddr_fromin(&localaddr4, local4, 0);
207*83ee113eSDavid van Moolenbroek 			localaddr4_ptr = &localaddr4;
208*83ee113eSDavid van Moolenbroek 		}
209*83ee113eSDavid van Moolenbroek 		if (local6 != NULL) {
210*83ee113eSDavid van Moolenbroek 			isc_sockaddr_fromin6(&localaddr6, local6, 0);
211*83ee113eSDavid van Moolenbroek 			localaddr6_ptr = &localaddr6;
212*83ee113eSDavid van Moolenbroek 		}
213*83ee113eSDavid van Moolenbroek 
214*83ee113eSDavid van Moolenbroek 		result = dns_client_createx2(dhcp_gbl_ctx.mctx,
215*83ee113eSDavid van Moolenbroek 					     dhcp_gbl_ctx.actx,
216*83ee113eSDavid van Moolenbroek 					     dhcp_gbl_ctx.taskmgr,
217*83ee113eSDavid van Moolenbroek 					     dhcp_gbl_ctx.socketmgr,
218*83ee113eSDavid van Moolenbroek 					     dhcp_gbl_ctx.timermgr,
219*83ee113eSDavid van Moolenbroek 					     0,
220*83ee113eSDavid van Moolenbroek 					     &dhcp_gbl_ctx.dnsclient,
221*83ee113eSDavid van Moolenbroek 					     localaddr4_ptr,
222*83ee113eSDavid van Moolenbroek 					     localaddr6_ptr);
223*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
224*83ee113eSDavid van Moolenbroek 			goto cleanup;
225*83ee113eSDavid van Moolenbroek 
226*83ee113eSDavid van Moolenbroek 		result = dhcp_dns_client_setservers();
227*83ee113eSDavid van Moolenbroek 		if (result != ISC_R_SUCCESS)
228*83ee113eSDavid van Moolenbroek 			goto cleanup;
229*83ee113eSDavid van Moolenbroek 	}
230*83ee113eSDavid van Moolenbroek #endif
231*83ee113eSDavid van Moolenbroek 
232*83ee113eSDavid van Moolenbroek 	return(ISC_R_SUCCESS);
233*83ee113eSDavid van Moolenbroek 
234*83ee113eSDavid van Moolenbroek  cleanup:
235*83ee113eSDavid van Moolenbroek 	/*
236*83ee113eSDavid van Moolenbroek 	 * Currently we don't try and cleanup, just return an error
237*83ee113eSDavid van Moolenbroek 	 * expecting that our caller will log the error and exit.
238*83ee113eSDavid van Moolenbroek 	 */
239*83ee113eSDavid van Moolenbroek 
240*83ee113eSDavid van Moolenbroek 	return(result);
241*83ee113eSDavid van Moolenbroek }
242*83ee113eSDavid van Moolenbroek 
243*83ee113eSDavid van Moolenbroek /*
244*83ee113eSDavid van Moolenbroek  * Convert a string name into the proper structure for the isc routines
245*83ee113eSDavid van Moolenbroek  *
246*83ee113eSDavid van Moolenbroek  * Previously we allowed names without a trailing '.' however the current
247*83ee113eSDavid van Moolenbroek  * dns and dst code requires the names to end in a period.  If the
248*83ee113eSDavid van Moolenbroek  * name doesn't have a trailing period add one as part of creating
249*83ee113eSDavid van Moolenbroek  * the dns name.
250*83ee113eSDavid van Moolenbroek  */
251*83ee113eSDavid van Moolenbroek 
252*83ee113eSDavid van Moolenbroek isc_result_t
dhcp_isc_name(unsigned char * namestr,dns_fixedname_t * namefix,dns_name_t ** name)253*83ee113eSDavid van Moolenbroek dhcp_isc_name(unsigned char   *namestr,
254*83ee113eSDavid van Moolenbroek 	      dns_fixedname_t *namefix,
255*83ee113eSDavid van Moolenbroek 	      dns_name_t     **name)
256*83ee113eSDavid van Moolenbroek {
257*83ee113eSDavid van Moolenbroek 	size_t namelen;
258*83ee113eSDavid van Moolenbroek 	isc_buffer_t b;
259*83ee113eSDavid van Moolenbroek 	isc_result_t result;
260*83ee113eSDavid van Moolenbroek 
261*83ee113eSDavid van Moolenbroek 	namelen = strlen((char *)namestr);
262*83ee113eSDavid van Moolenbroek 	isc_buffer_init(&b, namestr, namelen);
263*83ee113eSDavid van Moolenbroek 	isc_buffer_add(&b, namelen);
264*83ee113eSDavid van Moolenbroek 	dns_fixedname_init(namefix);
265*83ee113eSDavid van Moolenbroek 	*name = dns_fixedname_name(namefix);
266*83ee113eSDavid van Moolenbroek 	result = dns_name_fromtext(*name, &b, dns_rootname, 0, NULL);
267*83ee113eSDavid van Moolenbroek 	isc_buffer_invalidate(&b);
268*83ee113eSDavid van Moolenbroek 	return(result);
269*83ee113eSDavid van Moolenbroek }
270*83ee113eSDavid van Moolenbroek 
271*83ee113eSDavid van Moolenbroek isc_result_t
isclib_make_dst_key(char * inname,char * algorithm,unsigned char * secret,int length,dst_key_t ** dstkey)272*83ee113eSDavid van Moolenbroek isclib_make_dst_key(char          *inname,
273*83ee113eSDavid van Moolenbroek 		    char          *algorithm,
274*83ee113eSDavid van Moolenbroek 		    unsigned char *secret,
275*83ee113eSDavid van Moolenbroek 		    int            length,
276*83ee113eSDavid van Moolenbroek 		    dst_key_t    **dstkey)
277*83ee113eSDavid van Moolenbroek {
278*83ee113eSDavid van Moolenbroek 	isc_result_t result;
279*83ee113eSDavid van Moolenbroek 	dns_name_t *name;
280*83ee113eSDavid van Moolenbroek 	dns_fixedname_t name0;
281*83ee113eSDavid van Moolenbroek 	isc_buffer_t b;
282*83ee113eSDavid van Moolenbroek 
283*83ee113eSDavid van Moolenbroek 	isc_buffer_init(&b, secret, length);
284*83ee113eSDavid van Moolenbroek 	isc_buffer_add(&b, length);
285*83ee113eSDavid van Moolenbroek 
286*83ee113eSDavid van Moolenbroek 	/* We only support HMAC_MD5 currently */
287*83ee113eSDavid van Moolenbroek 	if (strcasecmp(algorithm, DHCP_HMAC_MD5_NAME) != 0) {
288*83ee113eSDavid van Moolenbroek 		return(DHCP_R_INVALIDARG);
289*83ee113eSDavid van Moolenbroek 	}
290*83ee113eSDavid van Moolenbroek 
291*83ee113eSDavid van Moolenbroek 	result = dhcp_isc_name((unsigned char *)inname, &name0, &name);
292*83ee113eSDavid van Moolenbroek 	if (result != ISC_R_SUCCESS) {
293*83ee113eSDavid van Moolenbroek 		return(result);
294*83ee113eSDavid van Moolenbroek 	}
295*83ee113eSDavid van Moolenbroek 
296*83ee113eSDavid van Moolenbroek 	return(dst_key_frombuffer(name, DST_ALG_HMACMD5, DNS_KEYOWNER_ENTITY,
297*83ee113eSDavid van Moolenbroek 				  DNS_KEYPROTO_DNSSEC, dns_rdataclass_in,
298*83ee113eSDavid van Moolenbroek 				  &b, dhcp_gbl_ctx.mctx, dstkey));
299*83ee113eSDavid van Moolenbroek }
300*83ee113eSDavid van Moolenbroek 
301*83ee113eSDavid van Moolenbroek /**
302*83ee113eSDavid van Moolenbroek  * signal handler that initiates server shutdown
303*83ee113eSDavid van Moolenbroek  *
304*83ee113eSDavid van Moolenbroek  * @param signal signal code that we received
305*83ee113eSDavid van Moolenbroek  */
dhcp_signal_handler(int signal)306*83ee113eSDavid van Moolenbroek void dhcp_signal_handler(int signal) {
307*83ee113eSDavid van Moolenbroek 	isc_appctx_t *ctx = dhcp_gbl_ctx.actx;
308*83ee113eSDavid van Moolenbroek 	int prev = shutdown_signal;
309*83ee113eSDavid van Moolenbroek 
310*83ee113eSDavid van Moolenbroek 	if (prev != 0) {
311*83ee113eSDavid van Moolenbroek 		/* Already in shutdown. */
312*83ee113eSDavid van Moolenbroek 		return;
313*83ee113eSDavid van Moolenbroek 	}
314*83ee113eSDavid van Moolenbroek 	/* Possible race but does it matter? */
315*83ee113eSDavid van Moolenbroek 	shutdown_signal = signal;
316*83ee113eSDavid van Moolenbroek 
317*83ee113eSDavid van Moolenbroek 	/* Use reload (aka suspend) for easier dispatch() reenter. */
318*83ee113eSDavid van Moolenbroek 	if (ctx && ctx->methods && ctx->methods->ctxsuspend) {
319*83ee113eSDavid van Moolenbroek 		(void) isc_app_ctxsuspend(ctx);
320*83ee113eSDavid van Moolenbroek 	}
321*83ee113eSDavid van Moolenbroek }
322