busybox/libbb/full_write.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * Utility routines.
   4 *
   5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
   6 *
   7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
   8 */
   9#include "libbb.h"
  10
  11/*
  12 * Write all of the supplied buffer out to a file.
  13 * This does multiple writes as necessary.
  14 * Returns the amount written, or -1 on an error.
  15 */
  16ssize_t FAST_FUNC full_write(int fd, const void *buf, size_t len)
  17{
  18        ssize_t cc;
  19        ssize_t total;
  20
  21        total = 0;
  22
  23        while (len) {
  24                cc = safe_write(fd, buf, len);
  25
  26                if (cc < 0) {
  27                        if (total) {
  28                                /* we already wrote some! */
  29                                /* user can do another write to know the error code */
  30                                return total;
  31                        }
  32                        return cc;  /* write() returns -1 on failure. */
  33                }
  34
  35                total += cc;
  36                buf = ((const char *)buf) + cc;
  37                len -= cc;
  38        }
  39
  40        return total;
  41}
  42