36 #if defined (NSUPDATE) 44 dhcp_dns_client_setservers(
void)
47 irs_resconf_t *resconf = NULL;
48 isc_sockaddrlist_t *nameservers;
53 if (result != ISC_R_SUCCESS && result != ISC_R_FILENOTFOUND) {
54 log_error(
"irs_resconf_load failed: %d.", result);
58 nameservers = irs_resconf_getnameservers(resconf);
61 for (sa = ISC_LIST_HEAD(*nameservers);
63 sa = ISC_LIST_NEXT(sa, link)) {
64 switch (sa->type.sa.sa_family) {
76 result = dns_client_setservers(dhcp_gbl_ctx.dnsclient,
79 if (result != ISC_R_SUCCESS) {
80 log_error(
"dns_client_setservers failed: %d.",
90 #if defined (NSUPDATE) 91 if (dhcp_gbl_ctx.dnsclient != NULL)
92 dns_client_destroy((dns_client_t **)&dhcp_gbl_ctx.dnsclient);
95 if (dhcp_gbl_ctx.
task != NULL) {
96 isc_task_shutdown(dhcp_gbl_ctx.
task);
97 isc_task_detach(&dhcp_gbl_ctx.
task);
101 isc_timermgr_destroy(&dhcp_gbl_ctx.
timermgr);
104 isc_socketmgr_destroy(&dhcp_gbl_ctx.
socketmgr);
106 if (dhcp_gbl_ctx.
taskmgr != NULL)
107 isc_taskmgr_destroy(&dhcp_gbl_ctx.
taskmgr);
110 isc_app_ctxfinish(dhcp_gbl_ctx.
actx);
114 if (dhcp_gbl_ctx.
actx != NULL)
115 isc_appctx_destroy(&dhcp_gbl_ctx.
actx);
117 if (dhcp_gbl_ctx.
mctx != NULL)
118 isc_mem_detach(&dhcp_gbl_ctx.
mctx);
125 handle_signal(
int sig,
void (*handler)(
int)) {
128 memset(&sa, 0,
sizeof(sa));
129 sa.sa_handler = handler;
130 sigfillset(&sa.sa_mask);
131 if (sigaction(sig, &sa, NULL) != 0) {
132 log_debug(
"handle_signal() failed for signal %d error: %s",
133 sig, strerror(errno));
139 struct in_addr *local4,
140 struct in6_addr *local6) {
149 if (result != ISC_R_SUCCESS) {
150 log_fatal(
"register_table() %s: %u",
"failed", result);
153 memset(&dhcp_gbl_ctx, 0,
sizeof (dhcp_gbl_ctx));
158 gettimeofday(&
cur_tv, (
struct timezone *)0);
159 isc_random_seed(
cur_tv.tv_sec);
165 result = isc_mem_create(0, 0, &dhcp_gbl_ctx.
mctx);
166 if (result != ISC_R_SUCCESS)
170 #if defined (NSUPDATE) 171 result = dns_lib_init();
172 if (result != ISC_R_SUCCESS)
177 result = dst_lib_init(dhcp_gbl_ctx.
mctx, NULL, 0);
178 if (result != ISC_R_SUCCESS)
183 result = isc_appctx_create(dhcp_gbl_ctx.
mctx,
185 if (result != ISC_R_SUCCESS)
188 result = isc_app_ctxstart(dhcp_gbl_ctx.
actx);
189 if (result != ISC_R_SUCCESS)
196 handle_signal(SIGPIPE, SIG_IGN);
198 result = isc_taskmgr_createinctx(dhcp_gbl_ctx.
mctx,
202 if (result != ISC_R_SUCCESS)
205 result = isc_socketmgr_createinctx(dhcp_gbl_ctx.
mctx,
208 if (result != ISC_R_SUCCESS)
211 result = isc_timermgr_createinctx(dhcp_gbl_ctx.
mctx,
214 if (result != ISC_R_SUCCESS)
217 result = isc_task_create(dhcp_gbl_ctx.
taskmgr, 0, &dhcp_gbl_ctx.
task);
218 if (result != ISC_R_SUCCESS)
222 #if defined (NSUPDATE) 228 if (local4 != NULL) {
229 dhcp_gbl_ctx.use_local4 = 1;
230 isc_sockaddr_fromin(&dhcp_gbl_ctx.local4_sockaddr,
234 if (local6 != NULL) {
235 dhcp_gbl_ctx.use_local6 = 1;
236 isc_sockaddr_fromin6(&dhcp_gbl_ctx.local6_sockaddr,
246 return(ISC_R_SUCCESS);
268 dns_fixedname_t *namefix,
275 namelen = strlen((
char *)namestr);
276 isc_buffer_init(&b, namestr, namelen);
277 isc_buffer_add(&b, namelen);
278 dns_fixedname_init(namefix);
279 *name = dns_fixedname_name(namefix);
280 result = dns_name_fromtext(*name, &b, dns_rootname, 0, NULL);
281 isc_buffer_invalidate(&b);
288 unsigned char *secret,
294 dns_fixedname_t name0;
296 unsigned int algorithm_code;
298 isc_buffer_init(&b, secret, length);
299 isc_buffer_add(&b, length);
302 algorithm_code = DST_ALG_HMACMD5;
304 algorithm_code = DST_ALG_HMACSHA1;
306 algorithm_code = DST_ALG_HMACSHA224;
308 algorithm_code = DST_ALG_HMACSHA256;
310 algorithm_code = DST_ALG_HMACSHA384;
312 algorithm_code = DST_ALG_HMACSHA512;
317 result =
dhcp_isc_name((
unsigned char *)inname, &name0, &name);
318 if (result != ISC_R_SUCCESS) {
322 return(dst_key_frombuffer(name, algorithm_code, DNS_KEYOWNER_ENTITY,
323 DNS_KEYPROTO_DNSSEC, dns_rdataclass_in,
324 &b, dhcp_gbl_ctx.
mctx, dstkey));
333 isc_appctx_t *ctx = dhcp_gbl_ctx.
actx;
344 if (ctx && ctx->methods && ctx->methods->ctxsuspend) {
345 (void) isc_app_ctxsuspend(ctx);
351 if (dhcp_gbl_ctx.dnsclient == NULL) {
352 result = dns_client_createx2(dhcp_gbl_ctx.
mctx,
358 &dhcp_gbl_ctx.dnsclient,
359 (dhcp_gbl_ctx.use_local4 ?
360 &dhcp_gbl_ctx.local4_sockaddr
362 (dhcp_gbl_ctx.use_local6 ?
363 &dhcp_gbl_ctx.local6_sockaddr
366 if (result != ISC_R_SUCCESS) {
367 log_error(
"Unable to create DNS client context:" 368 " result: %d", result);
375 result = dhcp_dns_client_setservers();
376 if (result != ISC_R_SUCCESS) {
377 log_error(
"Unable to set resolver from resolv.conf; " 378 "startup continuing but DDNS support " 379 "may be affected: result %d", result);
383 return ISC_R_SUCCESS;
#define DHCP_HMAC_SHA512_NAME
isc_result_t dhcp_isc_name(unsigned char *namestr, dns_fixedname_t *namefix, dns_name_t **name)
isc_result_t dhcp_context_create(int flags, struct in_addr *local4, struct in6_addr *local6)
isc_result_t dhcp_result_register(void)
#define DHCP_R_INVALIDARG
isc_result_t isclib_make_dst_key(char *inname, char *algorithm, unsigned char *secret, int length, dst_key_t **dstkey)
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
#define DHCP_CONTEXT_PRE_DB
isc_timermgr_t * timermgr
int log_error(const char *,...) __attribute__((__format__(__printf__
void dhcp_signal_handler(int signal)
isc_socketmgr_t * socketmgr
void log_fatal(const char *,...) __attribute__((__format__(__printf__
#define DHCP_CONTEXT_POST_DB
#define DHCP_HMAC_SHA1_NAME
isc_result_t dns_client_init()
#define DHCP_DNS_CLIENT_LAZY_INIT
#define DHCP_HMAC_SHA256_NAME
void isclib_cleanup(void)
dhcp_context_t dhcp_gbl_ctx
#define DHCP_HMAC_MD5_NAME
#define DHCP_HMAC_SHA384_NAME
#define DHCP_HMAC_SHA224_NAME
#define _PATH_RESOLV_CONF