write_or_die.con commit short i/o: clean up the naming for the write_{in,or}_xxx family (e081405)
   1#include "cache.h"
   2
   3void read_or_die(int fd, void *buf, size_t count)
   4{
   5        char *p = buf;
   6        ssize_t loaded;
   7
   8        while (count > 0) {
   9                loaded = xread(fd, p, count);
  10                if (loaded == 0)
  11                        die("unexpected end of file");
  12                else if (loaded < 0)
  13                        die("read error (%s)", strerror(errno));
  14                count -= loaded;
  15                p += loaded;
  16        }
  17}
  18
  19void write_or_die(int fd, const void *buf, size_t count)
  20{
  21        const char *p = buf;
  22        ssize_t written;
  23
  24        while (count > 0) {
  25                written = xwrite(fd, p, count);
  26                if (written == 0)
  27                        die("disk full?");
  28                else if (written < 0) {
  29                        if (errno == EPIPE)
  30                                exit(0);
  31                        die("write error (%s)", strerror(errno));
  32                }
  33                count -= written;
  34                p += written;
  35        }
  36}
  37
  38int write_in_full(int fd, const void *buf, size_t count)
  39{
  40        const char *p = buf;
  41        ssize_t total = 0;
  42        ssize_t wcount = 0;
  43
  44        while (count > 0) {
  45                wcount = xwrite(fd, p, count);
  46                if (wcount <= 0) {
  47                        if (total)
  48                                return total;
  49                        else
  50                                return wcount;
  51                }
  52                count -= wcount;
  53                p += wcount;
  54                total += wcount;
  55        }
  56
  57        return wcount;
  58}
  59
  60int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg)
  61{
  62        ssize_t written;
  63
  64        written = write_in_full(fd, buf, count);
  65        if (written == 0) {
  66                fprintf(stderr, "%s: disk full?\n", msg);
  67                return 0;
  68        }
  69        else if (written < 0) {
  70                if (errno == EPIPE)
  71                        exit(0);
  72                fprintf(stderr, "%s: write error (%s)\n",
  73                        msg, strerror(errno));
  74                return 0;
  75        }
  76
  77        return 1;
  78}
  79
  80int write_or_whine(int fd, const void *buf, size_t count, const char *msg)
  81{
  82        ssize_t written;
  83
  84        written = write_in_full(fd, buf, count);
  85        if (written == 0) {
  86                fprintf(stderr, "%s: disk full?\n", msg);
  87                return 0;
  88        }
  89        else if (written < 0) {
  90                fprintf(stderr, "%s: write error (%s)\n",
  91                        msg, strerror(errno));
  92                return 0;
  93        }
  94
  95        return 1;
  96}