Hi, Björn! > > >404 for (;;) { > > >405 c = fgetc (f); > > >406 if (c == EOF) { > > >407 if (errno == EINTR) > > >408 continue; > > >--- > > > > I cannot reproduce this, but it is possible if previous system call was > > interrupted.
Exactly. Just add "errno = EINTR" in the beginning of the function and you have the problem. > > fgetc returns -1 on error and on end of file, so additional check needed. It's interesting that "info glibc" (glibc-2.2.4) doesn't mention what fgetc() returns if the call is interrupted before any single character has been read. I would prefer not to rely on the assumption that it's EOF (maybe it's documented somewhere else, but it's better to play safe). > I've also tried to reproduce this w/o success. I think we need to call > clearerr(_unlocked?) on line 408 above. (If found some usenet posts that > indicated that this is indeed necessary on Solaris. (Sorry, I that was > last week and I didn't save them.)) Actually, clearerr() would clear the EOF state from the descriptor, which would not help. What needs to be done is "errno = 0". I'm committing this patch. ============================ --- ChangeLog +++ ChangeLog @@ -1 +1,6 @@ +2001-12-21 Pavel Roskin <[EMAIL PROTECTED]> + + * syntax.c (read_one_line): Clear errno before using it. Don't + use the result of fgetc() if errno is EINTR. + 2001-11-28 Andrew V. Samoilov <[EMAIL PROTECTED]> --- syntax.c +++ syntax.c @@ -401,11 +401,12 @@ static int read_one_line (char **line, F #else p = syntax_malloc (len); #endif + errno = 0; for (;;) { c = fgetc (f); + if (errno == EINTR) + continue; if (c == EOF) { - if (errno == EINTR) - continue; r = 0; break; } else if (c == '\n') { ============================ -- Regards, Pavel Roskin _______________________________________________ Mc-devel mailing list [EMAIL PROTECTED] http://mail.gnome.org/mailman/listinfo/mc-devel