* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: lwresd.c,v 1.43 2002/02/20 03:33:15 marka Exp $ */
+/* $Id: lwresd.c,v 1.44 2003/04/17 06:39:33 marka Exp $ */
/*
* Main program for the Lightweight Resolver Daemon.
lwresd->magic = 0;
isc_mem_put(mctx, lwresd, sizeof(*lwresd));
isc_mem_detach(&mctx);
- lwresdp = NULL;
+ *lwresdp = NULL;
}
if (listener->manager != NULL)
ns_lwdmanager_detach(&listener->manager);
- if (listener->sock != 0)
+ if (listener->sock != NULL)
isc_socket_detach(&listener->sock);
listener->magic = 0;
if (result != ISC_R_SUCCESS) {
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_LWRESD, ISC_LOG_WARNING,
- "failed to create socket: %s",
+ "failed to create lwres socket: %s",
isc_result_totext(result));
return (result);
}
result = isc_socket_bind(sock, &listener->address);
if (result != ISC_R_SUCCESS) {
+ char socktext[ISC_SOCKADDR_FORMATSIZE];
+ isc_sockaddr_format(&listener->address, socktext,
+ sizeof(socktext));
isc_socket_detach(&sock);
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
NS_LOGMODULE_LWRESD, ISC_LOG_WARNING,
- "failed to bind socket: %s",
- isc_result_totext(result));
+ "failed to add lwres socket: %s: %s",
+ socktext, isc_result_totext(result));
return (result);
}
listener->sock = sock;
*/
if (oldlistener == NULL) {
result = listener_bind(listener, address);
- if (result != ISC_R_SUCCESS)
- return (result);
+ if (result != ISC_R_SUCCESS) {
+ ns_lwreslistener_detach(&listener);
+ return (ISC_R_SUCCESS);
+ }
} else
listener_copysock(oldlistener, listener);
"lwres: failed to start %s: %s", socktext,
isc_result_totext(result));
ns_lwreslistener_detach(&listener);
- return (result);
+ return (ISC_R_SUCCESS);
}
if (oldlistener != NULL) {
ns_lwreslistenerlist_t newlisteners;
isc_result_t result;
char socktext[ISC_SOCKADDR_FORMATSIZE];
+ isc_sockaddr_t *addrs = NULL;
+ ns_lwresd_t *lwresd = NULL;
+ isc_uint32_t count = 0;
REQUIRE(mctx != NULL);
REQUIRE(config != NULL);
element != NULL;
element = cfg_list_next(element))
{
- ns_lwresd_t *lwresd;
in_port_t port;
- isc_sockaddr_t *addrs = NULL;
- isc_uint32_t count;
lwres = cfg_listelt_value(element);
- lwresd = NULL;
- result = ns_lwdmanager_create(mctx, lwres, &lwresd);
- if (result != ISC_R_SUCCESS)
- return (result);
+ CHECK(ns_lwdmanager_create(mctx, lwres, &lwresd));
port = lwresd_g_listenport;
if (port == 0)
localhost.s_addr = htonl(INADDR_LOOPBACK);
isc_sockaddr_fromin(&address, &localhost, port);
- result = configure_listener(&address, lwresd,
- mctx, &newlisteners);
+ CHECK(configure_listener(&address, lwresd, mctx,
+ &newlisteners));
} else {
isc_uint32_t i;
- result = ns_config_getiplist(config, listenerslist,
- port, mctx,
- &addrs, &count);
- if (result != ISC_R_SUCCESS)
- goto failure;
-
- for (i = 0; i < count; i++) {
- result = configure_listener(&addrs[i], lwresd,
- mctx,
- &newlisteners);
- if (result != ISC_R_SUCCESS)
- goto failure;
- }
- }
-
- failure:
- if (addrs != NULL)
+ CHECK(ns_config_getiplist(config, listenerslist,
+ port, mctx, &addrs, &count));
+ for (i = 0; i < count; i++)
+ CHECK(configure_listener(&addrs[i], lwresd,
+ mctx, &newlisteners));
ns_config_putiplist(mctx, &addrs, count);
-
+ }
ns_lwdmanager_detach(&lwresd);
- if (result != ISC_R_SUCCESS)
- return (result);
}
/*
isc_log_write(ns_g_lctx, ISC_LOGCATEGORY_GENERAL,
NS_LOGMODULE_LWRESD, ISC_LOG_NOTICE,
"lwres no longer listening on %s", socktext);
-
}
+
+ cleanup:
ISC_LIST_APPENDLIST(listeners, newlisteners, link);
+ if (addrs != NULL)
+ ns_config_putiplist(mctx, &addrs, count);
+
+ if (lwresd != NULL)
+ ns_lwdmanager_detach(&lwresd);
+
UNLOCK(&listeners_lock);
- return (ISC_R_SUCCESS);
+ return (result);
}
void