7 |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
8 |
*/ |
*/ |
9 |
|
|
|
#include <stdio.h> |
|
|
#include <unistd.h> |
|
10 |
#include "libbb.h" |
#include "libbb.h" |
11 |
|
|
12 |
/* |
/* |
14 |
* This does multiple writes as necessary. |
* This does multiple writes as necessary. |
15 |
* Returns the amount written, or -1 on an error. |
* Returns the amount written, or -1 on an error. |
16 |
*/ |
*/ |
17 |
ssize_t full_write(int fd, const void *buf, size_t len) |
ssize_t FAST_FUNC full_write(int fd, const void *buf, size_t len) |
18 |
{ |
{ |
19 |
ssize_t cc; |
ssize_t cc; |
20 |
ssize_t total; |
ssize_t total; |
24 |
while (len) { |
while (len) { |
25 |
cc = safe_write(fd, buf, len); |
cc = safe_write(fd, buf, len); |
26 |
|
|
27 |
if (cc < 0) |
if (cc < 0) { |
28 |
|
if (total) { |
29 |
|
/* we already wrote some! */ |
30 |
|
/* user can do another write to know the error code */ |
31 |
|
return total; |
32 |
|
} |
33 |
return cc; /* write() returns -1 on failure. */ |
return cc; /* write() returns -1 on failure. */ |
34 |
|
} |
35 |
|
|
36 |
total += cc; |
total += cc; |
37 |
buf = ((const char *)buf) + cc; |
buf = ((const char *)buf) + cc; |