- if (event & EV_READ) {
- int ret;
- unsigned char buf[PINBA_UDP_BUFFER_SIZE];
- struct sockaddr_in from;
- socklen_t fromlen = sizeof(struct sockaddr_in);
-
- ret = recvfrom(sock, buf, PINBA_UDP_BUFFER_SIZE-1, MSG_DONTWAIT, (struct sockaddr *)&from, &fromlen);
- if (ret > 0) {
- if (pinba_process_stats_packet(buf, ret) != P_SUCCESS) {
- DEBUG("failed to parse data received from %s", inet_ntoa(from.sin_addr));
- }
- } else if (ret < 0) {
- if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) {
- return;
+ uint8_t buffer[PINBA_UDP_BUFFER_SIZE];
+ size_t buffer_size;
+ int status;
+
+ if ((event & EV_READ) == 0)
+ return;
+
+ while (42)
+ {
+ buffer_size = sizeof (buffer);
+ status = recvfrom (sock, buffer, buffer_size - 1, MSG_DONTWAIT, /* from = */ NULL, /* from len = */ 0);
+ if (status < 0)
+ {
+ char errbuf[1024];
+
+ if ((errno == EINTR)
+#ifdef EWOULDBLOCK
+ || (errno == EWOULDBLOCK)
+#endif
+ || (errno == EAGAIN))
+ {
+ continue;