-
-struct cache_tree *read_cache_tree(unsigned char *sha1)
-{
- int fd;
- struct stat st;
- char path[PATH_MAX];
- unsigned long size = 0;
- void *map;
- struct cache_tree *it;
-
- sprintf(path, "%s.aux", get_index_file());
- fd = open(path, O_RDONLY);
- if (fd < 0)
- return cache_tree();
-
- if (fstat(fd, &st))
- return cache_tree();
- size = st.st_size;
- map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
- close(fd);
- if (map == MAP_FAILED)
- return cache_tree();
- it = cache_tree_read(sha1, map, size);
- munmap(map, size);
- if (!it)
- return cache_tree();
- return it;
-}
-
-int write_cache_tree(const unsigned char *sha1, struct cache_tree *root)
-{
- char path[PATH_MAX];
- unsigned long size = 0;
- void *buf, *buffer;
- int fd, ret = -1;
-
- sprintf(path, "%s.aux", get_index_file());
- if (!root) {
- unlink(path);
- return -1;
- }
- fd = open(path, O_WRONLY|O_CREAT, 0666);
- if (fd < 0)
- return -1;
- buffer = buf = cache_tree_write(sha1, root, &size);
- while (size) {
- int written = xwrite(fd, buf, size);
- if (written <= 0)
- goto fail;
- buf += written;
- size -= written;
- }
- ret = 0;
-
- fail:
- close(fd);
- free(buffer);
- if (ret)
- unlink(path);
- return ret;
-}