This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Sharing of bits/fcntl.h for Linux - some questions
- From: Andreas Jaeger <aj at suse dot com>
- To: libc-alpha <libc-alpha at sourceware dot org>
- Date: Mon, 15 Oct 2012 11:58:51 +0200
- Subject: Sharing of bits/fcntl.h for Linux - some questions
Roland proposed in the thread about "[Patch] Add name_to_handle_at and
open_by_handle_at for PowerPC" the following:
They are in bits/fcntl.h because they are Linux-specific. It would be a
reasonable cleanup to add a new shared bits/fcntl-linux.h and move the
repetitious parts of the linux/*/bits/fcntl.h files there and make them
all #include <bits/fcntl-linux.h>.
I've looked a bit at this and have a first go and like to solve first
some questions:
1) s390x is the only odd architecture for these two values, the kernel
header has something like:
# if defined __s390x__
# define POSIX_FADV_DONTNEED 6 /* Don't need these pages. */
# define POSIX_FADV_NOREUSE 7 /* Data will be accessed once. */
# else
# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
# endif
Should we do this as well for constants where only one architecture is
the odd one? Or should the header only contain architecture independent
stuff?
2) There are some values that are different on a few architectures. The
Linux kernel <asm-generic/fcntl.h> handles this as following:
- include a architecture specific file that includes some stuf and can
define some values
- check in the generic file whether the value is defined, e.g.:
#ifndef O_EXCL
#define O_EXCL 00000200 /* not fcntl */
#endif
Should we do something like this as well - or have every architecture
define O_EXCL etc.? (half of the architectures have different values)
3) struct flock/flock64 have on SPARC an extra padding.
struct flock64
{
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'). */
__off64_t l_start; /* Offset where the lock begins. */
__off64_t l_len; /* Size of the locked area; zero means until EOF. */
__pid_t l_pid; /* Process holding the lock. */
__ARCH_FLOCK_PAD
};
The Linux kernel adds an __ARCH_FLOCK_PAD with the definition that can
be set by an architecture. Should we do the same - or have each
architecture have its own copy?
I'm attaching a generic file <bits/fcntl.h> and the x86 specific
<bits/fcntl-linux.h> for those eager to look at them (as new files since
they are basically new) - and will clean them up based on the comments I
receive for the above three problems and then send them for review,
Andreas
--
Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
GPG fingerprint = 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126
/* O_*, F_*, FD_* bit values for Linux.
Copyright (C) 2001-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _FCNTL_H
# error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
#endif
/* Get architecture specific definitions. */
#include <bits/fcntl-linux.h>
#include <sys/types.h>
#ifdef __USE_GNU
# include <bits/uio.h>
#endif
/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
located on a few file systems. */
#define O_ACCMODE 0003
#define O_RDONLY 00
#define O_WRONLY 01
#define O_RDWR 02
/* Values for the second argument to `fcntl'. */
#define F_DUPFD 0 /* Duplicate file descriptor. */
#define F_GETFD 1 /* Get file descriptor flags. */
#define F_SETFD 2 /* Set file descriptor flags. */
#define F_GETFL 3 /* Get file status flags. */
#define F_SETFL 4 /* Set file status flags. */
#ifdef __USE_GNU
# define F_SETLEASE 1024 /* Set a lease. */
# define F_GETLEASE 1025 /* Enquire what lease is active. */
# define F_NOTIFY 1026 /* Request notfications on a directory. */
# define F_SETPIPE_SZ 1031 /* Set pipe page size array. */
# define F_GETPIPE_SZ 1032 /* Set pipe page size array. */
#endif
#ifdef __USE_XOPEN2K8
# define F_DUPFD_CLOEXEC 1030 /* Duplicate file descriptor with
close-on-exit set. */
#endif
/* For F_[GET|SET]FD. */
#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
#ifdef __USE_BSD
/* Operations for bsd flock(), also used by the kernel implementation. */
# define LOCK_SH 1 /* shared lock */
# define LOCK_EX 2 /* exclusive lock */
# define LOCK_NB 4 /* or'd with one of the above to prevent
blocking */
# define LOCK_UN 8 /* remove lock */
#endif
#ifdef __USE_GNU
# define LOCK_MAND 32 /* This is a mandatory flock: */
# define LOCK_READ 64 /* ... which allows concurrent read operations. */
# define LOCK_WRITE 128 /* ... which allows concurrent write operations. */
# define LOCK_RW 192 /* ... Which allows concurrent read & write operations. */
#endif
#ifdef __USE_GNU
/* Types of directory notifications that may be requested with F_NOTIFY. */
# define DN_ACCESS 0x00000001 /* File accessed. */
# define DN_MODIFY 0x00000002 /* File modified. */
# define DN_CREATE 0x00000004 /* File created. */
# define DN_DELETE 0x00000008 /* File removed. */
# define DN_RENAME 0x00000010 /* File renamed. */
# define DN_ATTRIB 0x00000020 /* File changed attibutes. */
# define DN_MULTISHOT 0x80000000 /* Don't remove notifier. */
#endif
#ifdef __USE_GNU
/* Owner types. */
enum __pid_type
{
F_OWNER_TID = 0, /* Kernel thread. */
F_OWNER_PID, /* Process. */
F_OWNER_PGRP, /* Process group. */
F_OWNER_GID = F_OWNER_PGRP /* Alternative, obsolete name. */
};
/* Structure to use with F_GETOWN_EX and F_SETOWN_EX. */
struct f_owner_ex
{
enum __pid_type type; /* Owner type of ID. */
__pid_t pid; /* ID of owner. */
};
#endif
/* Define some more compatibility macros to be backward compatible with
BSD systems which did not managed to hide these kernel macros. */
#ifdef __USE_BSD
# define FAPPEND O_APPEND
# define FFSYNC O_FSYNC
# define FASYNC O_ASYNC
# define FNONBLOCK O_NONBLOCK
# define FNDELAY O_NDELAY
#endif /* Use BSD. */
/* Advise to `posix_fadvise'. */
#ifdef __USE_XOPEN2K
# define POSIX_FADV_NORMAL 0 /* No further special treatment. */
# define POSIX_FADV_RANDOM 1 /* Expect random page references. */
# define POSIX_FADV_SEQUENTIAL 2 /* Expect sequential page references. */
# define POSIX_FADV_WILLNEED 3 /* Will need these pages. */
// XXX: Should we do it this way?
# if defined __s390x__
# define POSIX_FADV_DONTNEED 6 /* Don't need these pages. */
# define POSIX_FADV_NOREUSE 7 /* Data will be accessed once. */
# else
# define POSIX_FADV_DONTNEED 4 /* Don't need these pages. */
# define POSIX_FADV_NOREUSE 5 /* Data will be accessed once. */
# endif
#endif
#ifdef __USE_GNU
/* Flags for SYNC_FILE_RANGE. */
# define SYNC_FILE_RANGE_WAIT_BEFORE 1 /* Wait upon writeout of all pages
in the range before performing the
write. */
# define SYNC_FILE_RANGE_WRITE 2 /* Initiate writeout of all those
dirty pages in the range which are
not presently under writeback. */
# define SYNC_FILE_RANGE_WAIT_AFTER 4 /* Wait upon writeout of all pages in
the range after performing the
write. */
/* Flags for SPLICE and VMSPLICE. */
# define SPLICE_F_MOVE 1 /* Move pages instead of copying. */
# define SPLICE_F_NONBLOCK 2 /* Don't block on the pipe splicing
(but we may still block on the fd
we splice from/to). */
# define SPLICE_F_MORE 4 /* Expect more data. */
# define SPLICE_F_GIFT 8 /* Pages passed in are a gift. */
/* File handle structure. */
struct file_handle
{
unsigned int handle_bytes;
int handle_type;
/* File identifier. */
unsigned char f_handle[0];
};
/* Maximum handle size (for now). */
# define MAX_HANDLE_SZ 128
#endif
__BEGIN_DECLS
#ifdef __USE_GNU
/* Provide kernel hint to read ahead. */
extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)
__THROW;
/* Selective file content synch'ing.
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern int sync_file_range (int __fd, __off64_t __offset, __off64_t __count,
unsigned int __flags);
/* Splice address range into a pipe.
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern ssize_t vmsplice (int __fdout, const struct iovec *__iov,
size_t __count, unsigned int __flags);
/* Splice two files together.
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern ssize_t splice (int __fdin, __off64_t *__offin, int __fdout,
__off64_t *__offout, size_t __len,
unsigned int __flags);
/* In-kernel implementation of tee for pipe buffers.
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern ssize_t tee (int __fdin, int __fdout, size_t __len,
unsigned int __flags);
/* Reserve storage for the data of the file associated with FD.
This function is a possible cancellation point and therefore not
marked with __THROW. */
# ifndef __USE_FILE_OFFSET64
extern int fallocate (int __fd, int __mode, __off_t __offset, __off_t __len);
# else
# ifdef __REDIRECT
extern int __REDIRECT (fallocate, (int __fd, int __mode, __off64_t __offset,
__off64_t __len),
fallocate64);
# else
# define fallocate fallocate64
# endif
# endif
# ifdef __USE_LARGEFILE64
extern int fallocate64 (int __fd, int __mode, __off64_t __offset,
__off64_t __len);
# endif
/* Map file name to file handle. */
extern int name_to_handle_at (int __dfd, const char *__name,
struct file_handle *__handle, int *__mnt_id,
int __flags) __THROW;
/* Open file using the file handle.
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern int open_by_handle_at (int __mountdirfd, struct file_handle *__handle,
int __flags);
#endif /* use GNU */
__END_DECLS
#define O_CREAT 0100 /* not fcntl */
#define O_EXCL 0200 /* not fcntl */
#define O_NOCTTY 0400 /* not fcntl */
#define O_TRUNC 01000 /* not fcntl */
#define O_APPEND 02000
#define O_NONBLOCK 04000
#define O_NDELAY O_NONBLOCK
#define O_SYNC 04010000
#define O_FSYNC O_SYNC
#define O_ASYNC 020000
#ifdef __USE_XOPEN2K8
# define O_DIRECTORY 0200000 /* Must be a directory. */
# define O_NOFOLLOW 0400000 /* Do not follow links. */
# define O_CLOEXEC 02000000 /* Set close_on_exec. */
#endif
#ifdef __USE_GNU
# define O_DIRECT 040000 /* Direct disk access. */
# define O_NOATIME 01000000 /* Do not set atime. */
# define O_PATH 010000000 /* Resolve pathname but do not open file. */
#endif
/* For now Linux has synchronisity options for data and read operations.
We define the symbols here but let them do the same as O_SYNC since
this is a superset. */
#if defined __USE_POSIX199309 || defined __USE_UNIX98
# define O_DSYNC 010000 /* Synchronize data. */
# define O_RSYNC O_SYNC /* Synchronize read operations. */
#endif
#ifdef __USE_LARGEFILE64
# ifdef __x86_64__
# define O_LARGEFILE 0
# else
# define O_LARGEFILE 0100000
# endif
#endif
#ifdef __x86_64__
# define F_GETLK 5 /* Get record locking info. */
# define F_SETLK 6 /* Set record locking info (non-blocking). */
# define F_SETLKW 7 /* Set record locking info (blocking). */
/* Not necessary, we always have 64-bit offsets. */
# define F_GETLK64 5 /* Get record locking info. */
# define F_SETLK64 6 /* Set record locking info (non-blocking). */
# define F_SETLKW64 7 /* Set record locking info (blocking). */
#else
# ifndef __USE_FILE_OFFSET64
# define F_GETLK 5 /* Get record locking info. */
# define F_SETLK 6 /* Set record locking info (non-blocking). */
# define F_SETLKW 7 /* Set record locking info (blocking). */
# else
# define F_GETLK F_GETLK64 /* Get record locking info. */
# define F_SETLK F_SETLK64 /* Set record locking info (non-blocking).*/
# define F_SETLKW F_SETLKW64 /* Set record locking info (blocking). */
# endif
# define F_GETLK64 12 /* Get record locking info. */
# define F_SETLK64 13 /* Set record locking info (non-blocking). */
# define F_SETLKW64 14 /* Set record locking info (blocking). */
#endif
#if defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K8
# define F_SETOWN 8 /* Get owner (process receiving SIGIO). */
# define F_GETOWN 9 /* Set owner (process receiving SIGIO). */
#endif
#ifdef __USE_GNU
# define F_SETSIG 10 /* Set number of signal to be sent. */
# define F_GETSIG 11 /* Get number of signal to be sent. */
# define F_SETOWN_EX 15 /* Get owner (thread receiving SIGIO). */
# define F_GETOWN_EX 16 /* Set owner (thread receiving SIGIO). */
#endif
/* For posix fcntl() and `l_type' field of a `struct flock' for lockf(). */
#define F_RDLCK 0 /* Read lock. */
#define F_WRLCK 1 /* Write lock. */
#define F_UNLCK 2 /* Remove lock. */
/* For old implementation of bsd flock(). */
#define F_EXLCK 4 /* or 3 */
#define F_SHLCK 8 /* or 4 */
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. */
};
#ifdef __USE_LARGEFILE64
struct flock64
{
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'). */
__off64_t l_start; /* Offset where the lock begins. */
__off64_t l_len; /* Size of the locked area; zero means until EOF. */
__pid_t l_pid; /* Process holding the lock. */
// XXX: Question: Only SPARC adds a pad here.
// Linux kernel has __ARCH_FLOCK_PAD
};
#endif