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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }