Mercurial > hg > octave-kai > gnulib-hg
annotate tests/test-posix_spawn1.c @ 16616:2f2ef742aa4b
New module 'exp2'.
* lib/math.in.h (exp2): New declaration.
* lib/exp2.c: New file.
* m4/exp2.m4: New file.
* m4/math_h.m4 (gl_MATH_H): Test whether exp2 is declared.
(gl_MATH_H_DEFAULTS): Initialize GNULIB_EXP2, HAVE_DECL_EXP2,
REPLACE_EXP2.
* modules/math (Makefile.am): Substitute GNULIB_EXP2, HAVE_DECL_EXP2,
REPLACE_EXP2.
* modules/exp2: New file.
* tests/test-math-c++.cc: Check the declaration of exp2.
* doc/posix-functions/exp2.texi: Mention the new module and the IRIX
and OpenBSD problems.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Wed, 07 Mar 2012 03:29:32 +0100 |
parents | 8250f2777afc |
children | 91a203d21bbc |
rev | line source |
---|---|
10547 | 1 /* Test of posix_spawn() function. |
16201
8250f2777afc
maint: update all copyright year number ranges
Jim Meyering <meyering@redhat.com>
parents:
14079
diff
changeset
|
2 Copyright (C) 2008-2012 Free Software Foundation, Inc. |
10547 | 3 |
4 This program is free software: you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 3 of the License, or | |
7 (at your option) any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
16 | |
17 /* Written by Bruno Haible <bruno@clisp.org>, 2008. */ | |
18 | |
19 #include <config.h> | |
20 | |
21 #include <spawn.h> | |
22 | |
12489 | 23 #include "signature.h" |
24 SIGNATURE_CHECK (posix_spawnp, int, (pid_t *, char const *, | |
25 posix_spawn_file_actions_t const *, | |
26 posix_spawnattr_t const *, | |
27 char *const[], char *const[])); | |
28 SIGNATURE_CHECK (posix_spawnattr_init, int, (posix_spawnattr_t *)); | |
29 SIGNATURE_CHECK (posix_spawnattr_destroy, int, (posix_spawnattr_t *)); | |
30 SIGNATURE_CHECK (posix_spawnattr_setsigmask, int, (posix_spawnattr_t *, | |
31 sigset_t const *)); | |
32 SIGNATURE_CHECK (posix_spawnattr_setflags, int, (posix_spawnattr_t *, short)); | |
33 SIGNATURE_CHECK (posix_spawn_file_actions_init, int, | |
34 (posix_spawn_file_actions_t *)); | |
35 SIGNATURE_CHECK (posix_spawn_file_actions_destroy, int, | |
36 (posix_spawn_file_actions_t *)); | |
37 SIGNATURE_CHECK (posix_spawn_file_actions_addclose, int, | |
38 (posix_spawn_file_actions_t *, int)); | |
39 SIGNATURE_CHECK (posix_spawn_file_actions_addopen, int, | |
40 (posix_spawn_file_actions_t *, int, char const *, int, | |
41 mode_t)); | |
42 SIGNATURE_CHECK (posix_spawn_file_actions_adddup2, int, | |
43 (posix_spawn_file_actions_t *, int, int)); | |
44 | |
10547 | 45 #include <errno.h> |
46 #include <fcntl.h> | |
47 #include <signal.h> | |
48 #include <stdbool.h> | |
49 #include <stdio.h> | |
50 #include <stdlib.h> | |
51 #include <string.h> | |
52 #include <unistd.h> | |
53 #include <sys/types.h> | |
54 #include <sys/wait.h> | |
55 | |
56 extern char **environ; | |
57 | |
58 #define CHILD_PROGRAM_FILENAME "test-posix_spawn1.sh" | |
59 | |
60 static int | |
61 fd_safer (int fd) | |
62 { | |
63 if (0 <= fd && fd <= 2) | |
64 { | |
65 int f = fd_safer (dup (fd)); | |
66 int e = errno; | |
67 close (fd); | |
68 errno = e; | |
69 fd = f; | |
70 } | |
71 | |
72 return fd; | |
10548 | 73 } |
10547 | 74 |
75 int | |
76 main () | |
77 { | |
78 char *argv[3] = { "/bin/sh", CHILD_PROGRAM_FILENAME, NULL }; | |
79 int ifd[2]; | |
80 sigset_t blocked_signals; | |
81 sigset_t fatal_signal_set; | |
82 posix_spawn_file_actions_t actions; | |
83 bool actions_allocated; | |
84 posix_spawnattr_t attrs; | |
85 bool attrs_allocated; | |
86 int err; | |
87 pid_t child; | |
88 int fd; | |
89 FILE *fp; | |
90 char line[80]; | |
91 int status; | |
92 int exitstatus; | |
93 | |
94 if (pipe (ifd) < 0 || (ifd[0] = fd_safer (ifd[0])) < 0) | |
95 { | |
96 perror ("cannot create pipe"); | |
97 exit (1); | |
98 } | |
99 sigprocmask (SIG_SETMASK, NULL, &blocked_signals); | |
100 sigemptyset (&fatal_signal_set); | |
101 sigaddset (&fatal_signal_set, SIGINT); | |
102 sigaddset (&fatal_signal_set, SIGTERM); | |
103 sigaddset (&fatal_signal_set, SIGHUP); | |
104 sigaddset (&fatal_signal_set, SIGPIPE); | |
105 sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL); | |
106 actions_allocated = false; | |
107 attrs_allocated = false; | |
108 if ((err = posix_spawn_file_actions_init (&actions)) != 0 | |
109 || (actions_allocated = true, | |
110 (err = posix_spawn_file_actions_adddup2 (&actions, ifd[1], STDOUT_FILENO)) != 0 | |
111 || (err = posix_spawn_file_actions_addclose (&actions, ifd[1])) != 0 | |
112 || (err = posix_spawn_file_actions_addclose (&actions, ifd[0])) != 0 | |
113 || (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, "/dev/null", O_RDONLY, 0)) != 0 | |
114 || (err = posix_spawnattr_init (&attrs)) != 0 | |
115 || (attrs_allocated = true, | |
116 (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0 | |
117 || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0) | |
118 || (err = posix_spawnp (&child, "/bin/sh", &actions, &attrs, argv, environ)) != 0)) | |
119 { | |
120 if (actions_allocated) | |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11049
diff
changeset
|
121 posix_spawn_file_actions_destroy (&actions); |
10547 | 122 if (attrs_allocated) |
12421
e8d2c6fc33ad
Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents:
11049
diff
changeset
|
123 posix_spawnattr_destroy (&attrs); |
10547 | 124 sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL); |
125 errno = err; | |
126 perror ("subprocess failed"); | |
127 exit (1); | |
128 } | |
129 posix_spawn_file_actions_destroy (&actions); | |
130 posix_spawnattr_destroy (&attrs); | |
131 sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL); | |
132 close (ifd[1]); | |
133 fd = ifd[0]; | |
134 fp = fdopen (fd, "r"); | |
135 if (fp == NULL) | |
136 { | |
137 fprintf (stderr, "fdopen() failed\n"); | |
138 exit (1); | |
139 } | |
140 if (fread (line, 1, 80, fp) < 12) | |
141 { | |
142 fprintf (stderr, "could not read expected output\n"); | |
143 exit (1); | |
144 } | |
145 if (memcmp (line, "Halle Potta", 11) != 0) | |
146 { | |
147 fprintf (stderr, "read output is not the expected output"); | |
148 exit (1); | |
149 } | |
150 fclose (fp); | |
151 status = 0; | |
152 while (waitpid (child, &status, 0) != child) | |
153 ; | |
154 if (!WIFEXITED (status)) | |
155 { | |
156 fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status); | |
157 exit (1); | |
158 } | |
159 exitstatus = WEXITSTATUS (status); | |
160 if (exitstatus != 0) | |
161 { | |
162 fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus); | |
163 exit (1); | |
164 } | |
165 return 0; | |
166 } |