]> git.ozlabs.org Git - ccan/blobdiff - ccan/failtest/failtest.c
antithread, failtest: use ccan/err instead of err.h.
[ccan] / ccan / failtest / failtest.c
index 215ebfab360781e4592004f779c044b680148aec..b3ee0337ebd96cfb7fe9a3b7cd3114fe473404c8 100644 (file)
@@ -5,7 +5,6 @@
 #include <stdio.h>
 #include <stdarg.h>
 #include <ctype.h>
-#include <err.h>
 #include <unistd.h>
 #include <poll.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/mman.h>
+#include <sys/resource.h>
 #include <signal.h>
 #include <assert.h>
+#include <ccan/err/err.h>
 #include <ccan/time/time.h>
 #include <ccan/read_write_all/read_write_all.h>
 #include <ccan/failtest/failtest_proto.h>
@@ -194,11 +195,21 @@ static struct failtest_call *add_history_(enum failtest_call_type type,
 static int move_fd_to_high(int fd)
 {
        int i;
+       struct rlimit lim;
+       int max;
 
-       for (i = FD_SETSIZE - 1; i >= 0; i--) {
+       if (getrlimit(RLIMIT_NOFILE, &lim) == 0) {
+               max = lim.rlim_cur;
+               printf("Max is %i\n", max);
+       } else
+               max = FD_SETSIZE;
+
+       for (i = max - 1; i > fd; i--) {
                if (fcntl(i, F_GETFL) == -1 && errno == EBADF) {
-                       if (dup2(fd, i) == -1)
-                               err(1, "Failed to dup fd %i to %i", fd, i);
+                       if (dup2(fd, i) == -1) {
+                               warn("Failed to dup fd %i to %i", fd, i);
+                               continue;
+                       }
                        close(fd);
                        return i;
                }
@@ -1166,6 +1177,15 @@ void *failtest_mmap(void *addr, size_t length, int prot, int flags,
        return p->u.mmap.ret;
 }
 
+/* Since OpenBSD can't handle adding args, we use this file and line.
+ * This will make all mmaps look the same, reducing coverage. */
+void *failtest_mmap_noloc(void *addr, size_t length, int prot, int flags,
+                         int fd, off_t offset)
+{
+       return failtest_mmap(addr, length, prot, flags, fd, offset,
+                            __FILE__, __LINE__);
+}
+
 static void cleanup_pipe(struct pipe_call *call, bool restore)
 {
        trace("cleaning up pipe fd=%i%s,%i%s\n",