diff options
Diffstat (limited to 'tests/xselect.c')
-rw-r--r-- | tests/xselect.c | 151 |
1 files changed, 97 insertions, 54 deletions
diff --git a/tests/xselect.c b/tests/xselect.c index fd7a48f03..ab53c7949 100644 --- a/tests/xselect.c +++ b/tests/xselect.c @@ -57,7 +57,21 @@ main(void) skip_if_unavailable("/proc/self/fd/"); #endif +#if defined(PATH_TRACING_FD) || defined(TRACING_FD) + static const int add_fd = +# ifdef PATH_TRACING_FD + PATH_TRACING_FD +# else + TRACING_FD +# endif + ; +#endif /* PATH_TRACING_FD || TRACING_FD */ + for (int i = 3; i < FD_SETSIZE; ++i) { +#ifdef TRACING_FD + if (i == TRACING_FD) + continue; +#endif #ifdef PATH_TRACING_FD if (i == PATH_TRACING_FD) continue; @@ -102,7 +116,7 @@ main(void) else perror_msg_and_fail(TEST_SYSCALL_STR); } -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(0, NULL, NULL, NULL, {tv_sec=%lld, tv_usec=%llu})" " = 0 (Timeout)\n", TEST_SYSCALL_STR, (long long) tv_in.tv_sec, @@ -111,7 +125,7 @@ main(void) /* EFAULT on tv argument */ XSELECT(-1, 0, 0, 0, 0, a_tv + 1); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(0, NULL, NULL, NULL, %#lx) = %s\n", TEST_SYSCALL_STR, (unsigned long) a_tv + 1, errstr); #endif @@ -122,23 +136,43 @@ main(void) for (int i = nfds; i <= smallset_size; ++i) { *l_rs = (1UL << fds[0]) | (1UL << fds[1]); XSELECT(1, i, a_rs, a_rs, a_rs, 0); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d %d], [%d %d], [%d %d], NULL) = 1 ()\n", TEST_SYSCALL_STR, i, fds[0], fds[1], fds[0], fds[1], fds[0], fds[1]); -#else +#else /* PATH_TRACING_FD || TRACING_FD */ + *l_rs = (1UL << fds[0]) | (1UL << fds[1]) | (1UL << add_fd); + XSELECT(i > add_fd ? 3 : 1, i, a_rs, a_rs, a_rs, 0); + if (i > add_fd) { + printf("%s(%d, [%d %d %d], [%d %d %d], [%d %d %d]" + ", NULL) = 3 ()\n", + TEST_SYSCALL_STR, i, + fds[0], fds[1], add_fd, + fds[0], fds[1], add_fd, + fds[0], fds[1], add_fd); + } +#endif /* !PATH_TRACING_FD && !TRACING_FD */ +#if defined(PATH_TRACING_FD) && defined(TRACING_FD) *l_rs = (1UL << fds[0]) | (1UL << fds[1]) | - (1UL << PATH_TRACING_FD); - XSELECT(i > PATH_TRACING_FD ? 3 : 1, i, a_rs, a_rs, a_rs, 0); + (1UL << TRACING_FD) | (1UL << PATH_TRACING_FD); + XSELECT(1 + 2 * (!!(i > TRACING_FD) + !!(i > PATH_TRACING_FD)), + i, a_rs, a_rs, a_rs, 0); if (i > PATH_TRACING_FD) { + printf("%s(%d, [%d %d %d %d], [%d %d %d %d]" + ", [%d %d %d %d], NULL) = 5 ()\n", + TEST_SYSCALL_STR, i, + fds[0], fds[1], TRACING_FD, PATH_TRACING_FD, + fds[0], fds[1], TRACING_FD, PATH_TRACING_FD, + fds[0], fds[1], TRACING_FD, PATH_TRACING_FD); + } else if (i > TRACING_FD) { printf("%s(%d, [%d %d %d], [%d %d %d], [%d %d %d]" ", NULL) = 3 ()\n", TEST_SYSCALL_STR, i, - fds[0], fds[1], PATH_TRACING_FD, - fds[0], fds[1], PATH_TRACING_FD, - fds[0], fds[1], PATH_TRACING_FD); + fds[0], fds[1], TRACING_FD, + fds[0], fds[1], TRACING_FD, + fds[0], fds[1], TRACING_FD); } -#endif +#endif /* PATH_TRACING_FD && TRACING_FD */ } /* @@ -150,7 +184,7 @@ main(void) memcpy(tv, &tv_in, sizeof(tv_in)); rc = xselect(nfds, a_rs, a_rs, a_rs, a_tv); if (rc < 0) { -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d %d], [%d %d], [%d %d]" ", {tv_sec=%lld, tv_usec=%llu}) = %s\n", TEST_SYSCALL_STR, nfds, fds[0], fds[1], @@ -158,9 +192,9 @@ main(void) (long long) tv_in.tv_sec, zero_extend_signed_to_ull(tv_in.tv_usec), errstr); -#endif /* !PATH_TRACING_FD */ +#endif /* PATH_TRACING_FD && TRACING_FD */ } else { -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d %d], [%d %d], [%d %d]" ", {tv_sec=%lld, tv_usec=%llu}) = %ld" " (left {tv_sec=%lld, tv_usec=%llu})\n", @@ -170,7 +204,7 @@ main(void) zero_extend_signed_to_ull(tv_in.tv_usec), rc, (long long) tv->tv_sec, zero_extend_signed_to_ull(tv->tv_usec)); -#endif /* !PATH_TRACING_FD */ +#endif /* PATH_TRACING_FD && TRACING_FD */ } /* @@ -182,7 +216,7 @@ main(void) memcpy(tv, &tv_in, sizeof(tv_in)); rc = xselect(nfds, a_rs, a_rs, a_rs, a_tv); if (rc < 0) { -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d %d], [%d %d], [%d %d]" ", {tv_sec=%lld, tv_usec=%llu}) = %s\n", TEST_SYSCALL_STR, nfds, fds[0], fds[1], @@ -190,9 +224,9 @@ main(void) (long long) tv_in.tv_sec, zero_extend_signed_to_ull(tv_in.tv_usec), errstr); -#endif /* PATH_TRACING_FD */ +#endif /* !PATH_TRACING_FD && !TRACING_FD */ } else { -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d %d], [%d %d], [%d %d]" ", {tv_sec=%lld, tv_usec=%llu}) = %ld" " (left {tv_sec=%lld, tv_usec=%llu})\n", @@ -202,7 +236,7 @@ main(void) zero_extend_signed_to_ull(tv_in.tv_usec), rc, (long long) tv->tv_sec, zero_extend_signed_to_ull(tv->tv_usec)); -#endif /* PATH_TRACING_FD */ +#endif /* !PATH_TRACING_FD && !TRACING_FD */ } /* @@ -217,7 +251,7 @@ main(void) tv_in.tv_usec = 0xc0de2; memcpy(tv, &tv_in, sizeof(tv_in)); XSELECT(3, i, a_rs, a_ws, a_es, a_tv); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d %d], [%d %d %d %d], []" ", {tv_sec=%lld, tv_usec=%llu}) = 3 (out [1 2 %d]" ", left {tv_sec=%lld, tv_usec=%llu})\n", @@ -228,49 +262,47 @@ main(void) fds[1], (long long) tv->tv_sec, zero_extend_signed_to_ull(tv->tv_usec)); -#else - *l_rs = (1UL << fds[0]) | (1UL << fds[1]) | - (1UL << PATH_TRACING_FD); +#else /* PATH_TRACING_FD || TRACING_FD */ + *l_rs = (1UL << fds[0]) | (1UL << fds[1]) | (1UL << add_fd); *l_ws = (1UL << 1) | (1UL << 2) | (1UL << fds[0]) | (1UL << fds[1]); tv_in.tv_sec = 0xc0de1; tv_in.tv_usec = 0xc0de2; memcpy(tv, &tv_in, sizeof(tv_in)); - XSELECT(3 + (i > PATH_TRACING_FD), i, a_rs, a_ws, a_es, a_tv); - if (i > PATH_TRACING_FD) { + XSELECT(3 + (i > add_fd), i, a_rs, a_ws, a_es, a_tv); + if (i > add_fd) { printf("%s(%d, [%d %d %d], [%d %d %d %d], []" ", {tv_sec=%lld, tv_usec=%llu})" " = 4 (in [%d], out [1 2 %d]" ", left {tv_sec=%lld, tv_usec=%llu})\n", TEST_SYSCALL_STR, i, - fds[0], fds[1], PATH_TRACING_FD, + fds[0], fds[1], add_fd, 1, 2, fds[0], fds[1], (long long) tv_in.tv_sec, zero_extend_signed_to_ull(tv_in.tv_usec), - PATH_TRACING_FD, fds[1], + add_fd, fds[1], (long long) tv->tv_sec, zero_extend_signed_to_ull(tv->tv_usec)); } *l_rs = (1UL << fds[0]) | (1UL << fds[1]); *l_ws = (1UL << 1) | (1UL << 2) | - (1UL << fds[0]) | (1UL << fds[1]) | - (1UL << PATH_TRACING_FD); + (1UL << fds[0]) | (1UL << fds[1]) | (1UL << add_fd); tv_in.tv_sec = 0xc0de1; tv_in.tv_usec = 0xc0de2; memcpy(tv, &tv_in, sizeof(tv_in)); - XSELECT(3 + (i > PATH_TRACING_FD), i, a_rs, a_ws, a_es, a_tv); - if (i > PATH_TRACING_FD) { + XSELECT(3 + (i > add_fd), i, a_rs, a_ws, a_es, a_tv); + if (i > add_fd) { printf("%s(%d, [%d %d], [%d %d %d %d %d], []" ", {tv_sec=%lld, tv_usec=%llu})" " = 4 (out [1 2 %d %d]" ", left {tv_sec=%lld, tv_usec=%llu})\n", TEST_SYSCALL_STR, i, fds[0], fds[1], - 1, 2, fds[0], fds[1], PATH_TRACING_FD, + 1, 2, fds[0], fds[1], add_fd, (long long) tv_in.tv_sec, zero_extend_signed_to_ull(tv_in.tv_usec), - fds[1], PATH_TRACING_FD, + fds[1], add_fd, (long long) tv->tv_sec, zero_extend_signed_to_ull(tv->tv_usec)); } @@ -278,18 +310,18 @@ main(void) *l_rs = (1UL << fds[0]) | (1UL << fds[1]); *l_ws = (1UL << 1) | (1UL << 2) | (1UL << fds[0]) | (1UL << fds[1]); - *l_es = (1UL << PATH_TRACING_FD); + *l_es = (1UL << add_fd); tv_in.tv_sec = 0xc0de1; tv_in.tv_usec = 0xc0de2; memcpy(tv, &tv_in, sizeof(tv_in)); XSELECT(3, i, a_rs, a_ws, a_es, a_tv); - if (i > PATH_TRACING_FD) { + if (i > add_fd) { printf("%s(%d, [%d %d], [%d %d %d %d], [%d]" ", {tv_sec=%lld, tv_usec=%llu}) = 3 (out [1 2 %d]" ", left {tv_sec=%lld, tv_usec=%llu})\n", TEST_SYSCALL_STR, i, fds[0], fds[1], - 1, 2, fds[0], fds[1], PATH_TRACING_FD, + 1, 2, fds[0], fds[1], add_fd, (long long) tv_in.tv_sec, zero_extend_signed_to_ull(tv_in.tv_usec), fds[1], @@ -297,7 +329,7 @@ main(void) zero_extend_signed_to_ull(tv->tv_usec)); } -#endif /* PATH_TRACING_FD */ +#endif /* !PATH_TRACING_FD && !TRACING_FD */ } /* @@ -307,7 +339,7 @@ main(void) static fd_set set[0x1000000 / sizeof(fd_set)]; FD_SET(fds[1], set); XSELECT(-1, -1U, 0, (uintptr_t) set, 0, 0); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(-1, NULL, %p, NULL, NULL) = %s\n", TEST_SYSCALL_STR, set, errstr); #endif @@ -329,22 +361,22 @@ main(void) tv->tv_sec = 0; tv->tv_usec = 10 + (i - FD_SETSIZE); XSELECT(0, i, a_big_rs, a_big_ws, 0, a_tv); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d], [], NULL, {tv_sec=0, tv_usec=%d})" " = 0 (Timeout)\n", TEST_SYSCALL_STR, i, fds[0], 10 + (i - FD_SETSIZE)); #else FD_SET(fds[0], big_rs); - FD_SET(PATH_TRACING_FD, big_rs); + FD_SET(add_fd, big_rs); tv->tv_sec = 0; tv->tv_usec = 10 + (i - FD_SETSIZE); XSELECT(1, i, a_big_rs, a_big_ws, 0, a_tv); printf("%s(%d, [%d %d], [], NULL, {tv_sec=0, tv_usec=%d})" " = 1 (in [%d], left {tv_sec=0, tv_usec=%llu})\n", - TEST_SYSCALL_STR, i, fds[0], PATH_TRACING_FD, - 10 + (i - FD_SETSIZE), PATH_TRACING_FD, + TEST_SYSCALL_STR, i, fds[0], add_fd, + 10 + (i - FD_SETSIZE), add_fd, zero_extend_signed_to_ull(tv->tv_usec)); -#endif /* PATH_TRACING_FD */ +#endif /* !PATH_TRACING_FD && !TRACING_FD */ } /* @@ -356,35 +388,41 @@ main(void) tv->tv_usec = 123; XSELECT(0, INT_MAX, (uintptr_t) set, (uintptr_t) &set[1], (uintptr_t) &set[2], a_tv); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d %d], [], [], {tv_sec=0, tv_usec=123})" " = 0 (Timeout)\n", TEST_SYSCALL_STR, INT_MAX, fds[0], fds[1]); #else FD_SET(fds[0], set); FD_SET(fds[1], set); - FD_SET(PATH_TRACING_FD, set); + FD_SET(add_fd, set); tv->tv_sec = 0; tv->tv_usec = 123; XSELECT(1, INT_MAX, (uintptr_t) set, (uintptr_t) &set[1], (uintptr_t) &set[2], a_tv); printf("%s(%d, [%d %d %d], [], [], {tv_sec=0, tv_usec=123})" " = 1 (in [%d], left {tv_sec=0, tv_usec=%llu})\n", - TEST_SYSCALL_STR, INT_MAX, fds[0], fds[1], PATH_TRACING_FD, - PATH_TRACING_FD, zero_extend_signed_to_ull(tv->tv_usec)); -#endif /* PATH_TRACING_FD */ + TEST_SYSCALL_STR, INT_MAX, fds[0], fds[1], add_fd, + add_fd, zero_extend_signed_to_ull(tv->tv_usec)); +#endif /* !PATH_TRACING_FD && !TRACING_FD */ /* * Small sets, nfds exceeds FD_SETSIZE limit. * The kernel seems to be fine with it but strace cannot follow. */ *l_rs = (1UL << fds[0]) | (1UL << fds[1]) +#ifdef TRACING_FD + | (1UL << TRACING_FD) +#endif #ifdef PATH_TRACING_FD | (1UL << PATH_TRACING_FD) #endif ; *l_ws = (1UL << fds[0]); *l_es = (1UL << fds[0]) | (1UL << fds[1]) +#ifdef TRACING_FD + | (1UL << TRACING_FD) +#endif #ifdef PATH_TRACING_FD | (1UL << PATH_TRACING_FD) #endif @@ -393,12 +431,12 @@ main(void) tv->tv_usec = 123; rc = xselect(FD_SETSIZE + 1, a_rs, a_ws, a_es, a_tv); if (rc < 0) { -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, %p, %p, %p, {tv_sec=0, tv_usec=123}) = %s\n", TEST_SYSCALL_STR, FD_SETSIZE + 1, rs, ws, es, errstr); #endif } else { -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, %p, %p, %p, {tv_sec=0, tv_usec=123})" " = 0 (Timeout)\n", TEST_SYSCALL_STR, FD_SETSIZE + 1, rs, ws, es); @@ -410,13 +448,18 @@ main(void) */ if (dup2(fds[1], smallset_size) != smallset_size) perror_msg_and_fail("dup2"); +#ifdef TRACING_FD + FD_SET(TRACING_FD, rs); + FD_SET(TRACING_FD, ws); + FD_SET(TRACING_FD, es); +#endif #ifdef PATH_TRACING_FD FD_SET(PATH_TRACING_FD, rs); FD_SET(PATH_TRACING_FD, ws); FD_SET(PATH_TRACING_FD, es); #endif XSELECT(-1, smallset_size + 1, a_rs, a_ws, a_es, 0); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, %p, %p, %p, NULL) = %s\n", TEST_SYSCALL_STR, smallset_size + 1, rs, ws, es, errstr); #endif @@ -432,22 +475,22 @@ main(void) FD_SET(fds[1], big_ws); FD_SET(smallset_size, big_ws); XSELECT(-1, smallset_size + 1, a_big_rs, a_big_ws, a_es, 0); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, [%d %d], [%d %d], %p, NULL) = %s\n", TEST_SYSCALL_STR, smallset_size + 1, fds[0], smallset_size, fds[1], smallset_size, es, errstr); -#endif /* !PATH_TRACING_FD */ +#endif /* !PATH_TRACING_FD && !TRACING_FD */ XSELECT(-1, smallset_size + 1, a_es, a_big_ws, a_big_rs, 0); -#ifndef PATH_TRACING_FD +#if !defined(PATH_TRACING_FD) && !defined(TRACING_FD) printf("%s(%d, %p, [%d %d], [%d %d], NULL) = %s\n", TEST_SYSCALL_STR, smallset_size + 1, es, fds[1], smallset_size, fds[0], smallset_size, errstr); -#endif /* !PATH_TRACING_FD */ +#endif /* !PATH_TRACING_FD && !TRACING_FD */ puts("+++ exited with 0 +++"); return 0; |