1  /* Copyright (C) 1998-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library 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 GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <dirent.h>
      19  #include <errno.h>
      20  #include <fcntl.h>
      21  #include <stdio.h>
      22  #include <stdlib.h>
      23  #include <string.h>
      24  #include <unistd.h>
      25  #include <sys/stat.h>
      26  
      27  /* Name of the FIFO.  */
      28  char tmpname[] = "fifoXXXXXX";
      29  
      30  
      31  /* Do the real work.  */
      32  static int
      33  real_test (void)
      34  {
      35    DIR *dirp;
      36  
      37    /* This should not block for an FIFO.  */
      38    dirp = opendir (tmpname);
      39  
      40    /* Successful.  */
      41    if (dirp != NULL)
      42      {
      43        /* Oh, oh, how can this work?  */
      44        fputs ("`opendir' succeeded on a FIFO???\n", stdout);
      45        closedir (dirp);
      46        return 1;
      47      }
      48  
      49    if (errno != ENOTDIR)
      50      {
      51        fprintf (stdout, "`opendir' return error `%s' instead of `%s'\n",
      52  	       strerror (errno), strerror (ENOTDIR));
      53        return 1;
      54      }
      55  
      56    return 0;
      57  }
      58  
      59  
      60  static int
      61  do_test (void)
      62  {
      63    int retval;
      64  
      65    if (mktemp (tmpname) == NULL)
      66      {
      67        perror ("mktemp");
      68        return 1;
      69      }
      70  
      71    /* Try to generate a FIFO.  */
      72    if (mknod (tmpname, 0600 | S_IFIFO, 0) < 0)
      73      {
      74        perror ("mknod");
      75        /* We cannot make this an error.  */
      76        return 0;
      77      }
      78  
      79    retval = real_test ();
      80  
      81    remove (tmpname);
      82  
      83    return retval;
      84  }
      85  
      86  
      87  static void
      88  do_cleanup (void)
      89  {
      90    remove (tmpname);
      91  }
      92  #define CLEANUP_HANDLER do_cleanup
      93  
      94  #include <support/test-driver.c>