Test: Replace test relying on pselect6(2) man page ambiguity
[lttng-tools.git] / tests / regression / kernel / select_poll_epoll.c
index f24e9e468ebcf97da0cdebdf12512d1c5704a5b4..08e7fce0d898df547da42e371dc694f90bea4141 100644 (file)
@@ -17,7 +17,7 @@
 #include <limits.h>
 #include <pthread.h>
 #include <sys/mman.h>
-#include <time.h>
+#include <common/compat/time.h>
 
 #define BUF_SIZE 256
 #define NB_FD 1
@@ -437,29 +437,36 @@ void ppoll_fds_ulong_max(void)
 }
 
 /*
- * Select is limited to 1024 FDs, should output a pselect event
- * with 0 FDs.
+ * Pass an invalid file descriptor to pselect6(). The syscall should return
+ * -EBADF. The recorded event should contain a "ret = -EBADF (-9)".
  */
-void pselect_fd_too_big(void)
+void pselect_invalid_fd(void)
 {
-       long rfds[2048 / (sizeof(long) * CHAR_BIT)];
+       fd_set rfds;
        int ret;
-       int fd2;
+       int fd;
        char buf[BUF_SIZE];
 
        /*
-        * Test if nfds > 1024.
-        * Make sure ulimit is set correctly (ulimit -n 2048).
+        * Open a file, close it and use the closed FD in the pselect6 call.
         */
-       fd2 = dup2(wait_fd, 2047);
-       if (fd2 != 2047) {
-               perror("dup2");
-               return;
+
+       fd = open("/dev/null", O_RDONLY);
+       if (fd == -1) {
+               perror("open");
+               goto error;
+       }
+
+       ret = close(fd);
+       if (ret == -1) {
+               perror("close");
+               goto error;
        }
+
        FD_ZERO(&rfds);
-       FD_SET(fd2, (fd_set *) &rfds);
-       ret = syscall(SYS_pselect6, fd2 + 1, &rfds, NULL, NULL, NULL, NULL);
+       FD_SET(fd, &rfds);
 
+       ret = syscall(SYS_pselect6, fd + 1, &rfds, NULL, NULL, NULL, NULL);
        if (ret == -1) {
                perror("# pselect()");
        } else if (ret) {
@@ -471,7 +478,8 @@ void pselect_fd_too_big(void)
        } else {
                printf("# [pselect] timeout\n");
        }
-
+error:
+       return;
 }
 
 /*
@@ -812,14 +820,14 @@ void print_list(void)
                        "and epoll, waiting for input\n");
        fprintf(stderr, "\t2: Timeout cases (1ms) for select, pselect6, poll, "
                        "ppoll and epoll\n");
-       fprintf(stderr, "\t3: pselect with a FD > 1023\n");
+       fprintf(stderr, "\t3: pselect with an invalid fd\n");
        fprintf(stderr, "\t4: ppoll with %d FDs\n", MAX_FDS);
        fprintf(stderr, "\t5: ppoll buffer overflow, should segfault, waits "
                        "for input\n");
-       fprintf(stderr, "\t6: pselect with invalid pointer, waits for "
+       fprintf(stderr, "\t6: pselect with an invalid pointer, waits for "
                        "input\n");
        fprintf(stderr, "\t7: ppoll with ulong_max fds, waits for input\n");
-       fprintf(stderr, "\t8: epoll_pwait with invalid pointer, waits for "
+       fprintf(stderr, "\t8: epoll_pwait with an invalid pointer, waits for "
                        "input\n");
        fprintf(stderr, "\t9: epoll_pwait with maxevents set to INT_MAX, "
                        "waits for input\n");
@@ -892,7 +900,7 @@ int main(int argc, const char **argv)
                run_working_cases();
                break;
        case 3:
-               pselect_fd_too_big();
+               pselect_invalid_fd();
                break;
        case 4:
                test_ppoll_big();
This page took 0.024256 seconds and 4 git commands to generate.