Mercurial > gnulib
annotate tests/test-passfd.c @ 17356:639f60219717
tests: make it easier to bypass alarm time in debugger
While auditing alarm usage, I noticed that test-regex had a nice
idiom that made it easier to disable an alarm under glibc. Use
it elsewhere, so future copy-and-paste will preserve the idiom.
* tests/test-file-has-acl.c (main): Allow gdb to override alarm.
* tests/test-memmem.c (main): Likewise.
* tests/test-passfd.c (main): Likewise.
* tests/test-ptsname.c (main): Likewise.
* tests/test-ptsname_r.c (main): Likewise.
* tests/test-strcasestr.c (main): Likewise.
* tests/test-strstr.c (main): Likewise.
Signed-off-by: Eric Blake <eblake@redhat.com>
author | Eric Blake <eblake@redhat.com> |
---|---|
date | Mon, 11 Mar 2013 15:40:32 -0600 |
parents | e542fd46ad6f |
children | c67bafa8ca26 |
rev | line source |
---|---|
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
1 /* Test of passing file descriptors. |
17249
e542fd46ad6f
maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents:
16201
diff
changeset
|
2 Copyright (C) 2011-2013 Free Software Foundation, Inc. |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
3 |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
4 This program is free software: you can redistribute it and/or modify |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
5 it under the terms of the GNU General Public License as published by |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
6 the Free Software Foundation; either version 3 of the License, or |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
7 (at your option) any later version. |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
8 |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
9 This program is distributed in the hope that it will be useful, |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
10 but WITHOUT ANY WARRANTY; without even the implied warranty of |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
12 GNU General Public License for more details. |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
13 |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
14 You should have received a copy of the GNU General Public License |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
16 |
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
17 #include <config.h> |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
18 |
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
19 #include "passfd.h" |
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
20 |
14599
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
21 #include <errno.h> |
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
22 #include <fcntl.h> |
14508
6bacc85ddf06
passfd: fix incorrect sendmsg arguments
Eric Blake <eblake@redhat.com>
parents:
14425
diff
changeset
|
23 #include <signal.h> |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
24 #include <stdlib.h> |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
25 #include <stdio.h> |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
26 #include <unistd.h> |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
27 #include <sys/types.h> |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
28 #include <sys/socket.h> |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
29 #include <sys/stat.h> |
14425
94b18c3c925d
passfd test: Fix warnings.
Bruno Haible <bruno@clisp.org>
parents:
14424
diff
changeset
|
30 #include <sys/wait.h> |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
31 |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
32 #include "macros.h" |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
33 |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
34 int |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
35 main () |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
36 { |
14599
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
37 #if HAVE_SOCKETPAIR |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
38 int pair[2]; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
39 int ret; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
40 pid_t pid; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
41 int status; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
42 int fdnull; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
43 int fd; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
44 struct stat st; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
45 |
14599
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
46 # if HAVE_DECL_ALARM |
14508
6bacc85ddf06
passfd: fix incorrect sendmsg arguments
Eric Blake <eblake@redhat.com>
parents:
14425
diff
changeset
|
47 /* Avoid hanging on failure. */ |
17356
639f60219717
tests: make it easier to bypass alarm time in debugger
Eric Blake <eblake@redhat.com>
parents:
17249
diff
changeset
|
48 int alarm_value = 5; |
14508
6bacc85ddf06
passfd: fix incorrect sendmsg arguments
Eric Blake <eblake@redhat.com>
parents:
14425
diff
changeset
|
49 signal (SIGALRM, SIG_DFL); |
17356
639f60219717
tests: make it easier to bypass alarm time in debugger
Eric Blake <eblake@redhat.com>
parents:
17249
diff
changeset
|
50 alarm (alarm_value); |
14599
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
51 # endif |
14508
6bacc85ddf06
passfd: fix incorrect sendmsg arguments
Eric Blake <eblake@redhat.com>
parents:
14425
diff
changeset
|
52 |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
53 fdnull = open ("/dev/null", O_RDWR); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
54 if (fdnull < 0) |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
55 { |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
56 perror ("Could not open /dev/null"); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
57 return 1; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
58 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
59 |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
60 ret = socketpair (AF_UNIX, SOCK_STREAM, 0, pair); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
61 if (ret < 0) |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
62 { |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
63 perror ("socket pair failed"); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
64 return 2; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
65 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
66 |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
67 pid = fork (); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
68 if (pid == -1) |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
69 { |
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
70 perror ("fork"); |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
71 return 3; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
72 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
73 if (pid == 0) |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
74 { |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
75 ret = sendfd (pair[1], fdnull); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
76 if (ret == -1) |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
77 { |
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
78 perror ("sendfd"); |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
79 return 64; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
80 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
81 return 0; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
82 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
83 /* father */ |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
84 else |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
85 { |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
86 fd = recvfd (pair[0], 0); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
87 if (fd == -1) |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
88 { |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
89 perror ("recvfd"); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
90 return 16; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
91 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
92 ret = waitpid (pid, &status, 0); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
93 if (ret == -1) |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
94 { |
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
95 perror ("waitpid"); |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
96 return 17; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
97 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
98 ASSERT (ret == pid); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
99 |
14425
94b18c3c925d
passfd test: Fix warnings.
Bruno Haible <bruno@clisp.org>
parents:
14424
diff
changeset
|
100 if (!WIFEXITED (status)) |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
101 { |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
102 fprintf (stderr, "Child does not normally exit\n"); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
103 return 65; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
104 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
105 ret = WEXITSTATUS (status); |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
106 if (ret != 0) |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
107 { |
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
108 fprintf (stderr, "Send fd fail\n"); |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
109 return ret; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
110 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
111 |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
112 /* try to stat new fd */ |
14425
94b18c3c925d
passfd test: Fix warnings.
Bruno Haible <bruno@clisp.org>
parents:
14424
diff
changeset
|
113 ret = fstat (fd, &st); |
94b18c3c925d
passfd test: Fix warnings.
Bruno Haible <bruno@clisp.org>
parents:
14424
diff
changeset
|
114 if (ret < 0) |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
115 { |
14424
7be307034349
passfd module, part 4, tweaks.
Bruno Haible <bruno@clisp.org>
parents:
14423
diff
changeset
|
116 perror ("fstat"); |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
117 return 80; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
118 } |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
119 return 0; |
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
120 } |
14599
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
121 #else |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
122 errno = 0; |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
123 ASSERT(sendfd (0, 0) == -1); |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
124 ASSERT(errno == ENOSYS); |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
125 |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
126 errno = 0; |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
127 ASSERT(recvfd (0, 0) == -1); |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
128 ASSERT(errno == ENOSYS); |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
129 |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
130 fputs ("skipping test: socketpair not supported on this system\n", |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
131 stderr); |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
132 return 77; |
2a40136b85ae
passfd: allow compilation on mingw
Eric Blake <eblake@redhat.com>
parents:
14508
diff
changeset
|
133 #endif |
14423
1d050d935509
passfd module, part 4.
Bastien Roucariès <roucaries.bastien@gmail.com>
parents:
diff
changeset
|
134 } |