+ int fd;
+ char buf[32768];
+ struct nlmsghdr *nlmsg;
+ struct rtgenmsg *rtgen;
+ const struct rtattr *rta;
+ const struct rtmsg *rtm;
+ ssize_t n, nn;
+ int rc = 0;
+ static unsigned long seq = 0x48b4aec4;
+
+ if ((fd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0)
+ die(1, "failed to create netlink socket: %s", strerror(errno));
+
+ nlmsg = (struct nlmsghdr *)buf;
+ assert(NLMSG_SPACE(sizeof(*rtgen)) < sizeof(buf));
+ nlmsg->nlmsg_len = NLMSG_LENGTH(sizeof(*rtgen));
+ nlmsg->nlmsg_type = RTM_GETROUTE;
+ nlmsg->nlmsg_flags = NLM_F_REQUEST | NLM_F_ROOT;
+ nlmsg->nlmsg_seq = ++seq;
+ nlmsg->nlmsg_pid = 0;
+
+ rtgen = (struct rtgenmsg *)NLMSG_DATA(nlmsg);
+ rtgen->rtgen_family = af;
+
+ if (write(fd, nlmsg, nlmsg->nlmsg_len) < 0)
+ die(1, "failed to send RTM_GETROUTE request: %s", strerror(errno));