Route: Group together printer families.

* Only check th family of the first incoming
  route entry as the list_routes function is
  called with the family pre-determined on
  the socket.
This commit is contained in:
Alexander von Gluck IV 2013-06-16 12:04:10 -05:00
parent 0c2d190d67
commit 47f91726cd

View File

@ -40,29 +40,23 @@ enum modes {
RTM_FLUSH, RTM_FLUSH,
}; };
enum preferred_output_format {
PREFER_OUTPUT_MASK,
PREFER_OUTPUT_PREFIX_LENGTH,
};
struct address_family { struct address_family {
int family; int family;
const char* name; const char* name;
const char* identifiers[4]; const char* identifiers[4];
uint32 maxLength; uint32 maxAddressLength;
}; };
static const address_family kFamilies[] = { static const address_family kFamilies[] = {
{ {
AF_INET, AF_INET,
"inet", "IPv4",
{"AF_INET", "inet", "ipv4", NULL}, {"AF_INET", "inet", "ipv4", NULL},
15, 15,
}, },
{ {
AF_INET6, AF_INET6,
"inet6", "IPv6",
{"AF_INET6", "inet6", "ipv6", NULL}, {"AF_INET6", "inet6", "ipv6", NULL},
39, 39,
}, },
@ -184,24 +178,28 @@ list_routes(int socket, const char *interfaceName, route_entry &route)
ifreq *interface = (ifreq*)buffer; ifreq *interface = (ifreq*)buffer;
ifreq *end = (ifreq*)((uint8*)buffer + size); ifreq *end = (ifreq*)((uint8*)buffer + size);
// find family (we use the family of the first address as this is
// called on a socket for a single family)
const address_family *family = NULL;
for (int32 i = 0; kFamilies[i].family >= 0; i++) {
if (interface->ifr_route.destination->sa_family
== kFamilies[i].family) {
family = &kFamilies[i];
break;
}
}
printf("%s routing table:\n", family->name);
while (interface < end) { while (interface < end) {
route_entry& route = interface->ifr_route; route_entry& route = interface->ifr_route;
// apply filters // apply filters
if (interfaceName == NULL if (interfaceName == NULL
|| !strcmp(interfaceName, interface->ifr_name)) { || !strcmp(interfaceName, interface->ifr_name)) {
// find family
const address_family *family = NULL;
for (int32 i = 0; kFamilies[i].family >= 0; i++) {
if (route.destination->sa_family == kFamilies[i].family) {
family = &kFamilies[i];
break;
}
}
if (family != NULL) { if (family != NULL) {
BNetworkAddress destination(*route.destination); BNetworkAddress destination(*route.destination);
printf("%15s", destination.ToString().String()); printf("%15s", destination.ToString().String());
if (route.mask != NULL) { if (route.mask != NULL) {
@ -264,6 +262,7 @@ list_routes(int socket, const char *interfaceName, route_entry &route)
+ sizeof(route_entry) + addressSize); + sizeof(route_entry) + addressSize);
} }
putchar('\n');
free(buffer); free(buffer);
} }