Merge branch 'upstream' into stable
[gnulib.git] / m4 / isapipe.m4
1 # Test whether a file descriptor is a pipe.
2
3 dnl Copyright (C) 2006, 2009-2010 Free Software Foundation, Inc.
4
5 dnl This file is free software; the Free Software Foundation
6 dnl gives unlimited permission to copy and/or distribute it,
7 dnl with or without modifications, as long as this notice is preserved.
8
9 dnl Written by Paul Eggert.
10
11 AC_DEFUN([gl_ISAPIPE],
12 [
13   # OpenVMS has isapipe already, so check for it.
14   AC_REPLACE_FUNCS([isapipe])
15   if test $ac_cv_func_isapipe = no; then
16     gl_PREREQ_ISAPIPE
17   fi
18 ])
19
20 # Prerequisites of lib/isapipe.c.
21 AC_DEFUN([gl_PREREQ_ISAPIPE],
22 [
23   AC_CACHE_CHECK([whether pipes are FIFOs (and for their link count)],
24     [gl_cv_pipes_are_fifos],
25     [AC_RUN_IFELSE(
26        [AC_LANG_SOURCE(
27           [[#include <stdio.h>
28             #include <sys/types.h>
29             #include <sys/stat.h>
30             #include <unistd.h>
31             #ifndef S_ISFIFO
32              #define S_ISFIFO(m) 0
33             #endif
34             #ifndef S_ISSOCK
35              #define S_ISSOCK(m) 0
36             #endif
37             int
38             main (int argc, char **argv)
39             {
40               int fd[2];
41               struct stat st;
42               if (pipe (fd) != 0)
43                 return 1;
44               if (fstat (fd[0], &st) != 0)
45                 return 2;
46               if (2 <= argc && argv[1][0] == '-')
47                 {
48                   char const *yesno = (S_ISFIFO (st.st_mode) ? "yes" : "no");
49                   if (st.st_nlink <= 1)
50                     {
51                       long int i = st.st_nlink;
52                       if (i != st.st_nlink)
53                         return 3;
54                       printf ("%s (%ld)\n", yesno, i);
55                     }
56                   else
57                     {
58                       unsigned long int i = st.st_nlink;
59                       if (i != st.st_nlink)
60                         return 4;
61                       printf ("%s (%lu)\n", yesno, i);
62                     }
63                 }
64               else
65                 {
66                   if (! S_ISFIFO (st.st_mode) && ! S_ISSOCK (st.st_mode))
67                     return 5;
68                 }
69               return 0;
70             }]])],
71        [gl_cv_pipes_are_fifos=`./conftest$ac_exeext -`
72         test -z "$gl_cv_pipes_are_fifos" && gl_cv_pipes_are_fifos=no],
73        [gl_cv_pipes_are_fifos=unknown],
74        [gl_cv_pipes_are_fifos=cross-compiling])])
75
76   case $gl_cv_pipes_are_fifos in #(
77   'yes ('*')')
78     AC_DEFINE([HAVE_FIFO_PIPES], [1],
79       [Define to 1 if pipes are FIFOs, 0 if sockets.  Leave undefined
80        if not known.]);; #(
81   'no ('*')')
82     AC_DEFINE([HAVE_FIFO_PIPES], [0]);;
83   esac
84
85   case $gl_cv_pipes_are_fifos in #(
86   *'('*')')
87     AC_DEFINE_UNQUOTED([PIPE_LINK_COUNT_MAX],
88       [`expr "$gl_cv_pipes_are_fifos" : '.*\((.*)\)'`],
89       [Define to the maximum link count that a true pipe can have.]);;
90   esac
91 ])