(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
test-sigpipe.c
       1  /* Test of SIGPIPE handling.
       2     Copyright (C) 2008-2023 Free Software Foundation, Inc.
       3  
       4     This program is free software; you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation, either version 3, or (at your option)
       7     any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program; if not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #include <config.h>
      18  
      19  #include <signal.h>
      20  
      21  /* Check that SIGPIPE is defined.  */
      22  int s = SIGPIPE;
      23  
      24  #include <errno.h>
      25  #include <stdio.h>
      26  #include <stdlib.h>
      27  #include <unistd.h>
      28  
      29  #include "macros.h"
      30  
      31  static void
      32  handler (int sig)
      33  {
      34    _exit (0);
      35  }
      36  
      37  int
      38  main (int argc, char **argv)
      39  {
      40    char mode = argv[1][0];
      41  
      42    switch (mode)
      43      {
      44      case 'A': signal (SIGPIPE, SIG_DFL); break;
      45      case 'B': signal (SIGPIPE, SIG_IGN); break;
      46      case 'C': signal (SIGPIPE, handler); break;
      47      }
      48  
      49    /* Produce infinite output.  Since it is piped into "head -n 1", the writes
      50       must ultimately fail.  */
      51    for (;;)
      52      {
      53        char c[2] = { 'y', '\n' };
      54        int ret = write (1, c, sizeof (c));
      55        if (ret <= 0)
      56          {
      57            switch (mode)
      58              {
      59              case 'B': /* The write() call should have failed with EPIPE.  */
      60                if (ret < 0 && errno == EPIPE)
      61                  exit (0);
      62                FALLTHROUGH;
      63              case 'A': /* The process should silently die.  */
      64              case 'C': /* The handler should have been called.  */
      65                fprintf (stderr, "write() returned %d with error %d.\n", ret, errno);
      66                exit (1);
      67              }
      68          }
      69      }
      70  }