*BSD News Article 2611


Return to BSD News archive

Path: sserve!manuel!munnari.oz.au!network.ucsd.edu!sdd.hp.com!usc!isi.edu!gremlin!lazarus.nrtc.northrop.com!dec
From: dec@lazarus.nrtc.northrop.com (Dwight E. Cass)
Newsgroups: comp.unix.bsd
Subject: STDIO Mode "a+" screwed up
Message-ID: <39897@gremlin.nrtc.northrop.com>
Date: 27 Jul 92 17:35:48 GMT
Sender: news@gremlin.nrtc.northrop.com
Organization: Northrop Research & Technology Center, Palos Verdes, CA
Lines: 31

Hi folks,

   I have just spent the weekend trying to find out why rogue crashes
when it attempts to update its score file and have found the problem:

   In: /usr/src/lib/libc/stdio/flags.c - Mode "a+" translates to an
       open flag with O_APPEND (in __sflags()).  This means that if
       you seek the file to the beginning and start writting, all the
       written will be APPENDED to the end of the file - rather than
       updating the top of the file as specified by the plus sign.

   What's the cure - ouch.  It seems that __sflags() is called by all of
the open routines and that there is not a clean way of passing back
the fact that append is desired (why pass it back - you have to seek
to the bottom of the file [lseek (fd, 0, SEEK_END)] after the file
is opened (i.e., after you have returned from __sflags()).  So - my
proposal (which I will implement tonight and send patches for
tommorrow), add one more flag to the ->flags work in the FILE *
structure.  This flag, __SUPD 0x4000, will indicate that the file
has been opened in an append mode (i.e., I will always set this flag
for "a", "a+", "ab+", and look at it rather than O_APPEND to make the
decision as to whether to lseek or not.)  We will see what
side-effects this has.

Any other ideas?
/dec

Dwight E. Cass                 dec@nrtc.northrop.com | But there's a hole
Automation Sciences Laboratory, Northrop Corporation |   in the bucket
One Research Park, Palos Verdes Peninsula, CA  90274 | Dear Liza,
(310) 544-5393                                       |   Dear Liza...