+++ /dev/null
-BEGIN {
- r[1] = "^p?select6?\\(2, \\[0 1\\], \\[0 1\\], \\[0 1\\], NULL(, 0)?\\) += 1 \\(\\)$"
- r[2] = "^p?select6?\\(-1, NULL, 0x[0-9a-f]+, NULL, NULL(, 0)?\\) += -1 "
- r[3] = "^p?select6?\\(1025, \\[0\\], \\[\\], NULL, \\{0, 100(000)?\\}(, 0)?\\) += 0 \\(Timeout\\)$"
- s[4] = "+++ exited with 0 +++"
-
- lines = 4
- fail = 0
-}
-
-@include "match.awk"
* Based on test by Dr. David Alan Gilbert <dave@treblig.org>
*/
#include <assert.h>
+#include <stdio.h>
+#include <string.h>
#include <unistd.h>
#include <sys/select.h>
static fd_set set[0x1000000 / sizeof(fd_set)];
-int main()
+int main(int ac, char **av)
{
int fds[2];
struct timeval timeout = { .tv_sec = 0, .tv_usec = 100 };
+ int is_select = ac < 2 || strcmp(av[1], "pselect6");
- (void) close(0);
- (void) close(1);
assert(pipe(fds) == 0);
/*
* Start with a nice simple select.
*/
FD_ZERO(set);
- FD_SET(0, set);
- FD_SET(1, set);
- assert(select(2, set, set, set, NULL) == 1);
+ FD_SET(fds[0], set);
+ FD_SET(fds[1], set);
+ assert(select(fds[1] + 1, set, set, set, NULL) == 1);
+ if (is_select)
+ printf("select(%d, [%d %d], [%d %d], [%d %d], NULL) = 1 ()\n",
+ fds[1] + 1, fds[0], fds[1],
+ fds[0], fds[1], fds[0], fds[1]);
+ else
+ printf("pselect6(%d, [%d %d], [%d %d], [%d %d], NULL, NULL) "
+ "= 1 ()\n",
+ fds[1] + 1, fds[0], fds[1],
+ fds[0], fds[1], fds[0], fds[1]);
/*
* Now the crash case that trinity found, negative nfds
* but with a pointer to a large chunk of valid memory.
*/
FD_ZERO(set);
- FD_SET(1,set);
+ FD_SET(fds[1],set);
assert(select(-1, NULL, set, NULL, NULL) == -1);
+ if (is_select)
+ printf("select(-1, NULL, %p, NULL, NULL) "
+ "= -1 EINVAL (Invalid argument)\n", set);
+ else
+ printf("pselect6(-1, NULL, %p, NULL, NULL, NULL) "
+ "= -1 EINVAL (Invalid argument)\n", set);
/*
* Another variant, with nfds exceeding FD_SETSIZE limit.
*/
FD_ZERO(set);
- FD_SET(0,set);
+ FD_SET(fds[0],set);
assert(select(FD_SETSIZE + 1, set, set + 1, NULL, &timeout) == 0);
+ if (is_select)
+ printf("select(%d, [%d], [], NULL, {0, 100}) = 0 (Timeout)\n",
+ FD_SETSIZE + 1, fds[0]);
+ else
+ printf("pselect6(%d, [%d], [], NULL, {0, 100000}, NULL) "
+ "= 0 (Timeout)\n", FD_SETSIZE + 1, fds[0]);
+ puts("+++ exited with 0 +++");
return 0;
}
#!/bin/sh
-# Check select syscall decoding.
+# Check select/pselect6 syscall decoding.
. "${srcdir=.}/init.sh"
-syscall=
-$STRACE -epselect6 -h > /dev/null && syscall=$syscall,pselect6
-$STRACE -eselect -h > /dev/null && syscall=$syscall,select
-test -n "$syscall" ||
- fail_ 'neither select not pselect6 syscall is supported on this architecture'
+exe="./${ME_%.test}"
+syscall=select
+run_prog "$exe" $syscall > /dev/null
+run_strace $args > /dev/null
-run_prog
-run_strace -e$syscall $args
-match_awk
+check_prog grep
+if LC_ALL=C grep -x "pselect6(.*" "$LOG" > /dev/null; then
+ syscall=pselect6
+ run_prog "$exe" $syscall > /dev/null
+fi
+
+OUT="$LOG.out"
+run_strace -a36 -e$syscall $args > "$OUT"
+match_diff "$OUT" "$LOG"
+rm -f "$OUT"
exit 0