Blame posix/tst-spawn2.c

Packit 6c4009
/* Further tests for spawn in case of invalid binary paths.
Packit 6c4009
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <spawn.h>
Packit 6c4009
#include <error.h>
Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
#include <sys/wait.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
Packit 6c4009
#include <support/check.h>
Packit 6c4009
Packit 6c4009
int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  /* Check if posix_spawn correctly returns an error and an invalid pid
Packit 6c4009
     by trying to spawn an invalid binary.  */
Packit 6c4009
Packit 6c4009
  const char *program = "/path/to/invalid/binary";
Packit 6c4009
  char * const args[] = { 0 };
Packit 6c4009
  pid_t pid = -1;
Packit 6c4009
Packit 6c4009
  int ret = posix_spawn (&pid, program, 0, 0, args, environ);
Packit 6c4009
  if (ret != ENOENT)
Packit 6c4009
    {
Packit 6c4009
      errno = ret;
Packit 6c4009
      FAIL_EXIT1 ("posix_spawn: %m");
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  /* POSIX states the value returned on pid variable in case of an error
Packit 6c4009
     is not specified.  GLIBC will update the value iff the child
Packit 6c4009
     execution is successful.  */
Packit 6c4009
  if (pid != -1)
Packit 6c4009
    FAIL_EXIT1 ("posix_spawn returned pid != -1 (%i)", (int) pid);
Packit 6c4009
Packit 6c4009
  /* Check if no child is actually created.  */
Packit 6c4009
  ret = waitpid (-1, NULL, 0);
Packit 6c4009
  if (ret != -1 || errno != ECHILD)
Packit 6c4009
    FAIL_EXIT1 ("waitpid: %m)");
Packit 6c4009
Packit 6c4009
  /* Same as before, but with posix_spawnp.  */
Packit 6c4009
  char *args2[] = { (char*) program, 0 };
Packit 6c4009
Packit 6c4009
  ret = posix_spawnp (&pid, args2[0], 0, 0, args2, environ);
Packit 6c4009
  if (ret != ENOENT)
Packit 6c4009
    {
Packit 6c4009
      errno = ret;
Packit 6c4009
      FAIL_EXIT1 ("posix_spawnp: %m");
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (pid != -1)
Packit 6c4009
    FAIL_EXIT1 ("posix_spawnp returned pid != -1 (%i)", (int) pid);
Packit 6c4009
Packit 6c4009
  ret = waitpid (-1, NULL, 0);
Packit 6c4009
  if (ret != -1 || errno != ECHILD)
Packit 6c4009
    FAIL_EXIT1 ("waitpid: %m)");
Packit 6c4009
Packit 6c4009
  return 0;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#include <support/test-driver.c>