OpenCoverage

isapipe.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/coreutils/src/gnulib/lib/isapipe.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* Test whether a file descriptor is a pipe.-
2-
3 Copyright (C) 2006, 2008-2018 Free Software Foundation, Inc.-
4-
5 This program is free software: you can redistribute it and/or modify-
6 it under the terms of the GNU General Public License as published by-
7 the Free Software Foundation; either version 3 of the License, or-
8 (at your option) any later version.-
9-
10 This program is distributed in the hope that it will be useful,-
11 but WITHOUT ANY WARRANTY; without even the implied warranty of-
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
13 GNU General Public License for more details.-
14-
15 You should have received a copy of the GNU General Public License-
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */-
17-
18/* Written by Paul Eggert. */-
19-
20#include <config.h>-
21-
22#include "isapipe.h"-
23-
24#include <errno.h>-
25-
26#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__-
27/* Windows platforms. */-
28-
29/* Get GetFileType. */-
30# include <windows.h>-
31-
32/* Get _get_osfhandle. */-
33# if GNULIB_MSVC_NOTHROW-
34# include "msvc-nothrow.h"-
35# else-
36# include <io.h>-
37# endif-
38-
39int-
40isapipe (int fd)-
41{-
42 HANDLE h = (HANDLE) _get_osfhandle (fd);-
43-
44 if (h == INVALID_HANDLE_VALUE)-
45 {-
46 errno = EBADF;-
47 return -1;-
48 }-
49-
50 return (GetFileType (h) == FILE_TYPE_PIPE);-
51}-
52-
53#else-
54/* Unix platforms. */-
55-
56# include <stdbool.h>-
57# include <sys/types.h>-
58# include <sys/stat.h>-
59# include <unistd.h>-
60-
61/* The maximum link count for pipes; (nlink_t) -1 if not known. */-
62# ifndef PIPE_LINK_COUNT_MAX-
63# define PIPE_LINK_COUNT_MAX ((nlink_t) (-1))-
64# endif-
65-
66/* Return 1 if FD is a pipe, 0 if not, -1 (setting errno) on error.-
67-
68 Test fairly strictly whether FD is a pipe. lseek and checking for-
69 ESPIPE does not suffice, since many non-pipe files cause lseek to-
70 fail with errno == ESPIPE. */-
71-
72int-
73isapipe (int fd)-
74{-
75 nlink_t pipe_link_count_max = PIPE_LINK_COUNT_MAX;-
76 bool check_for_fifo = (HAVE_FIFO_PIPES == 1);-
77 struct stat st;-
78 int fstat_result = fstat (fd, &st);-
79-
80 if (fstat_result != 0)
fstat_result != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
81 return fstat_result;
never executed: return fstat_result;
0
82-
83 /* We want something that succeeds only for pipes, but on-
84 POSIX-conforming hosts S_ISFIFO succeeds for both FIFOs and pipes-
85 and we know of no portable, reliable way to distinguish them in-
86 general. However, in practice pipes always have a link count <=-
87 PIPE_LINK_COUNT_MAX (unless someone attaches them to the file-
88 system name space using fattach, in which case they're not really-
89 pipes any more), so test for that as well.-
90-
91 On Darwin 7.7, pipes are sockets, so check for those instead. */-
92-
93 if (! ((HAVE_FIFO_PIPES == 0 || HAVE_FIFO_PIPES == 1)
1 == 0Description
TRUEnever evaluated
FALSEnever evaluated
1 == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
94 && PIPE_LINK_COUNT_MAX != (nlink_t) -1)
(1) != (nlink_t) -1Description
TRUEnever evaluated
FALSEnever evaluated
0
95 && (S_ISFIFO (st.st_mode) | S_ISSOCK (st.st_mode)))
( (((( st.st_m...= (0140000)) )Description
TRUEnever evaluated
FALSEnever evaluated
0
96 {-
97 int fd_pair[2];-
98 int pipe_result = pipe (fd_pair);-
99 if (pipe_result != 0)
pipe_result != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
100 return pipe_result;
never executed: return pipe_result;
0
101 else-
102 {-
103 struct stat pipe_st;-
104 int fstat_pipe_result = fstat (fd_pair[0], &pipe_st);-
105 int fstat_pipe_errno = errno;-
106 close (fd_pair[0]);-
107 close (fd_pair[1]);-
108 if (fstat_pipe_result != 0)
fstat_pipe_result != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
109 {-
110 errno = fstat_pipe_errno;-
111 return fstat_pipe_result;
never executed: return fstat_pipe_result;
0
112 }-
113 check_for_fifo = (S_ISFIFO (pipe_st.st_mode) != 0);-
114 pipe_link_count_max = pipe_st.st_nlink;-
115 }
never executed: end of block
0
116 }-
117-
118 return
never executed: return (st.st_nlink <= pipe_link_count_max && (check_for_fifo ? (((( st.st_mode )) & 0170000) == (0010000)) : (((( st.st_mode )) & 0170000) == (0140000)) ));
0
119 (st.st_nlink <= pipe_link_count_max
never executed: return (st.st_nlink <= pipe_link_count_max && (check_for_fifo ? (((( st.st_mode )) & 0170000) == (0010000)) : (((( st.st_mode )) & 0170000) == (0140000)) ));
0
120 && (check_for_fifo ? S_ISFIFO (st.st_mode) : S_ISSOCK (st.st_mode)));
never executed: return (st.st_nlink <= pipe_link_count_max && (check_for_fifo ? (((( st.st_mode )) & 0170000) == (0010000)) : (((( st.st_mode )) & 0170000) == (0140000)) ));
0
121}-
122-
123#endif-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2