# HG changeset patch # User Eric Blake # Date 1250860932 21600 # Node ID 3c373e41abb30e157001ee76b60fedc12b175cc2 # Parent 1cbf6c0e3f4d65a8b148c7006c10e21c55258e59 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 diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2009-08-21 Eric Blake + 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. diff --git a/modules/popen-safer-tests b/modules/popen-safer-tests --- 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 diff --git a/modules/popen-tests b/modules/popen-tests --- a/modules/popen-tests +++ b/modules/popen-tests @@ -1,4 +1,5 @@ Files: +tests/test-popen.h tests/test-popen.c Depends-on: diff --git a/tests/test-popen-safer2.c b/tests/test-popen-safer2.c 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 . */ + +/* Written by Eric Blake , 2009. */ + +#include + +/* Specification. */ +#include "stdio--.h" + +#include "test-popen.h" diff --git a/tests/test-popen.c b/tests/test-popen.c --- a/tests/test-popen.c +++ b/tests/test-popen.c @@ -21,90 +21,4 @@ /* Specification. */ #include -/* Helpers. */ -#include -#include -#include -#include - -#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" diff --git a/tests/test-popen.h b/tests/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 . */ + +/* Written by Eric Blake , 2009. */ + +/* Include and a form of first. */ + +/* Helpers. */ +#include +#include +#include +#include + +#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; +}