e7f82639ffb068dd754855ca464a20721a36c9db
   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        ssize_t loaded = 0;
   8
   9        while (count > 0) {
  10                loaded = xread(fd, p, count);
  11                if (loaded <= 0) {
  12                        if (total)
  13                                return total;
  14                        else
  15                                return loaded;
  16                }
  17                count -= loaded;
  18                p += loaded;
  19                total += loaded;
  20        }
  21
  22        return total;
  23}
  24
  25void read_or_die(int fd, void *buf, size_t count)
  26{
  27        ssize_t loaded;
  28
  29        loaded = read_in_full(fd, buf, count);
  30        if (loaded == 0)
  31                die("unexpected end of file");
  32        else if (loaded < 0)
  33                die("read error (%s)", strerror(errno));
  34}
  35
  36void write_or_die(int fd, const void *buf, size_t count)
  37{
  38        const char *p = buf;
  39        ssize_t written;
  40
  41        while (count > 0) {
  42                written = xwrite(fd, p, count);
  43                if (written == 0)
  44                        die("disk full?");
  45                else if (written < 0) {
  46                        if (errno == EPIPE)
  47                                exit(0);
  48                        die("write error (%s)", strerror(errno));
  49                }
  50                count -= written;
  51                p += written;
  52        }
  53}
  54
  55int write_in_full(int fd, const void *buf, size_t count)
  56{
  57        const char *p = buf;
  58        ssize_t total = 0;
  59        ssize_t wcount = 0;
  60
  61        while (count > 0) {
  62                wcount = xwrite(fd, p, count);
  63                if (wcount <= 0) {
  64                        if (total)
  65                                return total;
  66                        else
  67                                return wcount;
  68                }
  69                count -= wcount;
  70                p += wcount;
  71                total += wcount;
  72        }
  73
  74        return wcount;
  75}
  76
  77int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg)
  78{
  79        ssize_t written;
  80
  81        written = write_in_full(fd, buf, count);
  82        if (written == 0) {
  83                fprintf(stderr, "%s: disk full?\n", msg);
  84                return 0;
  85        }
  86        else if (written < 0) {
  87                if (errno == EPIPE)
  88                        exit(0);
  89                fprintf(stderr, "%s: write error (%s)\n",
  90                        msg, strerror(errno));
  91                return 0;
  92        }
  93
  94        return 1;
  95}
  96
  97int write_or_whine(int fd, const void *buf, size_t count, const char *msg)
  98{
  99        ssize_t written;
 100
 101        written = write_in_full(fd, buf, count);
 102        if (written == 0) {
 103                fprintf(stderr, "%s: disk full?\n", msg);
 104                return 0;
 105        }
 106        else if (written < 0) {
 107                fprintf(stderr, "%s: write error (%s)\n",
 108                        msg, strerror(errno));
 109                return 0;
 110        }
 111
 112        return 1;
 113}