Mail Archives: djgpp-workers/2001/02/01/16:12:04
> From: Martin Str|mberg <ams AT ludd DOT luth DOT se>
> Date: Wed, 31 Jan 2001 22:10:34 +0100 (MET)
>
> According to Eli Zaretskii:
> >
> > On Wed, 31 Jan 2001, Martin Stromberg wrote:
> >
> > > > > Index: src/libc/ansi/stdio/doprnt.c
> > > > > +
> > > > > + if (fp->_flag & _IOAPPEND)
> > > > > + {
> > > > > + if ( llseek(fileno(fp), 0, SEEK_END) == -1 )
> > > > > + {
> > > > > + return (EOF);
> > > > > + }
> > > > > + }
> > > >
> > > > This shouldn't be needed; the flsbuf() call should move to EOF.
> > >
> > > Well, I tried without it and it didn't work.
> >
> > Are you sure you tried this with a handle which had _IOAPPEND flag set,
> > and with _flsbuf doing the Right Thing with _IOAPPEND?
> >
> > I don't see how could this not work, since _doprnt always calls putc to
> > output the text, and putc always calls _flsbuf.
>
> Well, I'm having a troubles looking at what flags are set. But if you
> try the test program in test/libc/ansi/stdio/append.c with and without
> this part you'll see the difference.
Ah, I see why. The test program prints a very short string and then
closes the file. So the entire text is buffered inside the FILE
object when fclose is called, and it is up to fclose to flush it.
fclose calls fflush, but fflush doesn't go through _fslbuf, it calls
_write directly. (I don't remember why, but it probably has a good
reason.)
Solution: add llseek to fflush, and you solved two problems: no need
for llseek in _doprnt, and a bug with writing the last portion of the
data from fflush is also squashed ;-)
- Raw text -