When read(2)'ing from the routing socket only one message is returned.
Clue provided by jca and claudio.
OK?
diff --git frontend.c frontend.c
index f78c9802292..4193517e37b 100644
--- frontend.c
+++ frontend.c
@@ -536,11 +536,9 @@ route_receive(int fd, short events, void *arg)
{
static uint8_t buf[ROUTE_SOCKET_BUF_SIZE];
- struct rt_msghdr*rtm;
+ struct rt_msghdr*rtm = (struct rt_msghdr *)buf;
struct sockaddr *sa, *rti_info[RTAX_MAX];
- size_t len, offset;
ssize_t n;
- char*next;
if ((n = read(fd, &buf, sizeof(buf))) == -1) {
if (errno == EAGAIN || errno == EINTR)
@@ -549,26 +547,21 @@ route_receive(int fd, short events, void *arg)
return;
}
- if (n == 0) {
- log_warnx("routing socket closed");
+ if (n == 0)
+ fatal("routing socket closed");
+
+ if (n < rtm->rtm_msglen) {
+ log_warnx("partial rtm in buffer");
return;
}
- len = n;
- for (offset = 0; offset < len; offset += rtm->rtm_msglen) {
- next = buf + offset;
- rtm = (struct rt_msghdr *)next;
- if (len < offset + sizeof(u_short) ||
- len < offset + rtm->rtm_msglen)
- fatalx("rtmsg_process: partial rtm in buffer");
- if (rtm->rtm_version != RTM_VERSION)
- continue;
+ if (rtm->rtm_version != RTM_VERSION)
+ return;
- sa = (struct sockaddr *)(next + rtm->rtm_hdrlen);
- get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
+ sa = (struct sockaddr *)(buf + rtm->rtm_hdrlen);
+ get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
- handle_route_message(rtm, rti_info);
- }
+ handle_route_message(rtm, rti_info);
}
void
--
I'm not entirely sure you are real.