aboutsummaryrefslogtreecommitdiff
path: root/write_or_die.c
diff options
context:
space:
mode:
authorAndy Whitcroft <apw@shadowen.org>2007-01-08 15:58:23 +0000
committerJunio C Hamano <junkio@cox.net>2007-01-08 15:44:47 -0800
commit93822c2239a336e5cb583549071c59202ef6c5b2 (patch)
treef0c0a11adb226671e6e71803fa7d41d274aa7807 /write_or_die.c
parent93d26e4cb9cec2eb8abb4f37e6dda2c86fcceeac (diff)
downloadgit-93822c2239a336e5cb583549071c59202ef6c5b2.tar.gz
git-93822c2239a336e5cb583549071c59202ef6c5b2.tar.xz
short i/o: fix calls to write to use xwrite or write_in_full
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>
Diffstat (limited to 'write_or_die.c')
-rw-r--r--write_or_die.c45
1 files changed, 20 insertions, 25 deletions
diff --git a/write_or_die.c b/write_or_die.c
index e7f82639f..a119e1d20 100644
--- a/write_or_die.c
+++ b/write_or_die.c
@@ -33,45 +33,40 @@ void read_or_die(int fd, void *buf, size_t count)
die("read error (%s)", strerror(errno));
}
-void write_or_die(int fd, const void *buf, size_t count)
+int write_in_full(int fd, const void *buf, size_t count)
{
const char *p = buf;
- ssize_t written;
+ ssize_t total = 0;
+ ssize_t written = 0;
while (count > 0) {
written = xwrite(fd, p, count);
- if (written == 0)
- die("disk full?");
- else if (written < 0) {
- if (errno == EPIPE)
- exit(0);
- die("write error (%s)", strerror(errno));
+ if (written <= 0) {
+ if (total)
+ return total;
+ else
+ return written;
}
count -= written;
p += written;
+ total += written;
}
+
+ return total;
}
-int write_in_full(int fd, const void *buf, size_t count)
+void write_or_die(int fd, const void *buf, size_t count)
{
- const char *p = buf;
- ssize_t total = 0;
- ssize_t wcount = 0;
+ ssize_t written;
- while (count > 0) {
- wcount = xwrite(fd, p, count);
- if (wcount <= 0) {
- if (total)
- return total;
- else
- return wcount;
- }
- count -= wcount;
- p += wcount;
- total += wcount;
+ written = write_in_full(fd, buf, count);
+ if (written == 0)
+ die("disk full?");
+ else if (written < 0) {
+ if (errno == EPIPE)
+ exit(0);
+ die("write error (%s)", strerror(errno));
}
-
- return wcount;
}
int write_or_whine_pipe(int fd, const void *buf, size_t count, const char *msg)