write_or_die.con commit merge-recursive: separate out xdl_merge() interface. (3e5261a)
   1#include "cache.h"
   2
   3int read_in_full(int fd, void *buf, size_t count)
   4{
   5        char *p = buf;
   6        ssize_t total = 0;
   7
   8        while (count > 0) {
   9                ssize_t loaded = xread(fd, p, count);
  10                if (loaded <= 0)
  11                        return total ? total : loaded;
  12                count -= loaded;
  13                p += loaded;
  14                total += loaded;
  15        }
  16
  17        return total;
  18}
  19
  20int write_in_full(int fd, const void *buf, size_t count)
  21{
  22        const char *p = buf;
  23        ssize_t total = 0;
  24
  25        while (count > 0) {
  26                ssize_t written = xwrite(fd, p, count);
  27                if (written < 0)
  28                        return -1;
  29                if (!written) {
  30                        errno = ENOSPC;
  31                        return -1;
  32                }
  33                count -= written;
  34                p += written;
  35                total += written;
  36        }
  37
  38        return total;
  39}
  40
  41void write_or_die(int fd, const void *buf, size_t count)
  42{
  43        if (write_in_full(fd, buf, count) < 0) {
  44                if (errno == EPIPE)
  45                        exit(0);
  46                die("write error (%s)", strerror(errno));
  47        }
  48}
  49
  50int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg)
  51{
  52        if (write_in_full(fd, buf, count) < 0) {
  53                if (errno == EPIPE)
  54                        exit(0);
  55                fprintf(stderr, "%s: write error (%s)\n",
  56                        msg, strerror(errno));
  57                return 0;
  58        }
  59
  60        return 1;
  61}
  62
  63int write_or_whine(int fd, const void *buf, size_t count, const char *msg)
  64{
  65        if (write_in_full(fd, buf, count) < 0) {
  66                fprintf(stderr, "%s: write error (%s)\n",
  67                        msg, strerror(errno));
  68                return 0;
  69        }
  70
  71        return 1;
  72}