Mercurial > hg > octave-shane > gnulib-hg
annotate tests/test-select.h @ 16935:498a2211d839
Write "Mac OS X" instead of "MacOS X".
* README: Write "Mac OS X" instead of "MacOS X".
* build-aux/bootstrap: Likewise.
* build-aux/install-reloc: Likewise.
* lib/acl-internal.h: Likewise.
* lib/acl_entries.c: Likewise.
* lib/argp-ba.c: Likewise.
* lib/argp-pv.c: Likewise.
* lib/config.charset: Likewise.
* lib/copy-acl.c: Likewise.
* lib/csharpexec.c: Likewise.
* lib/euidaccess.c: Likewise.
* lib/fbufmode.c: Likewise.
* lib/fflush.c: Likewise.
* lib/file-has-acl.c: Likewise.
* lib/filemode.h: Likewise.
* lib/fpurge.c: Likewise.
* lib/freadable.c: Likewise.
* lib/freadahead.c: Likewise.
* lib/freading.c: Likewise.
* lib/freadptr.c: Likewise.
* lib/freadseek.c: Likewise.
* lib/fseeko.c: Likewise.
* lib/fseterr.c: Likewise.
* lib/fsusage.c: Likewise.
* lib/fwritable.c: Likewise.
* lib/fwriting.c: Likewise.
* lib/get-rusage-as.c: Likewise.
* lib/get-rusage-data.c: Likewise.
* lib/getdomainname.c: Likewise.
* lib/idpriv-drop.c: Likewise.
* lib/idpriv-droptemp.c: Likewise.
* lib/localcharset.c: Likewise.
* lib/locale.in.h: Likewise.
* lib/localename.c: Likewise.
* lib/mbsrtowcs-state.c: Likewise.
* lib/nproc.c: Likewise.
* lib/passfd.c: Likewise.
* lib/posix_openpt.c: Likewise.
* lib/printf-parse.c: Likewise.
* lib/progreloc.c: Likewise.
* lib/safe-read.h: Likewise.
* lib/safe-write.h: Likewise.
* lib/sched.in.h: Likewise.
* lib/set-mode-acl.c: Likewise.
* lib/signal.in.h: Likewise.
* lib/stdint.in.h: Likewise.
* lib/stdio-impl.h: Likewise.
* lib/stdlib.in.h: Likewise.
* lib/strtod.c: Likewise.
* lib/sys_select.in.h: Likewise.
* lib/tcgetsid.c: Likewise.
* lib/unistd.in.h: Likewise.
* lib/unlockpt.c: Likewise.
* lib/vasnprintf.c: Likewise.
* lib/vma-iter.c: Likewise.
* lib/wcsrtombs-state.c: Likewise.
* m4/acl.m4: Likewise.
* m4/acosl.m4: Likewise.
* m4/asinl.m4: Likewise.
* m4/atanl.m4: Likewise.
* m4/c-stack.m4: Likewise.
* m4/cosl.m4: Likewise.
* m4/expl.m4: Likewise.
* m4/extensions.m4: Likewise.
* m4/fdatasync.m4: Likewise.
* m4/fmal.m4: Likewise.
* m4/frexp.m4: Likewise.
* m4/frexpf.m4: Likewise.
* m4/frexpl.m4: Likewise.
* m4/fsusage.m4: Likewise.
* m4/getdomainname.m4: Likewise.
* m4/getloadavg.m4: Likewise.
* m4/getopt.m4: Likewise.
* m4/gettext.m4: Likewise.
* m4/gnulib-common.m4: Likewise.
* m4/intdiv0.m4: Likewise.
* m4/intlmacosx.m4: Likewise.
* m4/largefile.m4: Likewise.
* m4/ldexpl.m4: Likewise.
* m4/link-follow.m4: Likewise.
* m4/locale-ar.m4: Likewise.
* m4/locale-fr.m4: Likewise.
* m4/locale-ja.m4: Likewise.
* m4/locale-tr.m4: Likewise.
* m4/locale-zh.m4: Likewise.
* m4/locale_h.m4: Likewise.
* m4/lock.m4: Likewise.
* m4/logl.m4: Likewise.
* m4/mathfunc.m4: Likewise.
* m4/minus-zero.m4: Likewise.
* m4/mktime.m4: Likewise.
* m4/mmap-anon.m4: Likewise.
* m4/multiarch.m4: Likewise.
* m4/nanosleep.m4: Likewise.
* m4/nocrash.m4: Likewise.
* m4/poll.m4: Likewise.
* m4/printf-frexpl.m4: Likewise.
* m4/printf.m4: Likewise.
* m4/signbit.m4: Likewise.
* m4/sinl.m4: Likewise.
* m4/sqrtl.m4: Likewise.
* m4/strerror_r.m4: Likewise.
* m4/tanl.m4: Likewise.
* m4/threadlib.m4: Likewise.
* m4/ttyname_r.m4: Likewise.
* m4/unlink.m4: Likewise.
* m4/visibility.m4: Likewise.
* m4/wcwidth.m4: Likewise.
* tests/minus-zero.h: Likewise.
* tests/test-alloca-opt.c: Likewise.
* tests/test-copy-acl.sh: Likewise.
* tests/test-copy-file.sh: Likewise.
* tests/test-fdatasync.c: Likewise.
* tests/test-file-has-acl.sh: Likewise.
* tests/test-flock.c: Likewise.
* tests/test-fsync.c: Likewise.
* tests/test-localename.c: Likewise.
* tests/test-malloca.c: Likewise.
* tests/test-nonblocking-pipe.h: Likewise.
* tests/test-nonblocking-socket.h: Likewise.
* tests/test-openpty.c: Likewise.
* tests/test-posix_openpt.c: Likewise.
* tests/test-ptsname.c: Likewise.
* tests/test-ptsname_r.c: Likewise.
* tests/test-sameacls.c: Likewise.
* tests/test-select.h: Likewise.
* tests/test-set-mode-acl.sh: Likewise.
* tests/test-snprintf-posix.h: Likewise.
* tests/test-sprintf-posix.h: Likewise.
* tests/test-strtod.c: Likewise.
* tests/test-time.c: Likewise.
* tests/test-vasnprintf-posix.c: Likewise.
* tests/test-vasprintf-posix.c: Likewise.
* doc/acl-resources.txt: Likewise.
* doc/**/*.texi: Likewise.
Reported by Max Horn <max@quendi.de>.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Fri, 22 Jun 2012 13:26:07 +0200 |
parents | ec738d6aeef5 |
children | 00956ff1864c |
rev | line source |
---|---|
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
1 /* Test of select() substitute. |
16201
8250f2777afc
maint: update all copyright year number ranges
Jim Meyering <meyering@redhat.com>
parents:
15735
diff
changeset
|
2 Copyright (C) 2008-2012 Free Software Foundation, Inc. |
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
3 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
4 This program is free software: you can redistribute it and/or modify |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
5 it under the terms of the GNU General Public License as published by |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
6 the Free Software Foundation; either version 3 of the License, or |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
7 (at your option) any later version. |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
8 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
9 This program is distributed in the hope that it will be useful, |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
10 but WITHOUT ANY WARRANTY; without even the implied warranty of |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
12 GNU General Public License for more details. |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
13 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
14 You should have received a copy of the GNU General Public License |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
16 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
17 /* Written by Paolo Bonzini, 2008. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
18 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
19 #include <stdio.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
20 #include <string.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
21 #include <netinet/in.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
22 #include <arpa/inet.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
23 #include <unistd.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
24 #include <fcntl.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
25 #include <stdlib.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
26 #include <stdbool.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
27 #include <sys/ioctl.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
28 #include <errno.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
29 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
30 #include "macros.h" |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
31 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
32 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
16214
ec738d6aeef5
Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
33 # define WINDOWS_NATIVE |
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
34 #endif |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
35 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
36 #ifdef HAVE_SYS_WAIT_H |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
37 # include <sys/wait.h> |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
38 #endif |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
39 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
40 #ifndef SO_REUSEPORT |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
41 # define SO_REUSEPORT SO_REUSEADDR |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
42 #endif |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
43 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
44 #define TEST_PORT 12345 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
45 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
46 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
47 typedef int (*select_fn) (int, fd_set *, fd_set *, fd_set *, struct timeval *); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
48 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
49 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
50 /* Minimal testing infrastructure. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
51 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
52 static int failures; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
53 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
54 static void |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
55 failed (const char *reason) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
56 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
57 if (++failures > 1) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
58 printf (" "); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
59 printf ("failed (%s)\n", reason); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
60 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
61 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
62 static int |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
63 test (void (*fn) (select_fn), select_fn my_select, const char *msg) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
64 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
65 failures = 0; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
66 printf ("%s... ", msg); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
67 fflush (stdout); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
68 fn (my_select); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
69 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
70 if (!failures) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
71 printf ("passed\n"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
72 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
73 return failures; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
74 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
75 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
76 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
77 /* Funny socket code. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
78 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
79 static int |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
80 open_server_socket (void) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
81 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
82 int s, x; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
83 struct sockaddr_in ia; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
84 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
85 s = socket (AF_INET, SOCK_STREAM, 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
86 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
87 memset (&ia, 0, sizeof (ia)); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
88 ia.sin_family = AF_INET; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
89 inet_pton (AF_INET, "127.0.0.1", &ia.sin_addr); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
90 ia.sin_port = htons (TEST_PORT); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
91 if (bind (s, (struct sockaddr *) &ia, sizeof (ia)) < 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
92 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
93 perror ("bind"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
94 exit (77); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
95 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
96 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
97 x = 1; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
98 setsockopt (s, SOL_SOCKET, SO_REUSEPORT, &x, sizeof (x)); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
99 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
100 if (listen (s, 1) < 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
101 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
102 perror ("listen"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
103 exit (77); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
104 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
105 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
106 return s; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
107 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
108 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
109 static int |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
110 connect_to_socket (bool blocking) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
111 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
112 int s; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
113 struct sockaddr_in ia; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
114 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
115 s = socket (AF_INET, SOCK_STREAM, 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
116 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
117 memset (&ia, 0, sizeof (ia)); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
118 ia.sin_family = AF_INET; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
119 inet_pton (AF_INET, "127.0.0.1", &ia.sin_addr); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
120 ia.sin_port = htons (TEST_PORT); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
121 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
122 if (!blocking) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
123 { |
16214
ec738d6aeef5
Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
124 #ifdef WINDOWS_NATIVE |
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
125 unsigned long iMode = 1; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
126 ioctl (s, FIONBIO, (char *) &iMode); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
127 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
128 #elif defined F_GETFL |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
129 int oldflags = fcntl (s, F_GETFL, NULL); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
130 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
131 if (!(oldflags & O_NONBLOCK)) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
132 fcntl (s, F_SETFL, oldflags | O_NONBLOCK); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
133 #endif |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
134 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
135 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
136 if (connect (s, (struct sockaddr *) &ia, sizeof (ia)) < 0 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
137 && (blocking || errno != EINPROGRESS)) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
138 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
139 perror ("connect"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
140 exit (77); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
141 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
142 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
143 return s; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
144 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
145 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
146 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
147 /* A slightly more convenient interface to select(2). |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
148 Waits until a specific event occurs on a file descriptor FD. |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
149 EV is a bit mask of events to look for: |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
150 SEL_IN - input can be polled without blocking, |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
151 SEL_OUT - output can be provided without blocking, |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
152 SEL_EXC - an exception occurred, |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
153 A maximum wait time is specified by TIMEOUT. |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
154 *TIMEOUT = { 0, 0 } means to return immediately, |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
155 TIMEOUT = NULL means to wait indefinitely. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
156 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
157 enum { SEL_IN = 1, SEL_OUT = 2, SEL_EXC = 4 }; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
158 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
159 static int |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
160 do_select (int fd, int ev, struct timeval *timeout, select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
161 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
162 fd_set rfds, wfds, xfds; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
163 int r, rev; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
164 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
165 FD_ZERO (&rfds); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
166 FD_ZERO (&wfds); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
167 FD_ZERO (&xfds); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
168 if (ev & SEL_IN) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
169 FD_SET (fd, &rfds); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
170 if (ev & SEL_OUT) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
171 FD_SET (fd, &wfds); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
172 if (ev & SEL_EXC) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
173 FD_SET (fd, &xfds); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
174 r = my_select (fd + 1, &rfds, &wfds, &xfds, timeout); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
175 if (r < 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
176 return r; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
177 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
178 rev = 0; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
179 if (FD_ISSET (fd, &rfds)) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
180 rev |= SEL_IN; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
181 if (FD_ISSET (fd, &wfds)) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
182 rev |= SEL_OUT; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
183 if (FD_ISSET (fd, &xfds)) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
184 rev |= SEL_EXC; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
185 if (rev && r == 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
186 failed ("select returned 0"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
187 if (rev & ~ev) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
188 failed ("select returned unrequested events"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
189 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
190 return rev; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
191 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
192 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
193 static int |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
194 do_select_nowait (int fd, int ev, select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
195 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
196 struct timeval tv0; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
197 tv0.tv_sec = 0; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
198 tv0.tv_usec = 0; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
199 return do_select (fd, ev, &tv0, my_select); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
200 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
201 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
202 static int |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
203 do_select_wait (int fd, int ev, select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
204 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
205 return do_select (fd, ev, NULL, my_select); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
206 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
207 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
208 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
209 /* Test select(2) for TTYs. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
210 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
211 #ifdef INTERACTIVE |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
212 static void |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
213 test_tty (select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
214 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
215 if (do_select_nowait (0, SEL_IN, my_select) != 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
216 failed ("can read"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
217 if (do_select_nowait (0, SEL_OUT, my_select) == 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
218 failed ("cannot write"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
219 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
220 if (do_select_wait (0, SEL_IN, my_select) == 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
221 failed ("return with infinite timeout"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
222 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
223 getchar (); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
224 if (do_select_nowait (0, SEL_IN, my_select) != 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
225 failed ("can read after getc"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
226 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
227 #endif |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
228 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
229 |
15726
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
230 /* Test select(2) on invalid file descriptors. */ |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
231 |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
232 static int |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
233 do_select_bad_fd (int fd, int ev, struct timeval *timeout, select_fn my_select) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
234 { |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
235 fd_set rfds, wfds, xfds; |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
236 |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
237 FD_ZERO (&rfds); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
238 FD_ZERO (&wfds); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
239 FD_ZERO (&xfds); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
240 if (ev & SEL_IN) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
241 FD_SET (fd, &rfds); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
242 if (ev & SEL_OUT) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
243 FD_SET (fd, &wfds); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
244 if (ev & SEL_EXC) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
245 FD_SET (fd, &xfds); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
246 return my_select (fd + 1, &rfds, &wfds, &xfds, timeout); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
247 /* In this case, when fd is invalid, on some platforms, the bit for fd |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
248 is left alone in the fd_set, whereas on other platforms it is cleared. |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
249 So, don't check the bit for fd here. */ |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
250 } |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
251 |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
252 static int |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
253 do_select_bad_fd_nowait (int fd, int ev, select_fn my_select) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
254 { |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
255 struct timeval tv0; |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
256 tv0.tv_sec = 0; |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
257 tv0.tv_usec = 0; |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
258 return do_select_bad_fd (fd, ev, &tv0, my_select); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
259 } |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
260 |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
261 static void |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
262 test_bad_fd (select_fn my_select) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
263 { |
15735
8a33129afa20
select tests: Avoid test failures on OSF/1 5.1 and mingw.
Bruno Haible <bruno@clisp.org>
parents:
15726
diff
changeset
|
264 /* This tests fails on OSF/1 and native Windows, even with fd = 16. */ |
16214
ec738d6aeef5
Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
265 #if !(defined __osf__ || defined WINDOWS_NATIVE) |
15726
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
266 int fd; |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
267 |
16935
498a2211d839
Write "Mac OS X" instead of "MacOS X".
Bruno Haible <bruno@clisp.org>
parents:
16214
diff
changeset
|
268 /* On Linux, Mac OS X, *BSD, values of fd like 99 or 399 are discarded |
15735
8a33129afa20
select tests: Avoid test failures on OSF/1 5.1 and mingw.
Bruno Haible <bruno@clisp.org>
parents:
15726
diff
changeset
|
269 by the kernel early and therefore do *not* lead to EBADF, as required |
8a33129afa20
select tests: Avoid test failures on OSF/1 5.1 and mingw.
Bruno Haible <bruno@clisp.org>
parents:
15726
diff
changeset
|
270 by POSIX. */ |
8a33129afa20
select tests: Avoid test failures on OSF/1 5.1 and mingw.
Bruno Haible <bruno@clisp.org>
parents:
15726
diff
changeset
|
271 # if defined __linux__ || (defined __APPLE__ && defined __MACH__) || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ |
15726
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
272 fd = 16; |
15735
8a33129afa20
select tests: Avoid test failures on OSF/1 5.1 and mingw.
Bruno Haible <bruno@clisp.org>
parents:
15726
diff
changeset
|
273 # else |
15726
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
274 fd = 99; |
15735
8a33129afa20
select tests: Avoid test failures on OSF/1 5.1 and mingw.
Bruno Haible <bruno@clisp.org>
parents:
15726
diff
changeset
|
275 # endif |
15726
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
276 |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
277 if (do_select_bad_fd_nowait (fd, SEL_IN, my_select) == 0 || errno != EBADF) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
278 failed ("invalid fd among rfds"); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
279 if (do_select_bad_fd_nowait (fd, SEL_OUT, my_select) == 0 || errno != EBADF) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
280 failed ("invalid fd among wfds"); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
281 if (do_select_bad_fd_nowait (fd, SEL_EXC, my_select) == 0 || errno != EBADF) |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
282 failed ("invalid fd among xfds"); |
15735
8a33129afa20
select tests: Avoid test failures on OSF/1 5.1 and mingw.
Bruno Haible <bruno@clisp.org>
parents:
15726
diff
changeset
|
283 #endif |
15726
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
284 } |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
285 |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
286 |
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
287 /* Test select(2) for unconnected nonblocking sockets. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
288 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
289 static void |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
290 test_connect_first (select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
291 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
292 int s = open_server_socket (); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
293 struct sockaddr_in ia; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
294 socklen_t addrlen; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
295 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
296 int c1, c2; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
297 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
298 if (do_select_nowait (s, SEL_IN | SEL_EXC, my_select) != 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
299 failed ("can read, socket not connected"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
300 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
301 c1 = connect_to_socket (false); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
302 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
303 if (do_select_wait (s, SEL_IN | SEL_EXC, my_select) != SEL_IN) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
304 failed ("expecting readability on passive socket"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
305 if (do_select_nowait (s, SEL_IN | SEL_EXC, my_select) != SEL_IN) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
306 failed ("expecting readability on passive socket"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
307 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
308 addrlen = sizeof (ia); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
309 c2 = accept (s, (struct sockaddr *) &ia, &addrlen); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
310 ASSERT (close (s) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
311 ASSERT (close (c1) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
312 ASSERT (close (c2) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
313 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
314 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
315 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
316 /* Test select(2) for unconnected blocking sockets. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
317 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
318 static void |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
319 test_accept_first (select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
320 { |
16214
ec738d6aeef5
Talk about "native Windows API", not "Win32".
Bruno Haible <bruno@clisp.org>
parents:
16201
diff
changeset
|
321 #ifndef WINDOWS_NATIVE |
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
322 int s = open_server_socket (); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
323 struct sockaddr_in ia; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
324 socklen_t addrlen; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
325 char buf[3]; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
326 int c, pid; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
327 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
328 pid = fork (); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
329 if (pid < 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
330 return; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
331 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
332 if (pid == 0) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
333 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
334 addrlen = sizeof (ia); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
335 c = accept (s, (struct sockaddr *) &ia, &addrlen); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
336 ASSERT (close (s) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
337 ASSERT (write (c, "foo", 3) == 3); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
338 ASSERT (read (c, buf, 3) == 3); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
339 shutdown (c, SHUT_RD); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
340 ASSERT (close (c) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
341 exit (0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
342 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
343 else |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
344 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
345 ASSERT (close (s) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
346 c = connect_to_socket (true); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
347 if (do_select_nowait (c, SEL_OUT, my_select) != SEL_OUT) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
348 failed ("cannot write after blocking connect"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
349 ASSERT (write (c, "foo", 3) == 3); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
350 wait (&pid); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
351 if (do_select_wait (c, SEL_IN, my_select) != SEL_IN) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
352 failed ("cannot read data left in the socket by closed process"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
353 ASSERT (read (c, buf, 3) == 3); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
354 ASSERT (write (c, "foo", 3) == 3); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
355 (void) close (c); /* may fail with errno = ECONNRESET */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
356 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
357 #endif |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
358 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
359 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
360 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
361 /* Common code for pipes and connected sockets. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
362 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
363 static void |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
364 test_pair (int rd, int wd, select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
365 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
366 char buf[3]; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
367 if (do_select_wait (wd, SEL_IN | SEL_OUT | SEL_EXC, my_select) != SEL_OUT) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
368 failed ("expecting writability before writing"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
369 if (do_select_nowait (wd, SEL_IN | SEL_OUT | SEL_EXC, my_select) != SEL_OUT) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
370 failed ("expecting writability before writing"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
371 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
372 ASSERT (write (wd, "foo", 3) == 3); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
373 if (do_select_wait (rd, SEL_IN, my_select) != SEL_IN) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
374 failed ("expecting readability after writing"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
375 if (do_select_nowait (rd, SEL_IN, my_select) != SEL_IN) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
376 failed ("expecting readability after writing"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
377 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
378 ASSERT (read (rd, buf, 3) == 3); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
379 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
380 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
381 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
382 /* Test select(2) on connected sockets. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
383 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
384 static void |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
385 test_socket_pair (select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
386 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
387 struct sockaddr_in ia; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
388 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
389 socklen_t addrlen = sizeof (ia); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
390 int s = open_server_socket (); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
391 int c1 = connect_to_socket (false); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
392 int c2 = accept (s, (struct sockaddr *) &ia, &addrlen); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
393 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
394 ASSERT (close (s) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
395 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
396 test_pair (c1, c2, my_select); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
397 ASSERT (close (c1) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
398 ASSERT (write (c2, "foo", 3) == 3); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
399 (void) close (c2); /* may fail with errno = ECONNRESET */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
400 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
401 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
402 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
403 /* Test select(2) on pipes. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
404 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
405 static void |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
406 test_pipe (select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
407 { |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
408 int fd[2]; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
409 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
410 ASSERT (pipe (fd) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
411 test_pair (fd[0], fd[1], my_select); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
412 ASSERT (close (fd[0]) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
413 ASSERT (close (fd[1]) == 0); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
414 } |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
415 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
416 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
417 /* Do them all. */ |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
418 |
15459
1b5ac5980a11
test-select.h: avoid warning from gcc's -Wmissing-declarations
Jim Meyering <meyering@redhat.com>
parents:
15445
diff
changeset
|
419 static int |
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
420 test_function (select_fn my_select) |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
421 { |
15726
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
422 int result = 0; |
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
423 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
424 #ifdef INTERACTIVE |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
425 printf ("Please press Enter\n"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
426 test (test_tty, "TTY", my_select); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
427 #endif |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
428 |
15726
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
429 result += test (test_bad_fd, my_select, "Invalid fd test"); |
1a3894d5ce47
select tests: EBADF tests.
Bruno Haible <bruno@clisp.org>
parents:
15459
diff
changeset
|
430 result += test (test_connect_first, my_select, "Unconnected socket test"); |
15445
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
431 result += test (test_socket_pair, my_select, "Connected sockets test"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
432 result += test (test_accept_first, my_select, "General socket test with fork"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
433 result += test (test_pipe, my_select, "Pipe test"); |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
434 |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
435 return result; |
78d76c49295d
select tests, pselect tests: Refactor.
Bruno Haible <bruno@clisp.org>
parents:
diff
changeset
|
436 } |