changeset 39829:aa6d47aae153

posix_spawn_file_actions_addchdir: Add tests. * tests/test-posix_spawn_file_actions_addchdir.c: New file. * tests/test-posix_spawn4.c: New file. * modules/posix_spawn_file_actions_addchdir-tests: New file.
author Bruno Haible <bruno@clisp.org>
date Fri, 07 Sep 2018 23:38:53 +0200
parents 8d755c31408d
children bce09b317af9
files ChangeLog modules/posix_spawn_file_actions_addchdir-tests tests/test-posix_spawn4.c tests/test-posix_spawn_file_actions_addchdir.c
diffstat 4 files changed, 212 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Sep 07 23:35:52 2018 +0200
+++ b/ChangeLog	Fri Sep 07 23:38:53 2018 +0200
@@ -1,3 +1,10 @@
+2018-09-07  Bruno Haible  <bruno@clisp.org>
+
+	posix_spawn_file_actions_addchdir: Add tests.
+	* tests/test-posix_spawn_file_actions_addchdir.c: New file.
+	* tests/test-posix_spawn4.c: New file.
+	* modules/posix_spawn_file_actions_addchdir-tests: New file.
+
 2018-09-07  Bruno Haible  <bruno@clisp.org>
 
 	posix_spawn_file_actions_addchdir: New module.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/posix_spawn_file_actions_addchdir-tests	Fri Sep 07 23:38:53 2018 +0200
@@ -0,0 +1,20 @@
+Files:
+tests/test-posix_spawn_file_actions_addchdir.c
+tests/test-posix_spawn4.c
+tests/signature.h
+tests/macros.h
+
+Depends-on:
+posix_spawn_file_actions_init
+posix_spawnp-tests
+
+configure.ac:
+
+Makefile.am:
+TESTS += test-posix_spawn_file_actions_addchdir
+check_PROGRAMS += test-posix_spawn_file_actions_addchdir
+
+if POSIX_SPAWN_PORTED
+TESTS += test-posix_spawn4
+check_PROGRAMS += test-posix_spawn4
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-posix_spawn4.c	Fri Sep 07 23:38:53 2018 +0200
@@ -0,0 +1,143 @@
+/* Test of posix_spawn() function with 'chdir' action.
+   Copyright (C) 2008-2018 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 <https://www.gnu.org/licenses/>.  */
+
+/* Written by Bruno Haible <bruno@clisp.org>, 2018.  */
+
+#include <config.h>
+
+#include <spawn.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+extern char **environ;
+
+static int
+fd_safer (int fd)
+{
+  if (0 <= fd && fd <= 2)
+    {
+      int f = fd_safer (dup (fd));
+      int e = errno;
+      close (fd);
+      errno = e;
+      fd = f;
+    }
+
+  return fd;
+}
+
+int
+main ()
+{
+  char *argv[2] = { (char *) "pwd", NULL };
+  int ifd[2];
+  sigset_t blocked_signals;
+  sigset_t fatal_signal_set;
+  posix_spawn_file_actions_t actions;
+  bool actions_allocated;
+  posix_spawnattr_t attrs;
+  bool attrs_allocated;
+  int err;
+  pid_t child;
+  int fd;
+  FILE *fp;
+  char line[80];
+  int status;
+  int exitstatus;
+
+  if (pipe (ifd) < 0 || (ifd[0] = fd_safer (ifd[0])) < 0)
+    {
+      perror ("cannot create pipe");
+      exit (1);
+    }
+  sigprocmask (SIG_SETMASK, NULL, &blocked_signals);
+  sigemptyset (&fatal_signal_set);
+  sigaddset (&fatal_signal_set, SIGINT);
+  sigaddset (&fatal_signal_set, SIGTERM);
+  sigaddset (&fatal_signal_set, SIGHUP);
+  sigaddset (&fatal_signal_set, SIGPIPE);
+  sigprocmask (SIG_BLOCK, &fatal_signal_set, NULL);
+  actions_allocated = false;
+  attrs_allocated = false;
+  if ((err = posix_spawn_file_actions_init (&actions)) != 0
+      || (actions_allocated = true,
+          (err = posix_spawn_file_actions_adddup2 (&actions, ifd[1], STDOUT_FILENO)) != 0
+          || (err = posix_spawn_file_actions_addclose (&actions, ifd[1])) != 0
+          || (err = posix_spawn_file_actions_addclose (&actions, ifd[0])) != 0
+          || (err = posix_spawn_file_actions_addopen (&actions, STDIN_FILENO, "/dev/null", O_RDONLY, 0)) != 0
+          || (err = posix_spawn_file_actions_addchdir (&actions, "/")) != 0
+          || (err = posix_spawnattr_init (&attrs)) != 0
+          || (attrs_allocated = true,
+              (err = posix_spawnattr_setsigmask (&attrs, &blocked_signals)) != 0
+              || (err = posix_spawnattr_setflags (&attrs, POSIX_SPAWN_SETSIGMASK)) != 0)
+          || (err = posix_spawnp (&child, "pwd", &actions, &attrs, argv, environ)) != 0))
+    {
+      if (actions_allocated)
+        posix_spawn_file_actions_destroy (&actions);
+      if (attrs_allocated)
+        posix_spawnattr_destroy (&attrs);
+      sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+      errno = err;
+      perror ("subprocess failed");
+      exit (1);
+    }
+  posix_spawn_file_actions_destroy (&actions);
+  posix_spawnattr_destroy (&attrs);
+  sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL);
+  close (ifd[1]);
+  fd = ifd[0];
+  fp = fdopen (fd, "r");
+  if (fp == NULL)
+    {
+      fprintf (stderr, "fdopen() failed\n");
+      exit (1);
+    }
+  if (fread (line, 1, 80, fp) < 2)
+    {
+      fprintf (stderr, "could not read expected output\n");
+      exit (1);
+    }
+  if (memcmp (line, "/\n", 2) != 0)
+    {
+      fprintf (stderr, "read output is not the expected output");
+      exit (1);
+    }
+  fclose (fp);
+  status = 0;
+  while (waitpid (child, &status, 0) != child)
+    ;
+  if (!WIFEXITED (status))
+    {
+      fprintf (stderr, "subprocess terminated with unexpected wait status %d\n", status);
+      exit (1);
+    }
+  exitstatus = WEXITSTATUS (status);
+  if (exitstatus != 0)
+    {
+      fprintf (stderr, "subprocess terminated with unexpected exit status %d\n", exitstatus);
+      exit (1);
+    }
+  return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-posix_spawn_file_actions_addchdir.c	Fri Sep 07 23:38:53 2018 +0200
@@ -0,0 +1,42 @@
+/* Test posix_spawn_file_actions_addchdir() function.
+   Copyright (C) 2018 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 <https://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include <spawn.h>
+
+#include "signature.h"
+SIGNATURE_CHECK (posix_spawn_file_actions_addchdir, int,
+                 (posix_spawn_file_actions_t *, const char *));
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <unistd.h>
+
+#include "macros.h"
+
+int
+main (void)
+{
+  posix_spawn_file_actions_t actions;
+
+  ASSERT (posix_spawn_file_actions_init (&actions) == 0);
+
+  ASSERT (posix_spawn_file_actions_addchdir (&actions, "/") == 0);
+
+  return 0;
+}