METHOD(kernel_ipsec_t, destroy, void,
private_kernel_klips_ipsec_t *this)
{
- this->job->cancel(this->job);
- close(this->socket);
- close(this->socket_events);
+ if (this->job)
+ {
+ this->job->cancel(this->job);
+ }
+ if (this->socket > 0)
+ {
+ close(this->socket);
+ }
+ if (this->socket_evnets > 0)
+ {
+ close(this->socket_events);
+ }
this->mutex_pfkey->destroy(this->mutex_pfkey);
this->mutex->destroy(this->mutex);
this->ipsec_devices->destroy_function(this->ipsec_devices, (void*)ipsec_dev_destroy);
this->socket = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
if (this->socket <= 0)
{
- charon->kill(charon, "unable to create PF_KEY socket");
+ DBG1(DBG_KNL, "unable to create PF_KEY socket");
+ destroy(this);
+ return NULL;
}
/* create a PF_KEY socket for ACQUIRE & EXPIRE */
this->socket_events = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
if (this->socket_events <= 0)
{
- charon->kill(charon, "unable to create PF_KEY event socket");
+ DBG1(DBG_KNL, "unable to create PF_KEY event socket");
+ destroy(this);
+ return NULL;
}
/* register the event socket */
if (register_pfkey_socket(this, SADB_SATYPE_ESP) != SUCCESS ||
register_pfkey_socket(this, SADB_SATYPE_AH) != SUCCESS)
{
- charon->kill(charon, "unable to register PF_KEY event socket");
+ DBG1(DBG_KNL, "unable to register PF_KEY event socket");
+ destroy(this);
+ return NULL;
}
this->job = callback_job_create((callback_job_cb_t)receive_events,
return &this->public;
}
+
enumerator_t *enumerator;
policy_entry_t *policy;
- this->job->cancel(this->job);
- close(this->socket_xfrm_events);
- this->socket_xfrm->destroy(this->socket_xfrm);
+ if (this->job)
+ {
+ this->job->cancel(this->job);
+ }
+ if (this->socket_xfrm_events > 0)
+ {
+ close(this->socket_xfrm_events);
+ }
+ DESTROY_IF(this->socket_xfrm);
enumerator = this->policies->create_enumerator(this->policies);
while (enumerator->enumerate(enumerator, &policy, &policy))
{
}
this->socket_xfrm = netlink_socket_create(NETLINK_XFRM);
+ if (!this->socket_xfrm)
+ {
+ destroy(this);
+ return NULL;
+ }
memset(&addr, 0, sizeof(addr));
addr.nl_family = AF_NETLINK;
this->socket_xfrm_events = socket(AF_NETLINK, SOCK_RAW, NETLINK_XFRM);
if (this->socket_xfrm_events <= 0)
{
- charon->kill(charon, "unable to create XFRM event socket");
+ DBG1(DBG_KNL, "unable to create XFRM event socket");
+ destroy(this);
+ return NULL;
}
addr.nl_groups = XFRMNLGRP(ACQUIRE) | XFRMNLGRP(EXPIRE) |
XFRMNLGRP(MIGRATE) | XFRMNLGRP(MAPPING);
if (bind(this->socket_xfrm_events, (struct sockaddr*)&addr, sizeof(addr)))
{
- charon->kill(charon, "unable to bind XFRM event socket");
+ DBG1(DBG_KNL, "unable to bind XFRM event socket");
+ destroy(this);
+ return NULL;
}
this->job = callback_job_create((callback_job_cb_t)receive_events,
this, NULL, NULL);
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);
"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,
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)
*/
static void destroy(private_netlink_socket_t *this)
{
- close(this->socket);
+ if (this->socket > 0)
+ {
+ close(this->socket);
+ }
this->mutex->destroy(this->mutex);
free(this);
}
/**
* Described in header.
*/
-netlink_socket_t *netlink_socket_create(int protocol) {
+netlink_socket_t *netlink_socket_create(int protocol)
+{
private_netlink_socket_t *this = malloc_thing(private_netlink_socket_t);
struct sockaddr_nl addr;
this->protocol = protocol;
this->socket = socket(AF_NETLINK, SOCK_RAW, protocol);
- if (this->socket <= 0)
+ if (this->socket < 0)
{
- charon->kill(charon, "unable to create netlink socket");
+ DBG1(DBG_KNL, "unable to create netlink socket");
+ destroy(this);
+ return NULL;
}
addr.nl_groups = 0;
if (bind(this->socket, (struct sockaddr*)&addr, sizeof(addr)))
{
- charon->kill(charon, "unable to bind netlink socket");
+ DBG1(DBG_KNL, "unable to bind netlink socket");
+ destroy(this);
+ return NULL;
}
return &this->public;
METHOD(kernel_ipsec_t, destroy, void,
private_kernel_pfkey_ipsec_t *this)
{
- this->job->cancel(this->job);
- close(this->socket);
- close(this->socket_events);
+ if (this->job)
+ {
+ this->job->cancel(this->job);
+ }
+ if (this->socket > 0)
+ {
+ close(this->socket);
+ }
+ if (this->socket_events > 0)
+ {
+ close(this->socket_events);
+ }
this->policies->destroy_function(this->policies, (void*)policy_entry_destroy);
this->mutex->destroy(this->mutex);
this->mutex_pfkey->destroy(this->mutex_pfkey);
this->socket = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
if (this->socket <= 0)
{
- charon->kill(charon, "unable to create PF_KEY socket");
+ DBG1(DBG_KNL, "unable to create PF_KEY socket");
+ destroy(this);
+ return NULL;
}
/* create a PF_KEY socket for ACQUIRE & EXPIRE */
this->socket_events = socket(PF_KEY, SOCK_RAW, PF_KEY_V2);
if (this->socket_events <= 0)
{
- charon->kill(charon, "unable to create PF_KEY event socket");
+ DBG1(DBG_KNL, "unable to create PF_KEY event socket");
+ destroy(this);
+ return NULL;
}
/* register the event socket */
if (register_pfkey_socket(this, SADB_SATYPE_ESP) != SUCCESS ||
register_pfkey_socket(this, SADB_SATYPE_AH) != SUCCESS)
{
- charon->kill(charon, "unable to register PF_KEY event socket");
+ DBG1(DBG_KNL, "unable to register PF_KEY event socket");
+ destroy(this);
+ return NULL;
}
this->job = callback_job_create((callback_job_cb_t)receive_events,
*/
static void destroy(private_kernel_pfroute_net_t *this)
{
- this->job->cancel(this->job);
- close(this->socket);
- close(this->socket_events);
+ if (this->job)
+ {
+ this->job->cancel(this->job);
+ }
+ if (this->socket > 0)
+ {
+ close(this->socket);
+ }
+ if (this->socket_events)
+ {
+ close(this->socket_events);
+ }
this->ifaces->destroy_function(this->ifaces, (void*)iface_entry_destroy);
this->mutex->destroy(this->mutex);
this->mutex_pfroute->destroy(this->mutex_pfroute);
this->mutex_pfroute = mutex_create(MUTEX_TYPE_DEFAULT);
this->seq = 0;
+ this->socket_events = 0;
+ this->job = NULL;
/* create a PF_ROUTE socket to communicate with the kernel */
this->socket = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
- if (this->socket <= 0)
+ if (this->socket < 0)
{
- charon->kill(charon, "unable to create PF_ROUTE socket");
+ DBG1(DBG_KNL, "unable to create PF_ROUTE socket");
+ destroy(this);
+ return NULL;
}
/* create a PF_ROUTE socket to receive events */
this->socket_events = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
- if (this->socket_events <= 0)
+ if (this->socket_events < 0)
{
- charon->kill(charon, "unable to create PF_ROUTE event socket");
+ DBG1(DBG_KNL, "unable to create PF_ROUTE event socket");
+ destroy(this);
+ return NULL;
}
this->job = callback_job_create((callback_job_cb_t)receive_events,
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;
}
return &this->public;