diff options
author | Rene Scharfe <rene.scharfe@lsrfire.ath.cx> | 2006-08-21 20:43:43 +0200 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-08-21 20:22:23 -0700 |
commit | 7230e6d042ae385377f09c4d226d9b1aa7a2c13b (patch) | |
tree | 15c64d30f517ba50cac77f81efddc71d22666023 /builtin-tar-tree.c | |
parent | 3f0073a2fabce18303aeef154dd6ec5aa8faa5e7 (diff) | |
download | git-7230e6d042ae385377f09c4d226d9b1aa7a2c13b.tar.gz git-7230e6d042ae385377f09c4d226d9b1aa7a2c13b.tar.xz |
Add write_or_die(), a helper function
The little helper write_or_die() won't come back with bad news about
full disks or broken pipes. It either succeeds or terminates the
program, making additional error handling unnecessary.
This patch adds the new function and uses it to replace two similar
ones (the one in tar-tree originally has been copied from cat-file
btw.). I chose to add the fd parameter which both lacked to make
write_or_die() just as flexible as write() and thus suitable for
lib-ification.
There is a regression: error messages emitted by this function don't
show the program name, while the replaced two functions did. That's
acceptable, I think; a lot of other functions do the same.
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'builtin-tar-tree.c')
-rw-r--r-- | builtin-tar-tree.c | 27 |
1 files changed, 4 insertions, 23 deletions
diff --git a/builtin-tar-tree.c b/builtin-tar-tree.c index aeb5a8c2a..e0bcb0a1e 100644 --- a/builtin-tar-tree.c +++ b/builtin-tar-tree.c @@ -22,30 +22,11 @@ static unsigned long offset; static time_t archive_time; static int tar_umask; -/* tries hard to write, either succeeds or dies in the attempt */ -static void reliable_write(const void *data, unsigned long size) -{ - const char *buf = data; - - while (size > 0) { - long ret = xwrite(1, buf, size); - if (ret < 0) { - if (errno == EPIPE) - exit(0); - die("git-tar-tree: %s", strerror(errno)); - } else if (!ret) { - die("git-tar-tree: disk full?"); - } - size -= ret; - buf += ret; - } -} - /* writes out the whole block, but only if it is full */ static void write_if_needed(void) { if (offset == BLOCKSIZE) { - reliable_write(block, BLOCKSIZE); + write_or_die(1, block, BLOCKSIZE); offset = 0; } } @@ -70,7 +51,7 @@ static void write_blocked(const void *data, unsigned long size) write_if_needed(); } while (size >= BLOCKSIZE) { - reliable_write(buf, BLOCKSIZE); + write_or_die(1, buf, BLOCKSIZE); size -= BLOCKSIZE; buf += BLOCKSIZE; } @@ -94,10 +75,10 @@ static void write_trailer(void) { int tail = BLOCKSIZE - offset; memset(block + offset, 0, tail); - reliable_write(block, BLOCKSIZE); + write_or_die(1, block, BLOCKSIZE); if (tail < 2 * RECORDSIZE) { memset(block, 0, offset); - reliable_write(block, BLOCKSIZE); + write_or_die(1, block, BLOCKSIZE); } } |