aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@revosec.ch>2012-10-09 11:16:07 +0200
committerMartin Willi <martin@revosec.ch>2012-10-24 11:43:34 +0200
commit9d422bb1b03255a8b2ba2e594916d3e9bd38f4ee (patch)
treebf467ee98f165749e7ed585ae50a537682dd13bd /src
parentf6fb2b98e987d485fc7fba3419646f63904c6cfd (diff)
downloadstrongswan-9d422bb1b03255a8b2ba2e594916d3e9bd38f4ee.tar.bz2
strongswan-9d422bb1b03255a8b2ba2e594916d3e9bd38f4ee.tar.xz
Send a lookip NOT_FOUND reply if a lookup yields no results
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/plugins/lookip/lookip.c5
-rw-r--r--src/libcharon/plugins/lookip/lookip_msg.h20
-rw-r--r--src/libcharon/plugins/lookip/lookip_socket.c18
3 files changed, 32 insertions, 11 deletions
diff --git a/src/libcharon/plugins/lookip/lookip.c b/src/libcharon/plugins/lookip/lookip.c
index 7f5dc8afb..4637e7b0b 100644
--- a/src/libcharon/plugins/lookip/lookip.c
+++ b/src/libcharon/plugins/lookip/lookip.c
@@ -102,6 +102,9 @@ static int receive(int fd, int block)
case LOOKIP_ENTRY:
label = "lookup:";
break;
+ case LOOKIP_NOT_FOUND:
+ label = "not found:";
+ break;
case LOOKIP_NOTIFY_UP:
label = "up:";
break;
@@ -117,7 +120,7 @@ static int receive(int fd, int block)
resp.id[sizeof(resp.id) - 1] = '\0';
resp.name[sizeof(resp.name) - 1] = '\0';
- printf("%-8s %16s %16s %20s %s\n",
+ printf("%-12s %16s %16s %20s %s\n",
label, resp.vip, resp.ip, resp.name, resp.id);
}
}
diff --git a/src/libcharon/plugins/lookip/lookip_msg.h b/src/libcharon/plugins/lookip/lookip_msg.h
index 86ea42f11..337d1c49f 100644
--- a/src/libcharon/plugins/lookip/lookip_msg.h
+++ b/src/libcharon/plugins/lookip/lookip_msg.h
@@ -40,19 +40,21 @@ enum {
/** request a dump of all entries */
LOOKIP_DUMP = 1,
/** lookup a specific virtual IP */
- LOOKIP_LOOKUP = 2,
+ LOOKIP_LOOKUP,
/** reply message for DUMP and LOOKUP */
- LOOKIP_ENTRY = 3,
+ LOOKIP_ENTRY,
+ /** reply message for LOOKUP if no such IP found */
+ LOOKIP_NOT_FOUND,
/** register for notifications about new virtual IPs */
- LOOKIP_REGISTER_UP = 4,
+ LOOKIP_REGISTER_UP,
/** register for notifications about virtual IPs released */
- LOOKIP_REGISTER_DOWN = 5,
+ LOOKIP_REGISTER_DOWN,
/** notify reply message for REGISTER_UP */
- LOOKIP_NOTIFY_UP = 6,
+ LOOKIP_NOTIFY_UP,
/** notify reply message for REGISTER_DOWN */
- LOOKIP_NOTIFY_DOWN = 7,
+ LOOKIP_NOTIFY_DOWN,
/** end of request batch */
- LOOKIP_END = 8,
+ LOOKIP_END,
};
/**
@@ -72,7 +74,9 @@ struct lookip_request_t {
/**
* Response message sent to client.
*
- * Valid response message types are ENTRY and NOTIFY_UP/DOWN.
+ * Valid response message types are ENTRY, NOT_FOUND and NOTIFY_UP/DOWN.
+ *
+ * All fields are set in all messages, except in NOT_FOUND: Only vip is set.
*/
struct lookip_response_t {
/** response message type */
diff --git a/src/libcharon/plugins/lookip/lookip_socket.c b/src/libcharon/plugins/lookip/lookip_socket.c
index 66eafd3a9..5c6e0e3c9 100644
--- a/src/libcharon/plugins/lookip/lookip_socket.c
+++ b/src/libcharon/plugins/lookip/lookip_socket.c
@@ -188,6 +188,7 @@ static void query(private_lookip_socket_t *this, int fd, lookip_request_t *req)
.type = LOOKIP_ENTRY,
};
host_t *vip = NULL;
+ int matches = 0;
if (req)
{ /* lookup */
@@ -195,10 +196,23 @@ static void query(private_lookip_socket_t *this, int fd, lookip_request_t *req)
vip = host_create_from_string(req->vip, 0);
if (vip)
{
- this->listener->lookup(this->listener, vip,
- (void*)listener_cb, &entry);
+ matches = this->listener->lookup(this->listener, vip,
+ (void*)listener_cb, &entry);
vip->destroy(vip);
}
+ if (matches == 0)
+ {
+ lookip_response_t resp = {
+ .type = LOOKIP_NOT_FOUND,
+ };
+
+ snprintf(resp.vip, sizeof(resp.vip), "%s", req->vip);
+ if (send(fd, &resp, sizeof(resp), 0) < 0)
+ {
+ DBG1(DBG_CFG, "sending lookip not-found failed: %s",
+ strerror(errno));
+ }
+ }
}
else
{ /* dump */