Code

Bump ABI version.
[liboping.git] / src / liboping.c
index f8c5bfbf6a6c251f5ac2f91ec4e20acd2d64949f..4626e6d26e55710ca89c8fee94dc0106184c9e69 100644 (file)
@@ -694,6 +694,7 @@ static int ping_receive_all (pingobj_t *obj)
                        if (!timerisset (ptr->timer))
                                continue;
 
+                       assert (ptr->fd < FD_SETSIZE);
                        FD_SET (ptr->fd, &read_fds);
                        FD_SET (ptr->fd, &err_fds);
                        num_fds++;
@@ -1481,6 +1482,16 @@ int ping_host_add (pingobj_t *obj, const char *host)
                        ping_set_errno (obj, errno);
                        continue;
                }
+               else if (ph->fd >= FD_SETSIZE)
+               {
+                       dprintf("socket(2) returned file descriptor %d, which is above the file "
+                               "descriptor limit for select(2) (FD_SETSIZE = %d)\n",
+                               ph->fd, FD_SETSIZE);
+                       close(ph->fd);
+                       ph->fd = -1;
+                       ping_set_errno(obj, EMFILE);
+                       continue;
+               }
 
                if (obj->srcaddr != NULL)
                {
@@ -1711,6 +1722,20 @@ pingobj_iter_t *ping_iterator_next (pingobj_iter_t *iter)
        return ((pingobj_iter_t *) iter->next);
 }
 
+int ping_iterator_count (pingobj_t *obj)
+{
+       if (obj == NULL)
+               return 0;
+
+       int count = 0;
+       pingobj_iter_t *iter = obj->head;
+       while (iter) {
+               count++;
+               iter = iter->next;
+       }
+       return count;
+}
+
 int ping_iterator_get_info (pingobj_iter_t *iter, int info,
                void *buffer, size_t *buffer_len)
 {