Elaborate comment.
[gnulib.git] / lib / full-write.c
1 /* full-write.c -- an interface to write that retries after interrupts
2    Copyright (C) 1993, 1994 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program 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
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18    Copied largely from GNU C's cccp.c.
19    */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <sys/types.h>
26
27 #ifdef HAVE_UNISTD_H
28 #include <unistd.h>
29 #endif
30
31 #include <errno.h>
32 #ifndef errno
33 extern int errno;
34 #endif
35
36 /* Write LEN bytes at PTR to descriptor DESC, retrying if interrupted.
37    Return LEN upon success, write's (negative) error code otherwise.
38    As the name implies, this function writes all LEN bytes and returns
39    LEN or it fails and returns the negative value returned by the (final)
40    failing write.  */
41
42 int
43 full_write (desc, ptr, len)
44      int desc;
45      char *ptr;
46      size_t len;
47 {
48   int total_written;
49
50   total_written = 0;
51   while (len > 0)
52     {
53       int written = write (desc, ptr, len);
54       if (written < 0)
55         {
56 #ifdef EINTR
57           if (errno == EINTR)
58             continue;
59 #endif
60           return written;
61         }
62       total_written += written;
63       ptr += written;
64       len -= written;
65     }
66   return total_written;
67 }