[PATCH 2/2] pack-objects: be incredibly anal about stdio semantics
- From
Linus Torvalds <torvalds@osdl.org>
- Date
- Apr 2, 2006, 20:31 UTC
- Message-ID
- <Pine.LNX.4.64.0604021328380.3050@g5.osdl.org>
- In-Reply-To
- <Pine.LNX.4.64.0604021312510.3050@g5.osdl.org>
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> ---
This is the same one that I already sent out, but re-diffed, and with a proper commit message.
Not tested on Solaris.
Junio - I think that I forgot to Cc: you on the 1/2 patch, but you'll see it on the git list.
diff --git a/pack-objects.c b/pack-objects.c index 1817b58..0ea16ad 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -1110,8 +1110,18 @@ int main(int argc, char **argv) setup_progress_signal(); } - while (fgets(line, sizeof(line), stdin) != NULL) { + for (;;) { 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 (line[0] == '-') { if (get_sha1_hex(line+1, sha1))