Mercurial > hg > octave-nkf > gnulib-hg
changeset 11863:3c373e41abb3
test-popen-safer: split from test-popen
* tests/test-popen.c (main): Move...
* tests/test-popen.h: ...into new file.
* tests/test-popen-safer2.c: New file.
* modules/popen-tests (Files): Add test-popen.h.
* modules/popen-safer-tests (Files): Add test-popen-safer2.c.
Suggested by Bruno Haible.
Signed-off-by: Eric Blake <ebb9@byu.net>
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Fri, 21 Aug 2009 07:22:12 -0600 |
parents | 1cbf6c0e3f4d |
children | c4042b126df3 |
files | ChangeLog modules/popen-safer-tests modules/popen-tests tests/test-popen-safer2.c tests/test-popen.c tests/test-popen.h |
diffstat | 6 files changed, 141 insertions(+), 89 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2009-08-21 Eric Blake <ebb9@byu.net> + test-popen-safer: split from test-popen + * tests/test-popen.c (main): Move... + * tests/test-popen.h: ...into new file. + * tests/test-popen-safer2.c: New file. + * modules/popen-tests (Files): Add test-popen.h. + * modules/popen-safer-tests (Files): Add test-popen-safer2.c. + Suggested by Bruno Haible. + test-fcntl-safer: split from test-open * tests/test-open.c (main): Move... * tests/test-open.h: ...into new file.
--- a/modules/popen-safer-tests +++ b/modules/popen-safer-tests @@ -1,5 +1,7 @@ Files: +tests/test-popen.h tests/test-popen-safer.c +tests/test-popen-safer2.c Depends-on: dup2 @@ -8,5 +10,5 @@ configure.ac: Makefile.am: -TESTS += test-popen-safer -check_PROGRAMS += test-popen-safer +TESTS += test-popen-safer test-popen-safer2 +check_PROGRAMS += test-popen-safer test-popen-safer2
--- a/modules/popen-tests +++ b/modules/popen-tests @@ -1,4 +1,5 @@ Files: +tests/test-popen.h tests/test-popen.c Depends-on:
new file mode 100644 --- /dev/null +++ b/tests/test-popen-safer2.c @@ -0,0 +1,24 @@ +/* Test of opening a subcommand stream. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* Written by Eric Blake <ebb9@byu.net>, 2009. */ + +#include <config.h> + +/* Specification. */ +#include "stdio--.h" + +#include "test-popen.h"
--- a/tests/test-popen.c +++ b/tests/test-popen.c @@ -21,90 +21,4 @@ /* Specification. */ #include <stdio.h> -/* Helpers. */ -#include <stdlib.h> -#include <string.h> -#include <sys/wait.h> -#include <unistd.h> - -#if GNULIB_POPEN_SAFER -# include "stdio--.h" -#endif - -#define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ - fflush (stderr); \ - abort (); \ - } \ - } \ - while (0) - -int -main (int argc, char **argv) -{ - size_t len; - char *cmd; - int i; - - /* Children - use the pipe. */ - if (argc > 1) - { - if (*argv[1] == 'r') /* Parent is reading, so we write. */ - ASSERT (putchar ('c') == 'c'); - else /* Parent is writing, so we read. */ - ASSERT (getchar () == 'p'); - /* Test that parent can read non-zero status. */ - return 42; - } - - /* Parent - create read and write child, once under normal - circumstances and once with stdin and stdout closed. */ - len = strlen (argv[0]); - cmd = malloc (len + 3); /* Adding " r" and NUL. */ - ASSERT (cmd); - /* We count on argv[0] not containing any shell metacharacters. */ - strcpy (cmd, argv[0]); - cmd[len] = ' '; - cmd[len + 2] = '\0'; - for (i = 0; i < 2; i++) - { - FILE *child; - int status; - - if (i) - { - ASSERT (fclose (stdin) == 0); - ASSERT (fclose (stdout) == 0); - } - - cmd[len + 1] = 'r'; - ASSERT (child = popen (cmd, "r")); - ASSERT (fgetc (child) == 'c'); - status = pclose (child); - ASSERT (WIFEXITED (status)); - ASSERT (WEXITSTATUS (status) == 42); - if (i) - { - ASSERT (dup2 (STDIN_FILENO, STDIN_FILENO) == -1); - ASSERT (dup2 (STDOUT_FILENO, STDOUT_FILENO) == -1); - } - - cmd[len + 1] = 'w'; - ASSERT (child = popen (cmd, "w")); - ASSERT (fputc ('p', child) == 'p'); - status = pclose (child); - ASSERT (WIFEXITED (status)); - ASSERT (WEXITSTATUS (status) == 42); - if (i) - { - ASSERT (dup2 (STDIN_FILENO, STDIN_FILENO) == -1); - ASSERT (dup2 (STDOUT_FILENO, STDOUT_FILENO) == -1); - } - } - free (cmd); - return 0; -} +#include "test-popen.h"
new file mode 100644 --- /dev/null +++ b/tests/test-popen.h @@ -0,0 +1,103 @@ +/* Test of opening a subcommand stream. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* Written by Eric Blake <ebb9@byu.net>, 2009. */ + +/* Include <config.h> and a form of <stdio.h> first. */ + +/* Helpers. */ +#include <stdlib.h> +#include <string.h> +#include <sys/wait.h> +#include <unistd.h> + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + +int +main (int argc, char **argv) +{ + size_t len; + char *cmd; + int i; + + /* Children - use the pipe. */ + if (argc > 1) + { + if (*argv[1] == 'r') /* Parent is reading, so we write. */ + ASSERT (putchar ('c') == 'c'); + else /* Parent is writing, so we read. */ + ASSERT (getchar () == 'p'); + /* Test that parent can read non-zero status. */ + return 42; + } + + /* Parent - create read and write child, once under normal + circumstances and once with stdin and stdout closed. */ + len = strlen (argv[0]); + cmd = malloc (len + 3); /* Adding " r" and NUL. */ + ASSERT (cmd); + /* We count on argv[0] not containing any shell metacharacters. */ + strcpy (cmd, argv[0]); + cmd[len] = ' '; + cmd[len + 2] = '\0'; + for (i = 0; i < 2; i++) + { + FILE *child; + int status; + + if (i) + { + ASSERT (fclose (stdin) == 0); + ASSERT (fclose (stdout) == 0); + } + + cmd[len + 1] = 'r'; + ASSERT (child = popen (cmd, "r")); + ASSERT (fgetc (child) == 'c'); + status = pclose (child); + ASSERT (WIFEXITED (status)); + ASSERT (WEXITSTATUS (status) == 42); + if (i) + { + ASSERT (dup2 (STDIN_FILENO, STDIN_FILENO) == -1); + ASSERT (dup2 (STDOUT_FILENO, STDOUT_FILENO) == -1); + } + + cmd[len + 1] = 'w'; + ASSERT (child = popen (cmd, "w")); + ASSERT (fputc ('p', child) == 'p'); + status = pclose (child); + ASSERT (WIFEXITED (status)); + ASSERT (WEXITSTATUS (status) == 42); + if (i) + { + ASSERT (dup2 (STDIN_FILENO, STDIN_FILENO) == -1); + ASSERT (dup2 (STDOUT_FILENO, STDOUT_FILENO) == -1); + } + } + free (cmd); + return 0; +}