return -1;
}
+/* Work out the maximum pid size */
+static inline long long
+get_max_pid_t()
+{
+
+ if (sizeof(pid_t) == sizeof(short)) return SHRT_MAX;
+ if (sizeof(pid_t) == sizeof(int)) return INT_MAX;
+ if (sizeof(pid_t) == sizeof(long)) return LONG_MAX;
+ if (sizeof(pid_t) == sizeof(long long)) return LLONG_MAX;
+ abort();
+}
+
static int
link_route(struct nlmsghdr *nlm)
{
rtm = NLMSG_DATA(nlm);
if (rtm->rtm_type != RTN_UNICAST ||
rtm->rtm_table != RT_TABLE_MAIN ||
- rtm->rtm_family != AF_INET ||
- nlm->nlmsg_pid == (uint32_t)getpid())
+ rtm->rtm_family != AF_INET)
return 1;
+ /* Ignore messages generated by us.
+ * For some reason we get messages generated by us
+ * with a very large value in nlmsg_pid that seems to be
+ * sequentially changing. Is there a better test for this? */
+ if (nlm->nlmsg_pid > get_max_pid_t())
+ return 1;
+
rta = (struct rtattr *)(void *)((char *)rtm +NLMSG_ALIGN(sizeof(*rtm)));
len = NLMSG_PAYLOAD(nlm, sizeof(*rtm));
memset(&rt, 0, sizeof(rt));
errno = EBADMSG;
return -1;
}
-// if (nlm->nlmsg_pid == (uint32_t)getpid())
-// return 1;
ifa = NLMSG_DATA(nlm);
if (if_indextoname(ifa->ifa_index, ifn) == NULL)
return -1;
int
manage_link(int fd)
{
+
return get_netlink(fd, MSG_DONTWAIT, &link_netlink);
}