cat-file.con commit Cleanup the x-allocation functions (127cfd0)
   1/*
   2 * GIT - The information manager from hell
   3 *
   4 * Copyright (C) Linus Torvalds, 2005
   5 */
   6#include "cache.h"
   7
   8int main(int argc, char **argv)
   9{
  10        unsigned char sha1[20];
  11        char type[20];
  12        void *buf;
  13        unsigned long size;
  14
  15        if (argc != 3 || get_sha1(argv[2], sha1))
  16                usage("git-cat-file [-t | tagname] <sha1>");
  17
  18        if (!strcmp("-t", argv[1])) {
  19                buf = read_sha1_file(sha1, type, &size);
  20                if (buf) {
  21                        buf = type;
  22                        size = strlen(type);
  23                        type[size] = '\n';
  24                        size++;
  25                }
  26        } else {
  27                buf = read_object_with_reference(sha1, argv[1], &size, NULL);
  28        }
  29
  30        if (!buf)
  31                die("git-cat-file %s: bad file", argv[2]);
  32
  33        while (size > 0) {
  34                long ret = write(1, buf, size);
  35                if (ret < 0) {
  36                        if (errno == EAGAIN)
  37                                continue;
  38                        /* Ignore epipe */
  39                        if (errno == EPIPE)
  40                                break;
  41                        die("git-cat-file: %s", strerror(errno));
  42                } else if (!ret) {
  43                        die("git-cat-file: disk full?");
  44                }
  45                size -= ret;
  46                buf += ret;
  47        }
  48        return 0;
  49}