Blame nptl/tst-cancel4.c

Packit 6c4009
/* Copyright (C) 2002-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
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
/* NOTE: this tests functionality beyond POSIX.  POSIX does not allow
Packit 6c4009
   exit to be called more than once.  */
Packit 6c4009
Packit 6c4009
#include <stddef.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <sys/types.h>
Packit 6c4009
#include <sys/socket.h>
Packit 6c4009
#include <sys/un.h>
Packit 6c4009
#include <sys/ipc.h>
Packit 6c4009
#include <sys/msg.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
#include <errno.h>
Packit 6c4009
#include <limits.h>
Packit 6c4009
#include <pthread.h>
Packit 6c4009
#include <fcntl.h>
Packit 6c4009
#include <termios.h>
Packit 6c4009
#include <sys/mman.h>
Packit 6c4009
#include <sys/poll.h>
Packit 6c4009
#include <sys/wait.h>
Packit 6c4009
#include <sys/stat.h>
Packit 6c4009
#include <sys/uio.h>
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Since STREAMS are not supported in the standard Linux kernel and
Packit 6c4009
   there we don't advertise STREAMS as supported is no need to test
Packit 6c4009
   the STREAMS related functions.  This affects
Packit 6c4009
     getmsg()              getpmsg()          putmsg()
Packit 6c4009
     putpmsg()
Packit 6c4009
Packit 6c4009
   lockf() and fcntl() are tested in tst-cancel16.
Packit 6c4009
Packit 6c4009
   pthread_join() is tested in tst-join5.
Packit 6c4009
Packit 6c4009
   pthread_testcancel()'s only purpose is to allow cancellation.  This
Packit 6c4009
   is tested in several places.
Packit 6c4009
Packit 6c4009
   sem_wait() and sem_timedwait() are checked in tst-cancel1[2345] tests.
Packit 6c4009
Packit 6c4009
   mq_send(), mq_timedsend(), mq_receive() and mq_timedreceive() are checked
Packit 6c4009
   in tst-mqueue8{,x} tests.
Packit 6c4009
Packit 6c4009
   aio_suspend() is tested in tst-cancel17.
Packit 6c4009
Packit 6c4009
   clock_nanosleep() is tested in tst-cancel18.
Packit 6c4009
Packit 6c4009
   Linux sendmmsg and recvmmsg are checked in tst-cancel4_1.c and
Packit 6c4009
   tst-cancel4_2.c respectively.
