write_or_die.con commit git-svnimport: fix edge revisions double importing (6921677)
   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_or_whine(int fd, const void *buf, size_t count, const char *msg)
  39{
  40        const char *p = buf;
  41        ssize_t written;
  42
  43        while (count > 0) {
  44                written = xwrite(fd, p, count);
  45                if (written == 0) {
  46                        fprintf(stderr, "%s: disk full?\n", msg);
  47                        return 0;
  48                }
  49                else if (written < 0) {
  50                        if (errno == EPIPE)
  51                                exit(0);
  52                        fprintf(stderr, "%s: write error (%s)\n",
  53                                msg, strerror(errno));
  54                        return 0;
  55                }
  56                count -= written;
  57                p += written;
  58        }
  59
  60        return 1;
  61}
  62
  63int write_in_full(int fd, const void *buf, size_t count, const char *msg)
  64{
  65        const char *p = buf;
  66        ssize_t written;
  67
  68        while (count > 0) {
  69                written = xwrite(fd, p, count);
  70                if (written == 0) {
  71                        fprintf(stderr, "%s: disk full?\n", msg);
  72                        return 0;
  73                }
  74                else if (written < 0) {
  75                        fprintf(stderr, "%s: write error (%s)\n",
  76                                msg, strerror(errno));
  77                        return 0;
  78                }
  79                count -= written;
  80                p += written;
  81        }
  82
  83        return 1;
  84}