/* Signal handler and mask set in thread which calls exec.
   Copyright (C) 2003 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


static void *
tf (void *arg)
{
  /* Ignore SIGUSR1 and block SIGUSR2.  */
  if (sigignore (SIGUSR1) != 0)
    {
      puts ("sigignore failed");
      exit (1);
    }

  sigset_t ss;
  sigemptyset (&ss);
  sigaddset (&ss, SIGUSR2);
  if (pthread_sigmask (SIG_BLOCK, &ss, NULL) != 0)
    {
      puts ("1st run: sigmask failed");
      exit (1);
    }

  char **oldargv = (char **) arg;
  size_t n = 1;
  while (oldargv[n] != NULL)
    ++n;

  char **argv = (char **) alloca ((n + 1) * sizeof (char *));
  for (n = 0; oldargv[n + 1] != NULL; ++n)
    argv[n] = oldargv[n + 1];
  argv[n++] = (char *) "--direct";
  argv[n] = NULL;

  execv (argv[0], argv);

  puts ("execv failed");

  exit (1);
}


static int
do_test (int argc, char *argv[])
{
  if (argc == 1)
    {
      /* This is the second call.  Perform the test.  */
      struct sigaction sa;

      if (sigaction (SIGUSR1, NULL, &sa) != 0)
	{
	  puts ("2nd run: sigaction failed");
	  return 1;
	}
      if (sa.sa_handler != SIG_IGN)
	{
	  puts ("SIGUSR1 not ignored");
	  return 1;
	}

      sigset_t ss;
      if (pthread_sigmask (SIG_SETMASK, NULL, &ss) != 0)
	{
	  puts ("2nd run: sigmask failed");
	  return 1;
	}
      if (! sigismember (&ss, SIGUSR2))
	{
	  puts ("SIGUSR2 not blocked");
	  return 1;
	}

      return 0;
    }

  pthread_t th;
  if (pthread_create (&th, NULL, tf, argv) != 0)
    {
      puts ("create failed");
      exit (1);
    }

  /* This call should never return.  */
  pthread_join (th, NULL);

  puts ("join returned");

  return 1;
}

#define TEST_FUNCTION do_test (argc, argv)
#include "../test-skeleton.c"
