From: Martin Str|mberg Message-Id: <200301191314.h0JDE1j23762@brother.ludd.luth.se> Subject: Re: lseek() calling llseek() To: djgpp-workers AT delorie DOT com Date: Sun, 19 Jan 2003 14:14:01 +0100 (MET) In-Reply-To: <3E2A9590.BDDE0371@phekda.freeserve.co.uk> from "Richard Dawe" at Jan 19, 2003 12:09:52 PM X-Mailer: ELM [version 2.5 PL2] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Reply-To: djgpp-workers AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp-workers AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk According to Richard Dawe: > Martin Str|mberg wrote: > > Comments are welcome. In particular on my documentation changes and the > > last return statement in lseek() (which could be made safer with some more > > lines of code). > > It looks fine to me with your safer return code (from another mail) and some > texinfo fixes. Here's the latest C code. llseek_offset = llseek(handle, offset, whence); if( offset == -1 ) { return -1; /* llseek sets errno. */ } /* Here we rely on that llseek()'s return range is [-1, 2^32-2]. * All this removal of the bits 31-63 (of which only bit 31 * potentially could be set) in the long long (offset_t) and then * merging it into the long (off_t) is because if a value is * (de)promoted and it doesn't fit in the target variable * implementation defined behaviour is invoked. So we make sure it * temporarily fits. After that it's ok to or in the sign bit * again. */ if( llseek_offset&0x80000000 ) { return ((off_t)(llseek_offset&0x7fffffff))|0x80000000; } else { return llseek_offset&0x7fffffff; } Right, MartinS