From d6a27ec64ee6f77a00494cfa8a0001d190e537f6 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Tue, 23 Feb 2010 16:49:34 +0000 Subject: Do not kill daemon, just not use pluggable kernel interface if initialization failed --- .../plugins/kernel_netlink/kernel_netlink_net.c | 28 +++++++++++++++------- 1 file changed, 20 insertions(+), 8 deletions(-) (limited to 'src/charon/plugins/kernel_netlink/kernel_netlink_net.c') diff --git a/src/charon/plugins/kernel_netlink/kernel_netlink_net.c b/src/charon/plugins/kernel_netlink/kernel_netlink_net.c index 4a9fdf69a..e1ba4a859 100644 --- a/src/charon/plugins/kernel_netlink/kernel_netlink_net.c +++ b/src/charon/plugins/kernel_netlink/kernel_netlink_net.c @@ -1336,10 +1336,15 @@ static void destroy(private_kernel_netlink_net_t *this) manage_rule(this, RTM_DELRULE, AF_INET6, this->routing_table, this->routing_table_prio); } - - this->job->cancel(this->job); - close(this->socket_events); - this->socket->destroy(this->socket); + if (this->job) + { + this->job->cancel(this->job); + } + if (this->socket_events > 0) + { + close(this->socket_events); + } + DESTROY_IF(this->socket); this->ifaces->destroy_function(this->ifaces, (void*)iface_entry_destroy); this->condvar->destroy(this->condvar); this->mutex->destroy(this->mutex); @@ -1380,21 +1385,26 @@ kernel_netlink_net_t *kernel_netlink_net_create() "charon.install_virtual_ip", TRUE); this->socket = netlink_socket_create(NETLINK_ROUTE); + this->job = NULL; memset(&addr, 0, sizeof(addr)); addr.nl_family = AF_NETLINK; /* create and bind RT socket for events (address/interface/route changes) */ this->socket_events = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); - if (this->socket_events <= 0) + if (this->socket_events < 0) { - charon->kill(charon, "unable to create RT event socket"); + DBG1(DBG_KNL, "unable to create RT event socket"); + destroy(this); + return NULL; } addr.nl_groups = RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR | RTMGRP_IPV4_ROUTE | RTMGRP_IPV4_ROUTE | RTMGRP_LINK; if (bind(this->socket_events, (struct sockaddr*)&addr, sizeof(addr))) { - charon->kill(charon, "unable to bind RT event socket"); + DBG1(DBG_KNL, "unable to bind RT event socket"); + destroy(this); + return NULL; } this->job = callback_job_create((callback_job_cb_t)receive_events, @@ -1403,7 +1413,9 @@ kernel_netlink_net_t *kernel_netlink_net_create() if (init_address_list(this) != SUCCESS) { - charon->kill(charon, "unable to get interface list"); + DBG1(DBG_KNL, "unable to get interface list"); + destroy(this); + return NULL; } if (this->routing_table) -- cgit v1.2.3