From 8dc33835365a647f352f3b9b00b816763bc536d2 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Wed, 14 Mar 2012 11:32:24 +0100 Subject: pingu_adm: support route dumps --- pingu_adm.c | 1 + pingu_iface.c | 11 +++++++++++ pingu_iface.h | 1 + pingu_route.c | 14 ++++++++++++++ pingu_route.h | 1 + 5 files changed, 28 insertions(+) diff --git a/pingu_adm.c b/pingu_adm.c index b59b9b0..9062e6e 100644 --- a/pingu_adm.c +++ b/pingu_adm.c @@ -43,6 +43,7 @@ static struct { { "host-status", pingu_host_dump_status }, { "gateway-status", pingu_iface_dump_status }, { "pings", pingu_iface_dump_pings }, + { "routes", pingu_iface_dump_routes }, { NULL, NULL } }; diff --git a/pingu_iface.c b/pingu_iface.c index fa50de6..065eea3 100644 --- a/pingu_iface.c +++ b/pingu_iface.c @@ -269,6 +269,17 @@ void pingu_iface_dump_pings(int fd, char *filter) write(fd, "\n", 1); } +void pingu_iface_dump_routes(int fd, char *filter) +{ + struct pingu_iface *iface; + list_for_each_entry(iface, &iface_list, iface_list_entry) { + if (filter != NULL && strcmp(filter, iface->name) != 0) + continue; + pingu_route_dump(fd, &iface->route_list); + } + write(fd, "\n", 1); +} + int pingu_iface_init(struct ev_loop *loop) { struct pingu_iface *iface; diff --git a/pingu_iface.h b/pingu_iface.h index a87821f..56ac6d8 100644 --- a/pingu_iface.h +++ b/pingu_iface.h @@ -55,6 +55,7 @@ void pingu_iface_gw_action(struct pingu_iface *iface, void pingu_iface_dump_status(int fd, char *filter); void pingu_iface_dump_pings(int fd, char *filter); +void pingu_iface_dump_routes(int fd, char *filter); void pingu_iface_update_routes(struct pingu_iface *iface, int action); void pingu_iface_cleanup(struct ev_loop *loop); #endif diff --git a/pingu_route.c b/pingu_route.c index 2c96a8d..3a82f70 100644 --- a/pingu_route.c +++ b/pingu_route.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "list.h" #include "log.h" @@ -145,6 +146,19 @@ struct pingu_route *pingu_route_first_default(struct list_head *route_list) return NULL; } +void pingu_route_dump(int fd, struct list_head *route_list) +{ + struct pingu_route *entry; + list_for_each_entry(entry, route_list, route_list_entry) { + char str[512] = ""; + pingu_route_to_string(entry, str, sizeof(str)); + if (str[0] != '\0') { + strncat(str, "\n", sizeof(str)); + write(fd, str, strlen(str)); + } + } +} + void pingu_route_cleanup(struct list_head *route_list) { struct pingu_route *entry, *n; diff --git a/pingu_route.h b/pingu_route.h index c416182..bd4abf9 100644 --- a/pingu_route.h +++ b/pingu_route.h @@ -28,6 +28,7 @@ void pingu_route_del(struct list_head *route_list, struct pingu_route *gw); int is_default_gw(struct pingu_route *route); struct pingu_route *pingu_route_first_default(struct list_head *route_list); +void pingu_route_dump(int fd, struct list_head *route_list); void pingu_route_cleanup(struct list_head *route_list); #endif -- cgit v1.2.3