diff options
| author | Michele Bini <rev@alienbuntu.local> | 2019-04-18 22:12:22 (GMT) |
|---|---|---|
| committer | Michele Bini <rev@alienbuntu.local> | 2019-04-18 22:13:11 (GMT) |
| commit | 3567ae383ea8d19f054ba138c8250446cc4a8bb1 (patch) | |
| tree | d7d23be597c2ffb7176fbaa511050a067947a62f /full_write.c | |
| parent | da7ba579a7d9a95457f87bc5389a53b12d6fc9cb (diff) | |
.
Diffstat (limited to 'full_write.c')
| -rw-r--r-- | full_write.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/full_write.c b/full_write.c new file mode 100644 index 0000000..777fbd9 --- /dev/null +++ b/full_write.c @@ -0,0 +1,42 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> + * + * Licensed under GPLv2 or later, see file LICENSE in this source tree. + */ + +#include "libbb.h" + +/* + * Write all of the supplied buffer out to a file. + * This does multiple writes as necessary. + * Returns the amount written, or -1 on an error. + */ +ssize_t FAST_FUNC full_write(int fd, const void *buf, size_t len) +{ + ssize_t cc; + ssize_t total; + + total = 0; + + while (len) { + cc = safe_write(fd, buf, len); + + if (cc < 0) { + if (total) { + /* we already wrote some! */ + /* user can do another write to know the error code */ + return total; + } + return cc; /* write() returns -1 on failure. */ + } + + total += cc; + buf = ((const char *)buf) + cc; + len -= cc; + } + + return total; +} |
