version 1.33, 2010/07/30 12:55:12 |
version 1.34, 2010/10/11 12:33:36 |
|
|
* Print routing tables. |
* Print routing tables. |
*/ |
*/ |
void |
void |
p_rttables(int af, u_int tableid) |
p_rttables(int af, u_int tableid, int hastable) |
{ |
{ |
struct rt_msghdr *rtm; |
struct rt_msghdr *rtm; |
struct sadb_msg *msg; |
struct sadb_msg *msg; |
char *buf = NULL, *next, *lim = NULL; |
char *buf = NULL, *next, *lim = NULL; |
size_t needed; |
size_t needed; |
int mib[7]; |
int mib[7], mcnt; |
struct sockaddr *sa; |
struct sockaddr *sa; |
|
|
mib[0] = CTL_NET; |
mib[0] = CTL_NET; |
|
|
mib[3] = af; |
mib[3] = af; |
mib[4] = NET_RT_DUMP; |
mib[4] = NET_RT_DUMP; |
mib[5] = 0; |
mib[5] = 0; |
mib[6] = tableid; |
if (hastable) { |
|
mib[6] = tableid; |
|
mcnt = 7; |
|
} else |
|
mcnt = 6; |
|
|
if (sysctl(mib, 7, NULL, &needed, NULL, 0) < 0) |
if (sysctl(mib, mcnt, NULL, &needed, NULL, 0) < 0) |
err(1, "route-sysctl-estimate"); |
err(1, "route-sysctl-estimate"); |
if (needed > 0) { |
if (needed > 0) { |
if ((buf = malloc(needed)) == 0) |
if ((buf = malloc(needed)) == 0) |
err(1, NULL); |
err(1, NULL); |
if (sysctl(mib, 7, buf, &needed, NULL, 0) < 0) |
if (sysctl(mib, mcnt, buf, &needed, NULL, 0) < 0) |
err(1, "sysctl of routing table"); |
err(1, "sysctl of routing table"); |
lim = buf + needed; |
lim = buf + needed; |
} |
} |
|
|
netname(struct sockaddr *sa, struct sockaddr *mask) |
netname(struct sockaddr *sa, struct sockaddr *mask) |
{ |
{ |
switch (sa->sa_family) { |
switch (sa->sa_family) { |
|
|
case AF_INET: |
case AF_INET: |
return netname4(((struct sockaddr_in *)sa)->sin_addr.s_addr, |
return netname4(((struct sockaddr_in *)sa)->sin_addr.s_addr, |
mask->sa_len == 0 ? 0 : |
mask->sa_len == 0 ? 0 : |