delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2003/01/19/08:14:05

From: Martin Str|mberg <ams AT ludd DOT luth DOT se>
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
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

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

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019