copy.con commit git-svn: allow 'init' to act as multi-init (dadc6d2)
   1#include "cache.h"
   2
   3int copy_fd(int ifd, int ofd)
   4{
   5        while (1) {
   6                int len;
   7                char buffer[8192];
   8                char *buf = buffer;
   9                len = xread(ifd, buffer, sizeof(buffer));
  10                if (!len)
  11                        break;
  12                if (len < 0) {
  13                        int read_error;
  14                        read_error = errno;
  15                        close(ifd);
  16                        return error("copy-fd: read returned %s",
  17                                     strerror(read_error));
  18                }
  19                while (len) {
  20                        int written = xwrite(ofd, buf, len);
  21                        if (written > 0) {
  22                                buf += written;
  23                                len -= written;
  24                        }
  25                        else if (!written) {
  26                                close(ifd);
  27                                return error("copy-fd: write returned 0");
  28                        } else {
  29                                close(ifd);
  30                                return error("copy-fd: write returned %s",
  31                                             strerror(errno));
  32                        }
  33                }
  34        }
  35        close(ifd);
  36        return 0;
  37}
  38