aboutsummaryrefslogtreecommitdiffstats
path: root/Source/charon/network/host.c
diff options
context:
space:
mode:
Diffstat (limited to 'Source/charon/network/host.c')
-rw-r--r--Source/charon/network/host.c50
1 files changed, 34 insertions, 16 deletions
diff --git a/Source/charon/network/host.c b/Source/charon/network/host.c
index 95a4537c6..8208586ec 100644
--- a/Source/charon/network/host.c
+++ b/Source/charon/network/host.c
@@ -42,6 +42,11 @@ struct private_host_t {
int family;
/**
+ * string representation of host
+ */
+ char *string;
+
+ /**
* low-lewel structure, wich stores the address
*/
sockaddr_t address;
@@ -78,16 +83,15 @@ static bool is_default_route (private_host_t *this)
{
case AF_INET:
{
- int i;
- for (i = 0; i < 4;i++)
+ static u_int8_t default_route[4] = {0x00,0x00,0x00,0x00};
+ struct sockaddr_in *sin = (struct sockaddr_in*)&(this->address);
+ printf("host address: %ul\n", sin->sin_addr.s_addr);
+
+ if (memcmp(default_route,&(sin->sin_addr.s_addr),4) == 0)
{
- struct sockaddr_in *sin = (struct sockaddr_in*)&(this->address);
- if (*((&sin->sin_addr.s_addr) + i) != 0)
- {
- return FALSE;
- }
+ return TRUE;
}
- return TRUE;
+ return FALSE;
}
default:
{
@@ -106,8 +110,13 @@ static char *get_address(private_host_t *this)
{
case AF_INET:
{
+ char *string;
struct sockaddr_in *sin = (struct sockaddr_in*)&(this->address);
- return inet_ntoa(sin->sin_addr);
+ allocator_free(this->string);
+ string = inet_ntoa(sin->sin_addr);
+ this->string = allocator_alloc(strlen(string)+1);
+ strcpy(this->string, string);
+ return this->string;
}
default:
{
@@ -161,13 +170,6 @@ static u_int16_t get_port(private_host_t *this)
}
}
-/**
- * Implements host_t.destroy
- */
-static void destroy(private_host_t *this)
-{
- allocator_free(this);
-}
/**
* Implements host_t.clone.
@@ -175,8 +177,14 @@ static void destroy(private_host_t *this)
static private_host_t *clone(private_host_t *this)
{
private_host_t *new = allocator_alloc_thing(private_host_t);
+
memcpy(new, this, sizeof(private_host_t));
+ if (this->string)
+ {
+ new->string = allocator_alloc(strlen(this->string)+1);
+ strcpy(new->string, this->string);
+ }
return new;
}
@@ -203,6 +211,14 @@ static bool ip_is_equal(private_host_t *this, private_host_t *other)
return FALSE;
}
+/**
+ * Implements host_t.destroy
+ */
+static void destroy(private_host_t *this)
+{
+ allocator_free(this->string);
+ allocator_free(this);
+}
/**
* Creates an empty host_t object
@@ -221,6 +237,8 @@ static private_host_t *host_create_empty()
this->public.is_default_route = (bool (*) (host_t *)) is_default_route;
this->public.destroy = (void (*) (host_t*))destroy;
+ this->string = NULL;
+
return this;
}