Packit 6c4009
*/
Packit 6c4009
Packit 6c4009
#include "tst-cancel4-common.h"
Packit 6c4009
Packit 6c4009
Packit 6c4009
#ifndef IPC_ADDVAL
Packit 6c4009
# define IPC_ADDVAL 0
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_read  (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    fd = fds[0];
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
      tempfd = fd = mkstemp (fname);
Packit 6c4009
      if (fd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
      unlink (fname);
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char buf[100];
Packit 6c4009
  s = read (fd, buf, sizeof (buf));
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("read returns with %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_readv  (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    fd = fds[0];
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
      tempfd = fd = mkstemp (fname);
Packit 6c4009
      if (fd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
      unlink (fname);
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char buf[100];
Packit 6c4009
  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
Packit 6c4009
  s = readv (fd, iov, 1);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("readv returns with %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_write  (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    fd = fds[1];
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
      tempfd = fd = mkstemp (fname);
Packit 6c4009
      if (fd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
      unlink (fname);
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char buf[WRITE_BUFFER_SIZE];
Packit 6c4009
  memset (buf, '\0', sizeof (buf));
Packit 6c4009
  s = write (fd, buf, sizeof (buf));
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("write returns with %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_writev  (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    fd = fds[1];
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
      tempfd = fd = mkstemp (fname);
Packit 6c4009
      if (fd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
      unlink (fname);
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char buf[WRITE_BUFFER_SIZE];
Packit 6c4009
  memset (buf, '\0', sizeof (buf));
Packit 6c4009
  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
Packit 6c4009
  s = writev (fd, iov, 1);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("writev returns with %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_sleep (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  sleep (arg == NULL ? 1000000 : 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("sleep returns");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_usleep (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  usleep (arg == NULL ? (useconds_t) ULONG_MAX : 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("usleep returns");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_nanosleep (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  struct timespec ts = { .tv_sec = arg == NULL ? 10000000 : 0, .tv_nsec = 0 };
Packit 6c4009
  TEMP_FAILURE_RETRY (nanosleep (&ts, &ts);;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("nanosleep returns");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_select (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    fd = fds[0];
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
      tempfd = fd = mkstemp (fname);
Packit 6c4009
      if (fd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
      unlink (fname);
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  fd_set rfs;
Packit 6c4009
  FD_ZERO (&rfs;;
Packit 6c4009
  FD_SET (fd, &rfs;;
Packit 6c4009
Packit 6c4009
  int s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  s = select (fd + 1, &rfs, NULL, NULL, NULL);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("select returns with %d: %m", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_pselect (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    fd = fds[0];
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
      tempfd = fd = mkstemp (fname);
Packit 6c4009
      if (fd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
      unlink (fname);
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  fd_set rfs;
Packit 6c4009
  FD_ZERO (&rfs;;
Packit 6c4009
  FD_SET (fd, &rfs;;
Packit 6c4009
Packit 6c4009
  int s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  s = pselect (fd + 1, &rfs, NULL, NULL, NULL, NULL);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("pselect returns with %d: %m", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_poll (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    fd = fds[0];
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
      tempfd = fd = mkstemp (fname);
Packit 6c4009
      if (fd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
      unlink (fname);
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  struct pollfd rfs[1] = { [0] = { .fd = fd, .events = POLLIN } };
Packit 6c4009
Packit 6c4009
  int s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  s = poll (rfs, 1, -1);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("poll returns with %d: %m", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_ppoll (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    fd = fds[0];
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
      tempfd = fd = mkstemp (fname);
Packit 6c4009
      if (fd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
      unlink (fname);
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  struct pollfd rfs[1] = { [0] = { .fd = fd, .events = POLLIN } };
Packit 6c4009
Packit 6c4009
  int s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  s = ppoll (rfs, 1, NULL, NULL);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("ppoll returns with %d: %m", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_wait (void *arg)
Packit 6c4009
{
Packit 6c4009
  pid_t pid = fork ();
Packit 6c4009
  if (pid == -1)
Packit 6c4009
    FAIL_EXIT1 ("fork: %m");
Packit 6c4009
Packit 6c4009
  if (pid == 0)
Packit 6c4009
    {
Packit 6c4009
      /* Make the program disappear after a while.  */
Packit 6c4009
      if (arg == NULL)
Packit 6c4009
	sleep (10);
Packit 6c4009
      exit (0);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    {
Packit 6c4009
      struct timespec  ts = { .tv_sec = 0, .tv_nsec = 100000000 };
Packit 6c4009
      while (nanosleep (&ts, &ts) != 0)
Packit 6c4009
	continue;
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  int s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  s = wait (NULL);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("wait returns with %d: %m", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_waitpid (void *arg)
Packit 6c4009
{
Packit 6c4009
  pid_t pid = fork ();
Packit 6c4009
  if (pid == -1)
Packit 6c4009
    FAIL_EXIT1 ("fork: %m");
Packit 6c4009
Packit 6c4009
  if (pid == 0)
Packit 6c4009
    {
Packit 6c4009
      /* Make the program disappear after a while.  */
Packit 6c4009
      if (arg == NULL)
Packit 6c4009
	sleep (10);
Packit 6c4009
      exit (0);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    {
Packit 6c4009
      struct timespec  ts = { .tv_sec = 0, .tv_nsec = 100000000 };
Packit 6c4009
      while (nanosleep (&ts, &ts) != 0)
Packit 6c4009
	continue;
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  int s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  s = waitpid (-1, NULL, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("waitpid returns with %d: %m", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_waitid (void *arg)
Packit 6c4009
{
Packit 6c4009
  pid_t pid = fork ();
Packit 6c4009
  if (pid == -1)
Packit 6c4009
    FAIL_EXIT1 ("fork: %m");
Packit 6c4009
Packit 6c4009
  if (pid == 0)
Packit 6c4009
    {
Packit 6c4009
      /* Make the program disappear after a while.  */
Packit 6c4009
      if (arg == NULL)
Packit 6c4009
	sleep (10);
Packit 6c4009
      exit (0);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    {
Packit 6c4009
      struct timespec  ts = { .tv_sec = 0, .tv_nsec = 100000000 };
Packit 6c4009
      while (nanosleep (&ts, &ts) != 0)
Packit 6c4009
	continue;
Packit 6c4009
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  int s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
#ifndef WEXITED
Packit 6c4009
# define WEXITED 0
Packit 6c4009
#endif
Packit 6c4009
  siginfo_t si;
Packit 6c4009
  s = waitid (P_PID, pid, &si, WEXITED);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("waitid returns with %d: %m", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_sigpause (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  sigpause (sigmask (SIGINT));
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("sigpause returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_sigsuspend (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  /* Just for fun block all signals.  */
Packit 6c4009
  sigset_t mask;
Packit 6c4009
  sigfillset (&mask);
Packit 6c4009
  sigsuspend (&mask);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("sigsuspend returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_sigwait (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  /* Block SIGUSR1.  */
Packit 6c4009
  sigset_t mask;
Packit 6c4009
  sigemptyset (&mask);
Packit 6c4009
  sigaddset (&mask, SIGUSR1);
Packit 6c4009
  TEST_VERIFY_EXIT (pthread_sigmask (SIG_BLOCK, &mask, NULL) == 0);
Packit 6c4009
Packit 6c4009
  int sig;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  /* Wait for SIGUSR1.  */
Packit 6c4009
  sigwait (&mask, &sig);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("sigwait returned with signal %d", sig);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_sigwaitinfo (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  /* Block SIGUSR1.  */
Packit 6c4009
  sigset_t mask;
Packit 6c4009
  sigemptyset (&mask);
Packit 6c4009
  sigaddset (&mask, SIGUSR1);
Packit 6c4009
  TEST_VERIFY_EXIT (pthread_sigmask (SIG_BLOCK, &mask, NULL) == 0);
Packit 6c4009
Packit 6c4009
  siginfo_t info;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  /* Wait for SIGUSR1.  */
Packit 6c4009
  sigwaitinfo (&mask, &info;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("sigwaitinfo returned with signal %d", info.si_signo);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_sigtimedwait (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  /* Block SIGUSR1.  */
Packit 6c4009
  sigset_t mask;
Packit 6c4009
  sigemptyset (&mask);
Packit 6c4009
  sigaddset (&mask, SIGUSR1);
Packit 6c4009
  TEST_VERIFY_EXIT (pthread_sigmask (SIG_BLOCK, &mask, NULL) == 0);
Packit 6c4009
Packit 6c4009
  /* Wait for SIGUSR1.  */
Packit 6c4009
  siginfo_t info;
Packit 6c4009
  struct timespec ts = { .tv_sec = 60, .tv_nsec = 0 };
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  sigtimedwait (&mask, &info, &ts);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("sigtimedwait returned with signal %d", info.si_signo);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_pause (void *arg)
Packit 6c4009
{
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  pause ();
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("pause returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_accept (void *arg)
Packit 6c4009
{
Packit 6c4009
  struct sockaddr_un sun;
Packit 6c4009
  /* To test a non-blocking accept call we make the call file by using
Packit 6c4009
     a datagrame socket.  */
Packit 6c4009
  int pf = arg == NULL ? SOCK_STREAM : SOCK_DGRAM;
Packit 6c4009
Packit 6c4009
  tempfd = socket (AF_UNIX, pf, 0);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, %s, 0): %m", arg == NULL ? "SOCK_STREAM"
Packit 6c4009
					       : "SOCK_DGRAM");
Packit 6c4009
Packit 6c4009
  int tries = 0;
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      TEST_VERIFY_EXIT (tries++ < 10);
Packit 6c4009
Packit 6c4009
      strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-1-XXXXXX");
Packit 6c4009
      TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL);
Packit 6c4009
Packit 6c4009
      sun.sun_family = AF_UNIX;
Packit 6c4009
    }
Packit 6c4009
  while (bind (tempfd, (struct sockaddr *) &sun,
Packit 6c4009
	       offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
	       + strlen (sun.sun_path) + 1) != 0);
Packit 6c4009
Packit 6c4009
  unlink (sun.sun_path);
Packit 6c4009
Packit 6c4009
  listen (tempfd, 5);
Packit 6c4009
Packit 6c4009
  socklen_t len = sizeof (sun);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  accept (tempfd, (struct sockaddr *) &sun, &len;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("accept returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_send (void *arg)
Packit 6c4009
{
Packit 6c4009
  struct sockaddr_un sun;
Packit 6c4009
Packit 6c4009
  tempfd = socket (AF_UNIX, SOCK_STREAM, 0);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m");
Packit 6c4009
Packit 6c4009
  int tries = 0;
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      TEST_VERIFY_EXIT (tries++ < 10);
Packit 6c4009
Packit 6c4009
      strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-2-XXXXXX");
Packit 6c4009
      TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL);
Packit 6c4009
Packit 6c4009
      sun.sun_family = AF_UNIX;
Packit 6c4009
    }
Packit 6c4009
  while (bind (tempfd, (struct sockaddr *) &sun,
Packit 6c4009
	       offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
	       + strlen (sun.sun_path) + 1) != 0);
Packit 6c4009
Packit 6c4009
  listen (tempfd, 5);
Packit 6c4009
Packit 6c4009
  tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0);
Packit 6c4009
  if (tempfd2 == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m");
Packit 6c4009
Packit 6c4009
  set_socket_buffer (tempfd2);
Packit 6c4009
Packit 6c4009
  if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0)
Packit 6c4009
    FAIL_EXIT1 ("connect: %m");
Packit 6c4009
Packit 6c4009
  unlink (sun.sun_path);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char mem[WRITE_BUFFER_SIZE];
Packit 6c4009
Packit 6c4009
  send (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("send returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_recv (void *arg)
Packit 6c4009
{
Packit 6c4009
  struct sockaddr_un sun;
Packit 6c4009
Packit 6c4009
  tempfd = socket (AF_UNIX, SOCK_STREAM, 0);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m");
Packit 6c4009
Packit 6c4009
  int tries = 0;
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      TEST_VERIFY_EXIT (tries++ < 10);
Packit 6c4009
Packit 6c4009
      strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-3-XXXXXX");
Packit 6c4009
      TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL);
Packit 6c4009
Packit 6c4009
      sun.sun_family = AF_UNIX;
Packit 6c4009
    }
Packit 6c4009
  while (bind (tempfd, (struct sockaddr *) &sun,
Packit 6c4009
	       offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
	       + strlen (sun.sun_path) + 1) != 0);
Packit 6c4009
Packit 6c4009
  listen (tempfd, 5);
Packit 6c4009
Packit 6c4009
  tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0);
Packit 6c4009
  if (tempfd2 == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m");
Packit 6c4009
Packit 6c4009
  if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0)
Packit 6c4009
    FAIL_EXIT1 ("connect: %m");
Packit 6c4009
Packit 6c4009
  unlink (sun.sun_path);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char mem[70];
Packit 6c4009
Packit 6c4009
  recv (tempfd2, mem, arg == NULL ? sizeof (mem) : 0, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("recv returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_recvfrom (void *arg)
Packit 6c4009
{
Packit 6c4009
  struct sockaddr_un sun;
Packit 6c4009
Packit 6c4009
  tempfd = socket (AF_UNIX, SOCK_DGRAM, 0);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m");
Packit 6c4009
Packit 6c4009
  int tries = 0;
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      TEST_VERIFY_EXIT (tries++ < 10);
Packit 6c4009
Packit 6c4009
      strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-4-XXXXXX");
Packit 6c4009
      TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL);
Packit 6c4009
Packit 6c4009
      sun.sun_family = AF_UNIX;
Packit 6c4009
    }
Packit 6c4009
  while (bind (tempfd, (struct sockaddr *) &sun,
Packit 6c4009
	       offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
	       + strlen (sun.sun_path) + 1) != 0);
Packit 6c4009
Packit 6c4009
  tempfname = strdup (sun.sun_path);
Packit 6c4009
Packit 6c4009
  tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0);
Packit 6c4009
  if (tempfd2 == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char mem[70];
Packit 6c4009
  socklen_t len = sizeof (sun);
Packit 6c4009
Packit 6c4009
  recvfrom (tempfd2, mem, arg == NULL ? sizeof (mem) : 0, 0,
Packit 6c4009
	    (struct sockaddr *) &sun, &len;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("recvfrom returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_recvmsg (void *arg)
Packit 6c4009
{
Packit 6c4009
  struct sockaddr_un sun;
Packit 6c4009
Packit 6c4009
  tempfd = socket (AF_UNIX, SOCK_DGRAM, 0);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m");
Packit 6c4009
Packit 6c4009
  int tries = 0;
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      TEST_VERIFY_EXIT (tries++ < 10);
Packit 6c4009
Packit 6c4009
      strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-5-XXXXXX");
Packit 6c4009
      TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL);
Packit 6c4009
Packit 6c4009
      sun.sun_family = AF_UNIX;
Packit 6c4009
    }
Packit 6c4009
  while (bind (tempfd, (struct sockaddr *) &sun,
Packit 6c4009
	       offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
	       + strlen (sun.sun_path) + 1) != 0);
Packit 6c4009
Packit 6c4009
  tempfname = strdup (sun.sun_path);
Packit 6c4009
Packit 6c4009
  tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0);
Packit 6c4009
  if (tempfd2 == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char mem[70];
Packit 6c4009
  struct iovec iov[1];
Packit 6c4009
  iov[0].iov_base = mem;
Packit 6c4009
  iov[0].iov_len = arg == NULL ? sizeof (mem) : 0;
Packit 6c4009
Packit 6c4009
  struct msghdr m;
Packit 6c4009
  m.msg_name = &sun;
Packit 6c4009
  m.msg_namelen = sizeof (sun);
Packit 6c4009
  m.msg_iov = iov;
Packit 6c4009
  m.msg_iovlen = 1;
Packit 6c4009
  m.msg_control = NULL;
Packit 6c4009
  m.msg_controllen = 0;
Packit 6c4009
Packit 6c4009
  recvmsg (tempfd2, &m, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("recvmsg returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_open (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    {
Packit 6c4009
      fifofd = mkfifo (fifoname, S_IWUSR | S_IRUSR);
Packit 6c4009
      if (fifofd == -1)
Packit 6c4009
	FAIL_EXIT1 ("mkfifo: %m");
Packit 6c4009
    }
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      xpthread_barrier_wait (&b2;;
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl_fifo, NULL);
Packit 6c4009
Packit 6c4009
  open (arg ? "Makefile" : fifoname, O_RDONLY);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("open returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_close (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which close()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  char fname[] = "/tmp/tst-cancel-fd-XXXXXX";
Packit 6c4009
  tempfd = mkstemp (fname);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
  unlink (fname);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  close (tempfd);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("close returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_pread (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which pread()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  tempfd = open ("Makefile", O_RDONLY);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("open (\"Makefile\", O_RDONLY): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char mem[10];
Packit 6c4009
  pread (tempfd, mem, sizeof (mem), 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("pread returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_pwrite (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which pwrite()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
  tempfd = mkstemp (fname);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
  unlink (fname);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char mem[10];
Packit 6c4009
  pwrite (tempfd, mem, sizeof (mem), 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("pwrite returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_preadv (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    /* XXX If somebody can provide a portable test case in which preadv
Packit 6c4009
       blocks we can enable this test to run in both rounds.  */
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
  tempfd = fd = mkstemp (fname);
Packit 6c4009
  if (fd == -1)
Packit 6c4009
    FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
  unlink (fname);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char buf[100];
Packit 6c4009
  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
Packit 6c4009
  s = preadv (fd, iov, 1, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("preadv returns with %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_pwritev (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    /* XXX If somebody can provide a portable test case in which pwritev
Packit 6c4009
       blocks we can enable this test to run in both rounds.  */
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
  tempfd = fd = mkstemp (fname);
Packit 6c4009
  if (fd == -1)
Packit 6c4009
    FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
  unlink (fname);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char buf[WRITE_BUFFER_SIZE];
Packit 6c4009
  memset (buf, '\0', sizeof (buf));
Packit 6c4009
  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
Packit 6c4009
  s = pwritev (fd, iov, 1, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("pwritev returns with %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_pwritev2 (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    /* XXX If somebody can provide a portable test case in which pwritev2
Packit 6c4009
       blocks we can enable this test to run in both rounds.  */
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  errno = 0;
Packit 6c4009
Packit 6c4009
  char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
  tempfd = fd = mkstemp (fname);
Packit 6c4009
  if (fd == -1)
Packit 6c4009
    FAIL_EXIT1 ("mkstemp: %m");
Packit 6c4009
  unlink (fname);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char buf[WRITE_BUFFER_SIZE];
Packit 6c4009
  memset (buf, '\0', sizeof (buf));
Packit 6c4009
  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
Packit 6c4009
  s = pwritev2 (fd, iov, 1, 0, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("pwritev2 returns with %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_preadv2 (void *arg)
Packit 6c4009
{
Packit 6c4009
  int fd;
Packit 6c4009
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    /* XXX If somebody can provide a portable test case in which preadv2
Packit 6c4009
       blocks we can enable this test to run in both rounds.  */
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  errno = 0;
Packit 6c4009
Packit 6c4009
  char fname[] = "/tmp/tst-cancel4-fd-XXXXXX";
Packit 6c4009
  tempfd = fd = mkstemp (fname);
Packit 6c4009
  if (fd == -1)
Packit 6c4009
    FAIL_EXIT1 ("mkstemp failed: %m");
Packit 6c4009
  unlink (fname);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char buf[100];
Packit 6c4009
  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
Packit 6c4009
  s = preadv2 (fd, iov, 1, 0, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("preadv2 returns with %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_fsync (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which fsync()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  tempfd = open ("Makefile", O_RDONLY);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("open (\"Makefile\", O_RDONLY): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  fsync (tempfd);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("fsync returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_fdatasync (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which fdatasync()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  tempfd = open ("Makefile", O_RDONLY);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("open (\"Makefile\", O_RDONLY): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  fdatasync (tempfd);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("fdatasync returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_msync (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which msync()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  tempfd = open ("Makefile", O_RDONLY);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("open (\"Makefile\", O_RDONLY): %m");
Packit 6c4009
Packit 6c4009
  void *p = xmmap (NULL, 10, PROT_READ, MAP_SHARED, tempfd);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  msync (p, 10, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("msync returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_sendto (void *arg)
Packit 6c4009
{
Packit 6c4009
  struct sockaddr_un sun;
Packit 6c4009
Packit 6c4009
  tempfd = socket (AF_UNIX, SOCK_STREAM, 0);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m");
Packit 6c4009
Packit 6c4009
  int tries = 0;
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      TEST_VERIFY_EXIT (tries++ < 10);
Packit 6c4009
Packit 6c4009
      strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-6-XXXXXX");
Packit 6c4009
      TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL);
Packit 6c4009
Packit 6c4009
      sun.sun_family = AF_UNIX;
Packit 6c4009
    }
Packit 6c4009
  while (bind (tempfd, (struct sockaddr *) &sun,
Packit 6c4009
	       offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
	       + strlen (sun.sun_path) + 1) != 0);
Packit 6c4009
Packit 6c4009
  listen (tempfd, 5);
Packit 6c4009
Packit 6c4009
  tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0);
Packit 6c4009
  if (tempfd2 == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m");
Packit 6c4009
Packit 6c4009
  set_socket_buffer (tempfd2);
Packit 6c4009
Packit 6c4009
  if (connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun)) != 0)
Packit 6c4009
    FAIL_EXIT1 ("connect: %m");
Packit 6c4009
Packit 6c4009
  unlink (sun.sun_path);
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char mem[WRITE_BUFFER_SIZE];
Packit 6c4009
Packit 6c4009
  sendto (tempfd2, mem, arg == NULL ? sizeof (mem) : 1, 0, NULL, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("sendto returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_sendmsg (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which sendmsg()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  struct sockaddr_un sun;
Packit 6c4009
Packit 6c4009
  tempfd = socket (AF_UNIX, SOCK_DGRAM, 0);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m");
Packit 6c4009
Packit 6c4009
  int tries = 0;
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      TEST_VERIFY_EXIT (tries++ < 10);
Packit 6c4009
Packit 6c4009
      strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-7-XXXXXX");
Packit 6c4009
      TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL);
Packit 6c4009
Packit 6c4009
      sun.sun_family = AF_UNIX;
Packit 6c4009
    }
Packit 6c4009
  while (bind (tempfd, (struct sockaddr *) &sun,
Packit 6c4009
	       offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
	       + strlen (sun.sun_path) + 1) != 0);
Packit 6c4009
  tempfname = strdup (sun.sun_path);
Packit 6c4009
Packit 6c4009
  tempfd2 = socket (AF_UNIX, SOCK_DGRAM, 0);
Packit 6c4009
  if (tempfd2 == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_DGRAM, 0): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  char mem[1];
Packit 6c4009
  struct iovec iov[1];
Packit 6c4009
  iov[0].iov_base = mem;
Packit 6c4009
  iov[0].iov_len = 1;
Packit 6c4009
Packit 6c4009
  struct msghdr m;
Packit 6c4009
  m.msg_name = &sun;
Packit 6c4009
  m.msg_namelen = (offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
		   + strlen (sun.sun_path) + 1);
Packit 6c4009
  m.msg_iov = iov;
Packit 6c4009
  m.msg_iovlen = 1;
Packit 6c4009
  m.msg_control = NULL;
Packit 6c4009
  m.msg_controllen = 0;
Packit 6c4009
Packit 6c4009
  sendmsg (tempfd2, &m, 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("sendmsg returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_creat (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which sendmsg()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  creat ("tmp/tst-cancel-4-should-not-exist", 0666);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("creat returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_connect (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which connect()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  struct sockaddr_un sun;
Packit 6c4009
Packit 6c4009
  tempfd = socket (AF_UNIX, SOCK_STREAM, 0);
Packit 6c4009
  if (tempfd == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m");
Packit 6c4009
Packit 6c4009
  int tries = 0;
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      TEST_VERIFY_EXIT (tries++ < 10);
Packit 6c4009
Packit 6c4009
      strcpy (sun.sun_path, "/tmp/tst-cancel4-socket-2-XXXXXX");
Packit 6c4009
      TEST_VERIFY_EXIT (mktemp (sun.sun_path) != NULL);
Packit 6c4009
Packit 6c4009
      sun.sun_family = AF_UNIX;
Packit 6c4009
    }
Packit 6c4009
  while (bind (tempfd, (struct sockaddr *) &sun,
Packit 6c4009
	       offsetof (struct sockaddr_un, sun_path)
Packit 6c4009
	       + strlen (sun.sun_path) + 1) != 0);
Packit 6c4009
  tempfname = strdup (sun.sun_path);
Packit 6c4009
Packit 6c4009
  listen (tempfd, 5);
Packit 6c4009
Packit 6c4009
  tempfd2 = socket (AF_UNIX, SOCK_STREAM, 0);
Packit 6c4009
  if (tempfd2 == -1)
Packit 6c4009
    FAIL_EXIT1 ("socket (AF_UNIX, SOCK_STREAM, 0): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  connect (tempfd2, (struct sockaddr *) &sun, sizeof (sun));
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("connect returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_tcdrain (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which tcdrain()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  /* Regardless of stderr being a terminal, the tcdrain call should be
Packit 6c4009
     canceled.  */
Packit 6c4009
  tcdrain (STDERR_FILENO);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("tcdrain returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_msgrcv (void *arg)
Packit 6c4009
{
Packit 6c4009
  tempmsg = msgget (IPC_PRIVATE, 0666 | IPC_CREAT);
Packit 6c4009
  if (tempmsg == -1)
Packit 6c4009
    FAIL_EXIT1 ("msgget (IPC_PRIVATE, 0666 | IPC_CREAT): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  if (arg != NULL)
Packit 6c4009
    xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  ssize_t s;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  struct
Packit 6c4009
  {
Packit 6c4009
    long int type;
Packit 6c4009
    char mem[10];
Packit 6c4009
  } m;
Packit 6c4009
  int randnr;
Packit 6c4009
  /* We need a positive random number.  */
Packit 6c4009
  do
Packit 6c4009
    randnr = random () % 64000;
Packit 6c4009
  while (randnr <= 0);
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      errno = 0;
Packit 6c4009
      s = msgrcv (tempmsg, (struct msgbuf *) &m, 10, randnr, 0);
Packit 6c4009
    }
Packit 6c4009
  while (errno == EIDRM || errno == EINTR);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  msgctl (tempmsg, IPC_RMID, NULL);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("msgrcv returned %zd", s);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void *
Packit 6c4009
tf_msgsnd (void *arg)
Packit 6c4009
{
Packit 6c4009
  if (arg == NULL)
Packit 6c4009
    // XXX If somebody can provide a portable test case in which msgsnd()
Packit 6c4009
    // blocks we can enable this test to run in both rounds.
Packit 6c4009
    abort ();
Packit 6c4009
Packit 6c4009
  tempmsg = msgget (IPC_PRIVATE, 0666 | IPC_CREAT);
Packit 6c4009
  if (tempmsg == -1)
Packit 6c4009
    FAIL_EXIT1 ("msgget (IPC_PRIVATE, 0666 | IPC_CREAT): %m");
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  xpthread_barrier_wait (&b2;;
Packit 6c4009
Packit 6c4009
  pthread_cleanup_push (cl, NULL);
Packit 6c4009
Packit 6c4009
  struct
Packit 6c4009
  {
Packit 6c4009
    long int type;
Packit 6c4009
    char mem[1];
Packit 6c4009
  } m;
Packit 6c4009
  /* We need a positive random number.  */
Packit 6c4009
  do
Packit 6c4009
    m.type = random () % 64000;
Packit 6c4009
  while (m.type <= 0);
Packit 6c4009
  msgsnd (tempmsg, (struct msgbuf *) &m, sizeof (m.mem), 0);
Packit 6c4009
Packit 6c4009
  pthread_cleanup_pop (0);
Packit 6c4009
Packit 6c4009
  msgctl (tempmsg, IPC_RMID, NULL);
Packit 6c4009
Packit 6c4009
  FAIL_EXIT1 ("msgsnd returned");
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
struct cancel_tests tests[] =
Packit 6c4009
{
Packit 6c4009
  ADD_TEST (read, 2, 0),
Packit 6c4009
  ADD_TEST (readv, 2, 0),
Packit 6c4009
  ADD_TEST (select, 2, 0),
Packit 6c4009
  ADD_TEST (pselect, 2, 0),
Packit 6c4009
  ADD_TEST (poll, 2, 0),
Packit 6c4009
  ADD_TEST (ppoll, 2, 0),
Packit 6c4009
  ADD_TEST (write, 2, 0),
Packit 6c4009
  ADD_TEST (writev, 2, 0),
Packit 6c4009
  ADD_TEST (sleep, 2, 0),
Packit 6c4009
  ADD_TEST (usleep, 2, 0),
Packit 6c4009
  ADD_TEST (nanosleep, 2, 0),
Packit 6c4009
  ADD_TEST (wait, 2, 0),
Packit 6c4009
  ADD_TEST (waitid, 2, 0),
Packit 6c4009
  ADD_TEST (waitpid, 2, 0),
Packit 6c4009
  ADD_TEST (sigpause, 2, 0),
Packit 6c4009
  ADD_TEST (sigsuspend, 2, 0),
Packit 6c4009
  ADD_TEST (sigwait, 2, 0),
Packit 6c4009
  ADD_TEST (sigwaitinfo, 2, 0),
Packit 6c4009
  ADD_TEST (sigtimedwait, 2, 0),
Packit 6c4009
  ADD_TEST (pause, 2, 0),
Packit 6c4009
  ADD_TEST (accept, 2, 0),
Packit 6c4009
  ADD_TEST (send, 2, 0),
Packit 6c4009
  ADD_TEST (recv, 2, 0),
Packit 6c4009
  ADD_TEST (recvfrom, 2, 0),
Packit 6c4009
  ADD_TEST (recvmsg, 2, 0),
Packit 6c4009
  ADD_TEST (preadv, 2, 1),
Packit 6c4009
  ADD_TEST (preadv2, 2, 1),
Packit 6c4009
  ADD_TEST (pwritev, 2, 1),
Packit 6c4009
  ADD_TEST (pwritev2, 2, 1),
Packit 6c4009
  ADD_TEST (open, 2, 1),
Packit 6c4009
  ADD_TEST (close, 2, 1),
Packit 6c4009
  ADD_TEST (pread, 2, 1),
Packit 6c4009
  ADD_TEST (pwrite, 2, 1),
Packit 6c4009
  ADD_TEST (fsync, 2, 1),
Packit 6c4009
  ADD_TEST (fdatasync, 2, 1),
Packit 6c4009
  ADD_TEST (msync, 2, 1),
Packit 6c4009
  ADD_TEST (sendto, 2, 1),
Packit 6c4009
  ADD_TEST (sendmsg, 2, 1),
Packit 6c4009
  ADD_TEST (creat, 2, 1),
Packit 6c4009
  ADD_TEST (connect, 2, 1),
Packit 6c4009
  ADD_TEST (tcdrain, 2, 1),
Packit 6c4009
  ADD_TEST (msgrcv, 2, 0),
Packit 6c4009
  ADD_TEST (msgsnd, 2, 1),
Packit 6c4009
};
Packit 6c4009
#define ntest_tf (sizeof (tests) / sizeof (tests[0]))
Packit 6c4009
Packit 6c4009
#include "tst-cancel4-common.c"