This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64


On 08/17/2016 10:57 PM, Jeff Layton wrote:
On Wed, 2016-08-17 at 13:37 -0700, Mike Frysinger wrote:
On 17 Aug 2016 16:05, Jeff Layton wrote:

The way it works now is that when you define _FILE_OFFSET_BITS=64 and
call fcntl(fd, F_SETLK, fl) glibc swaps in a struct flock64 for your
struct flock, and F_SETLK64 for the F_SETLK.

does it ?  doesn't seem like it does to me.  here's glibc's fcntl.c:
	io/fcntl.c - generic stub that sets ENOSYS
	sysdeps/unix/sysv/linux/fcntl.c - just calls syscall(fcntl)
	sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c - just calls syscall(fcntl64)
	sysdeps/unix/sysv/linux/i386/fcntl.c - same as above
	<all the other 32-bit arches include the i386 file>


Ok, I was being a little cavalier with my description. This is what
really happens (from x86 struct flock definition):

struct flock
  {
    short int l_type;   /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK.  */
    short int l_whence; /* Where `l_start' is relative to (like `lseek').  */
#ifndef __USE_FILE_OFFSET64
    __off_t l_start;    /* Offset where the lock begins.  */
    __off_t l_len;      /* Size of the locked area; zero means until EOF.  */
#else
    __off64_t l_start;  /* Offset where the lock begins.  */
    __off64_t l_len;    /* Size of the locked area; zero means until EOF.  */
#endif
    __pid_t l_pid;      /* Process holding the lock.  */
  };

So, l_start and l_len get redefined into larger sizes when LFS is
enabled. The F_GETLK/F_SETLK/F_SETLKW are also redefined to their *64
equivalents in that case using the preprocessor.

Note that LFS and 64-bit off_t are separate. Only LFS (_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE) is implied by _GNU_SOURCE.

We do not really have a working fcntl for _LARGEFILE64_SOURCE and _FILE_OFFSET_BITS == 32.

Florian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]