93822c2239
We have a number of badly checked write() calls. Often we are expecting write() to write exactly the size we requested or fail, this fails to handle interrupts or short writes. Switch to using the new write_in_full(). Otherwise we at a minimum need to check for EINTR and EAGAIN, where this is appropriate use xwrite(). Note, the changes to config handling are much larger and handled in the next patch in the sequence. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
41 lines
820 B
C
41 lines
820 B
C
#include "cache.h"
|
|
#include "blob.h"
|
|
|
|
static char *create_temp_file(unsigned char *sha1)
|
|
{
|
|
static char path[50];
|
|
void *buf;
|
|
char type[100];
|
|
unsigned long size;
|
|
int fd;
|
|
|
|
buf = read_sha1_file(sha1, type, &size);
|
|
if (!buf || strcmp(type, blob_type))
|
|
die("unable to read blob object %s", sha1_to_hex(sha1));
|
|
|
|
strcpy(path, ".merge_file_XXXXXX");
|
|
fd = mkstemp(path);
|
|
if (fd < 0)
|
|
die("unable to create temp-file");
|
|
if (write_in_full(fd, buf, size) != size)
|
|
die("unable to write temp-file");
|
|
close(fd);
|
|
return path;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
unsigned char sha1[20];
|
|
|
|
if (argc != 2)
|
|
usage("git-unpack-file <sha1>");
|
|
if (get_sha1(argv[1], sha1))
|
|
die("Not a valid object name %s", argv[1]);
|
|
|
|
setup_git_directory();
|
|
git_config(git_default_config);
|
|
|
|
puts(create_temp_file(sha1));
|
|
return 0;
|
|
}
|