No specific user configuration
[platform/upstream/bash.git] / lib / sh / zwrite.c
1 /* zwrite - write contents of buffer to file descriptor, retrying on error */
2
3 /* Copyright (C) 1999-2002 Free Software Foundation, Inc.
4
5    This file is part of GNU Bash, the Bourne Again SHell.
6
7    Bash is free software: you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation, either version 3 of the License, or
10    (at your option) any later version.
11
12    Bash is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with Bash.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include <config.h>
22
23 #include <sys/types.h>
24
25 #if defined (HAVE_UNISTD_H)
26 #  include <unistd.h>
27 #endif
28
29 #include <errno.h>
30
31 #if !defined (errno)
32 extern int errno;
33 #endif
34
35 /* Write NB bytes from BUF to file descriptor FD, retrying the write if
36    it is interrupted.  We retry three times if we get a zero-length
37    write.  Any other signal causes this function to return prematurely. */
38 int
39 zwrite (fd, buf, nb)
40      int fd;
41      char *buf;
42      size_t nb;
43 {
44   int n, i, nt;
45
46   for (n = nb, nt = 0;;)
47     {
48       i = write (fd, buf, n);
49       if (i > 0)
50         {
51           n -= i;
52           if (n <= 0)
53             return nb;
54           buf += i;
55         }
56       else if (i == 0)
57         {
58           if (++nt > 3)
59             return (nb - n);
60         }
61       else if (errno != EINTR)
62         return -1;
63     }
64 }