How do I get all the routes the IP stack has programatically? I tried it
out with sysctl call (the way BSD does it), but for some reason, sysctl is
returning me an incomplete list of routes. Following is the code I am using
query the routes.
-Vinay
#define ROUNDUP(a) \
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
RouteShow()
{
size_t needed;
int mib[6];
char *buf, *next, *lim;
struct rt_msghdr *rtm;
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = 0;
mib[4] = NET_RT_DUMP;
mib[5] = 0;
if(sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
{
TRC_SMSG(ctlpl, 1, “sysctl-estimate failed” << strerror(errno) << endl);
return;
}
buf = new char[needed];
if(!buf)
return;
if(sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
{
TRC_SMSG(ctlpl, 1, “sysctl failed” << strerror(errno) << endl);
return;
}
lim = buf + needed;
cout << “QNX IP Stack Routing Tables” << endl;
for(next = buf; next < lim; next += rtm->rtm_msglen)
{
rtm = (struct rt_msghdr *)next;
struct sockaddr *sa = (struct sockaddr *)(rtm + 1);
cout << "SeqNo " << rtm->rtm_seq << endl;
cout << "PidNo " << rtm->rtm_pid << endl;
if(rtm->rtm_addrs == RTA_DST)
{
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
cout << " Dst: " << InetToString(sin->sin_addr.s_addr);
}
else
{
sa = (struct sockaddr *)(ROUNDUP(sa->sa_len) + (char *)sa);
struct sockaddr_in *sin = (struct sockaddr_in *)sa;
cout << " Gw: " << InetToString(sin->sin_addr.s_addr) << endl;
}
cout << endl;
}
}