pack-objects: be incredibly anal about stdio semantics
authorLinus Torvalds <torvalds@osdl.org>
Sun, 2 Apr 2006 20:31:54 +0000 (13:31 -0700)
committerJunio C Hamano <junkio@cox.net>
Sun, 2 Apr 2006 20:46:27 +0000 (13:46 -0700)
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 <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
pack-objects.c

index cde4afa..084c200 100644 (file)
@@ -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;