From da93d12b00425a37e81e227671f13130efcfe93f Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sun, 2 Apr 2006 13:31:54 -0700 Subject: [PATCH] pack-objects: be incredibly anal about stdio semantics This is the "letter of the law" version of using fgets() properly in the face of incredibly broken stdio implementations. We can work around the Solaris breakage with SA_RESTART, but in case anybody else is ever that stupid, here's the "safe" (read: "insanely anal") way to use fgets. It probably goes without saying that I'm not terribly impressed by Solaris libc. Signed-off-by: Linus Torvalds Signed-off-by: Junio C Hamano --- pack-objects.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pack-objects.c b/pack-objects.c index cde4afa798..084c2006a9 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -905,11 +905,21 @@ int main(int argc, char **argv) setup_progress_signal(); } - while (fgets(line, sizeof(line), stdin) != NULL) { + for (;;) { unsigned int hash; char *p; unsigned char sha1[20]; + if (!fgets(line, sizeof(line), stdin)) { + if (feof(stdin)) + break; + if (!ferror(stdin)) + die("fgets returned NULL, not EOF, not error!"); + if (errno == EINTR) + continue; + die("fgets: %s", strerror(errno)); + } + if (progress_update) { fprintf(stderr, "Counting objects...%d\r", nr_objects); progress_update = 0;