annotate lib/pipe-filter-aux.h @ 40057:b06060465f09

maint: Run 'make update-copyright'
author Paul Eggert <eggert@cs.ucla.edu>
date Tue, 01 Jan 2019 00:25:11 +0100
parents 10eb9086bea0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11758
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Auxiliary code for filtering of data through a subprocess.
40057
b06060465f09 maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents: 19484
diff changeset
2 Copyright (C) 2001-2003, 2008-2019 Free Software Foundation, Inc.
11758
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3 Written by Bruno Haible <haible@clisp.cons.org>, 2009.
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 This program is free software: you can redistribute it and/or modify
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 it under the terms of the GNU General Public License as published by
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 the Free Software Foundation; either version 3 of the License, or
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8 (at your option) any later version.
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 This program is distributed in the hope that it will be useful,
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13 GNU General Public License for more details.
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
19190
9759915b2aca all: prefer https: URLs
Paul Eggert <eggert@cs.ucla.edu>
parents: 18626
diff changeset
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
11758
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17
17473
1f9070ef79b0 headers: check that _GL_INLINE_HEADER_BEGIN is defined
Paul Eggert <eggert@cs.ucla.edu>
parents: 17249
diff changeset
18 #ifndef _GL_INLINE_HEADER_BEGIN
1f9070ef79b0 headers: check that _GL_INLINE_HEADER_BEGIN is defined
Paul Eggert <eggert@cs.ucla.edu>
parents: 17249
diff changeset
19 #error "Please include config.h first."
1f9070ef79b0 headers: check that _GL_INLINE_HEADER_BEGIN is defined
Paul Eggert <eggert@cs.ucla.edu>
parents: 17249
diff changeset
20 #endif
17101
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
21 _GL_INLINE_HEADER_BEGIN
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
22 #ifndef PIPE_FILTER_AUX_INLINE
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
23 # define PIPE_FILTER_AUX_INLINE _GL_INLINE
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
24 #endif
11758
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #ifndef SSIZE_MAX
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 # define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28 #endif
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 /* We use a child process, and communicate through a bidirectional pipe.
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 To avoid deadlocks, let the child process decide when it wants to read
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 or to write, and let the parent behave accordingly. The parent uses
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 select() to know whether it must write or read. On platforms without
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34 select(), we use non-blocking I/O. (This means the parent is busy
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 looping while waiting for the child. Not good. But hardly any platform
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 lacks select() nowadays.) */
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37
18203
6adc50986538 pipe-filter-aux: undefine HAVE_SELECT on KLIBC
KO Myung-Hun <komh78@gmail.com>
parents: 18189
diff changeset
38 /* On BeOS and OS/2 kLIBC select() works only on sockets, not on normal file
6adc50986538 pipe-filter-aux: undefine HAVE_SELECT on KLIBC
KO Myung-Hun <komh78@gmail.com>
parents: 18189
diff changeset
39 descriptors. */
6adc50986538 pipe-filter-aux: undefine HAVE_SELECT on KLIBC
KO Myung-Hun <komh78@gmail.com>
parents: 18189
diff changeset
40 #if defined __BEOS__ || defined __KLIBC__
11758
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 # undef HAVE_SELECT
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 #endif
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 #ifdef EINTR
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46 /* EINTR handling for close(), read(), write(), select().
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 These functions can return -1/EINTR even though we don't have any
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 signal handlers set up, namely when we get interrupted via SIGSTOP. */
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49
17101
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
50 PIPE_FILTER_AUX_INLINE int
11758
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 nonintr_close (int fd)
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 {
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 int retval;
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
54
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
55 do
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
56 retval = close (fd);
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
57 while (retval < 0 && errno == EINTR);
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
58
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
59 return retval;
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
60 }
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
61 #undef close /* avoid warning related to gnulib module unistd */
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
62 #define close nonintr_close
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
63
17101
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
64 PIPE_FILTER_AUX_INLINE ssize_t
11758
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
65 nonintr_read (int fd, void *buf, size_t count)
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
66 {
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 ssize_t retval;
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
69 do
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
70 retval = read (fd, buf, count);
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
71 while (retval < 0 && errno == EINTR);
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
72
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
73 return retval;
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
74 }
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
75 #define read nonintr_read
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
76
17101
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
77 PIPE_FILTER_AUX_INLINE ssize_t
11758
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
78 nonintr_write (int fd, const void *buf, size_t count)
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
79 {
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
80 ssize_t retval;
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
81
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
82 do
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
83 retval = write (fd, buf, count);
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
84 while (retval < 0 && errno == EINTR);
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
85
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
86 return retval;
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
87 }
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
88 #undef write /* avoid warning on VMS */
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
89 #define write nonintr_write
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
90
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
91 #endif
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
92
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
93 /* Non-blocking I/O. */
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
94 #if HAVE_SELECT
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
95 # define IS_EAGAIN(errcode) 0
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
96 #else
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
97 # ifdef EWOULDBLOCK
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
98 # define IS_EAGAIN(errcode) ((errcode) == EAGAIN || (errcode) == EWOULDBLOCK)
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
99 # else
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
100 # define IS_EAGAIN(errcode) ((errcode) == EAGAIN)
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
101 # endif
c4cba25224b1 New module 'pipe-filter-ii'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
102 #endif
17101
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
103
99fa3b05f1c8 pipe-filter-gi, pipe-filter-ii: better use of 'inline'
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
104 _GL_INLINE_HEADER_END