* [PATCH] Remove read_or_die in favor of better error messages.
@ 2007-01-14 6:01 Shawn O. Pearce
0 siblings, 0 replies; only message in thread
From: Shawn O. Pearce @ 2007-01-14 6:01 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Originally I introduced read_or_die for the purpose of reading
the pack header and trailer, and I was too lazy to print proper
error messages.
Linus Torvalds <torvalds@osdl.org>:
> For a read error, at the very least you have to say WHICH FILE
> couldn't be read, because it's usually a matter of some file just
> being too short, not some system-wide problem.
and of course Linus is right. Make it so.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
cache.h | 1 -
sha1_file.c | 6 ++++--
write_or_die.c | 12 ------------
3 files changed, 4 insertions(+), 15 deletions(-)
diff --git a/cache.h b/cache.h
index c482c32..620b6a4 100644
--- a/cache.h
+++ b/cache.h
@@ -434,7 +434,6 @@ extern char *git_log_output_encoding;
extern int copy_fd(int ifd, int ofd);
extern int read_in_full(int fd, void *buf, size_t count);
-extern void read_or_die(int fd, void *buf, size_t count);
extern int write_in_full(int fd, const void *buf, size_t count);
extern void write_or_die(int fd, const void *buf, size_t count);
extern int write_or_whine(int fd, const void *buf, size_t count, const char *msg);
diff --git a/sha1_file.c b/sha1_file.c
index 2a5be53..1b1c0f7 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -572,7 +572,8 @@ static void open_packed_git(struct packed_git *p)
die("cannot set FD_CLOEXEC");
/* Verify we recognize this pack file format. */
- read_or_die(p->pack_fd, &hdr, sizeof(hdr));
+ if (read_in_full(p->pack_fd, &hdr, sizeof(hdr)) != sizeof(hdr))
+ die("file %s is far too short to be a packfile", p->pack_name);
if (hdr.hdr_signature != htonl(PACK_SIGNATURE))
die("file %s is not a GIT packfile", p->pack_name);
if (!pack_version_ok(hdr.hdr_version))
@@ -588,7 +589,8 @@ static void open_packed_git(struct packed_git *p)
num_packed_objects(p));
if (lseek(p->pack_fd, p->pack_size - sizeof(sha1), SEEK_SET) == -1)
die("end of packfile %s is unavailable", p->pack_name);
- read_or_die(p->pack_fd, sha1, sizeof(sha1));
+ if (read_in_full(p->pack_fd, sha1, sizeof(sha1)) != sizeof(sha1))
+ die("packfile %s signature is unavailable", p->pack_name);
idx_sha1 = ((unsigned char *)p->index_base) + p->index_size - 40;
if (hashcmp(sha1, idx_sha1))
die("packfile %s does not match index", p->pack_name);
diff --git a/write_or_die.c b/write_or_die.c
index 4e8183e..046e79d 100644
--- a/write_or_die.c
+++ b/write_or_die.c
@@ -17,18 +17,6 @@ int read_in_full(int fd, void *buf, size_t count)
return total;
}
-void read_or_die(int fd, void *buf, size_t count)
-{
- ssize_t loaded;
-
- loaded = read_in_full(fd, buf, count);
- if (loaded != count) {
- if (loaded < 0)
- die("read error (%s)", strerror(errno));
- die("read error: end of file");
- }
-}
-
int write_in_full(int fd, const void *buf, size_t count)
{
const char *p = buf;
--
1.5.0.rc1.g4494
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2007-01-14 6:02 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-14 6:01 [PATCH] Remove read_or_die in favor of better error messages Shawn O. Pearce
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.