tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: fopen(.., "a") + fseek

>>> [...fopen(...,"a"), then fseek...]
>> However the fseek() doesn't fail, it is just mostly useless.
> So, a mostly aimless standards-pedantic question: does the implicit
> seek associated with append mode actually count as a call to a file
> positioning function, allowing one to call fread() followed
> immediately by fwrite()?

"No", I think.  Found in fopen.c (fopen.c,v 1.13, which was current as
of something like 20 hours ago):

         * When opening in append mode, even though we use O_APPEND,
         * we need to seek to the end so that ftell() gets the right
         * answer.  If the user then alters the seek pointer, or
         * the file extends, this will fail, but there is not much
         * we can do about this.  (We could set __SAPP and check in
         * fseek and ftell.)

> (And, FWIW, I'm pretty sure the historic behavior of stdio is that
> "a" does not necessarily have this behavior; according to old
> security lore you have to open() with O_APPEND if you really want to
> be sure you're appending, e.g. in the presence of multiple writer
> processes.  If you just use fopen and "a" you might get just one seek
> to eof at open time.)

I suspect - and it is just suspicion, based on _very_ fuzzy memory from
the days when I was working with 4.2BSD and 4.3BSD - that this is a
historical artifact, due to a substantial delay between O_APPEND
appearing and fopen(,"a") using it.  (If anyone can refute or support
that suspicion, I'd be interested.)

/~\ The ASCII                             Mouse
\ / Ribbon Campaign
 X  Against HTML      
/ \ Email!           7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B

Home | Main Index | Thread Index | Old Index