mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
35281b18b8
fcntl.h defines struct timespec if __USE_XOPEN || __USE_XOPEN2K8. But (a) the subsequent bits/stat.h include only needs it if __USE_XOPEN2K8 and (b) older standards did not allow struct timespec here. (It's allowed for newer standards by virtue of the permission to include symbols from sys/stat.h. But sys/stat.h is only required to provide struct timespec from the 2008 edition of POSIX onwards, and permitted by the 2004 TC to the 2001 edition in anticipation of the addition of nanosecond timestamp support to struct stat in the 2008 edition.) This patch limits the timespec definition to the __USE_XOPEN2K8 case, that being the only case where it is actually needed for the <bits/stat.h> include. Tested for x86_64 and x86 (testsuite, and that installed stripped shared libraries are unchanged by the patch). [BZ #20023] * io/fcntl.h [__USE_XOPEN && !__USE_XOPEN2K8]: Do not include <time.h>. * conform/Makefile (test-xfail-UNIX98/fcntl.h/conform): Remove variable. (test-xfail-XOPEN2K/fcntl.h/conform): Likewise.
320 lines
10 KiB
C
320 lines
10 KiB
C
/* Copyright (C) 1991-2016 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/>. */
|
|
|
|
/*
|
|
* POSIX Standard: 6.5 File Control Operations <fcntl.h>
|
|
*/
|
|
|
|
#ifndef _FCNTL_H
|
|
#define _FCNTL_H 1
|
|
|
|
#include <features.h>
|
|
|
|
/* This must be early so <bits/fcntl.h> can define types winningly. */
|
|
__BEGIN_DECLS
|
|
|
|
/* Get __mode_t, __dev_t and __off_t .*/
|
|
#include <bits/types.h>
|
|
|
|
/* Get the definitions of O_*, F_*, FD_*: all the
|
|
numbers and flag bits for `open', `fcntl', et al. */
|
|
#include <bits/fcntl.h>
|
|
|
|
/* Detect if open needs mode as a third argument (or for openat as a fourth
|
|
argument). */
|
|
#ifdef __O_TMPFILE
|
|
# define __OPEN_NEEDS_MODE(oflag) \
|
|
(((oflag) & O_CREAT) != 0 || ((oflag) & __O_TMPFILE) == __O_TMPFILE)
|
|
#else
|
|
# define __OPEN_NEEDS_MODE(oflag) (((oflag) & O_CREAT) != 0)
|
|
#endif
|
|
|
|
/* POSIX.1-2001 specifies that these types are defined by <fcntl.h>.
|
|
Earlier POSIX standards permitted any type ending in `_t' to be defined
|
|
by any POSIX header, so we don't conditionalize the definitions here. */
|
|
#ifndef __mode_t_defined
|
|
typedef __mode_t mode_t;
|
|
# define __mode_t_defined
|
|
#endif
|
|
|
|
#ifndef __off_t_defined
|
|
# ifndef __USE_FILE_OFFSET64
|
|
typedef __off_t off_t;
|
|
# else
|
|
typedef __off64_t off_t;
|
|
# endif
|
|
# define __off_t_defined
|
|
#endif
|
|
|
|
#if defined __USE_LARGEFILE64 && !defined __off64_t_defined
|
|
typedef __off64_t off64_t;
|
|
# define __off64_t_defined
|
|
#endif
|
|
|
|
#ifndef __pid_t_defined
|
|
typedef __pid_t pid_t;
|
|
# define __pid_t_defined
|
|
#endif
|
|
|
|
/* For XPG all symbols from <sys/stat.h> should also be available. */
|
|
#ifdef __USE_XOPEN2K8
|
|
# define __need_timespec
|
|
# include <time.h>
|
|
#endif
|
|
#if defined __USE_XOPEN || defined __USE_XOPEN2K8
|
|
# include <bits/stat.h>
|
|
|
|
# define S_IFMT __S_IFMT
|
|
# define S_IFDIR __S_IFDIR
|
|
# define S_IFCHR __S_IFCHR
|
|
# define S_IFBLK __S_IFBLK
|
|
# define S_IFREG __S_IFREG
|
|
# ifdef __S_IFIFO
|
|
# define S_IFIFO __S_IFIFO
|
|
# endif
|
|
# ifdef __S_IFLNK
|
|
# define S_IFLNK __S_IFLNK
|
|
# endif
|
|
# if (defined __USE_UNIX98 || defined __USE_XOPEN2K8) && defined __S_IFSOCK
|
|
# define S_IFSOCK __S_IFSOCK
|
|
# endif
|
|
|
|
/* Protection bits. */
|
|
|
|
# define S_ISUID __S_ISUID /* Set user ID on execution. */
|
|
# define S_ISGID __S_ISGID /* Set group ID on execution. */
|
|
|
|
# if defined __USE_MISC || defined __USE_XOPEN
|
|
/* Save swapped text after use (sticky bit). This is pretty well obsolete. */
|
|
# define S_ISVTX __S_ISVTX
|
|
# endif
|
|
|
|
# define S_IRUSR __S_IREAD /* Read by owner. */
|
|
# define S_IWUSR __S_IWRITE /* Write by owner. */
|
|
# define S_IXUSR __S_IEXEC /* Execute by owner. */
|
|
/* Read, write, and execute by owner. */
|
|
# define S_IRWXU (__S_IREAD|__S_IWRITE|__S_IEXEC)
|
|
|
|
# define S_IRGRP (S_IRUSR >> 3) /* Read by group. */
|
|
# define S_IWGRP (S_IWUSR >> 3) /* Write by group. */
|
|
# define S_IXGRP (S_IXUSR >> 3) /* Execute by group. */
|
|
/* Read, write, and execute by group. */
|
|
# define S_IRWXG (S_IRWXU >> 3)
|
|
|
|
# define S_IROTH (S_IRGRP >> 3) /* Read by others. */
|
|
# define S_IWOTH (S_IWGRP >> 3) /* Write by others. */
|
|
# define S_IXOTH (S_IXGRP >> 3) /* Execute by others. */
|
|
/* Read, write, and execute by others. */
|
|
# define S_IRWXO (S_IRWXG >> 3)
|
|
#endif
|
|
|
|
#ifdef __USE_MISC
|
|
# ifndef R_OK /* Verbatim from <unistd.h>. Ugh. */
|
|
/* Values for the second argument to access.
|
|
These may be OR'd together. */
|
|
# define R_OK 4 /* Test for read permission. */
|
|
# define W_OK 2 /* Test for write permission. */
|
|
# define X_OK 1 /* Test for execute permission. */
|
|
# define F_OK 0 /* Test for existence. */
|
|
# endif
|
|
#endif /* Use misc. */
|
|
|
|
/* XPG wants the following symbols. <stdio.h> has the same definitions. */
|
|
#if defined __USE_XOPEN || defined __USE_XOPEN2K8
|
|
# define SEEK_SET 0 /* Seek from beginning of file. */
|
|
# define SEEK_CUR 1 /* Seek from current position. */
|
|
# define SEEK_END 2 /* Seek from end of file. */
|
|
#endif /* XPG */
|
|
|
|
/* The constants AT_REMOVEDIR and AT_EACCESS have the same value. AT_EASSESS
|
|
is meaningful only to faccessat, while AT_REMOVEDIR is meaningful only to
|
|
unlinkat. The two functions do completely different things and therefore,
|
|
the flags can be allowed to overlap. For example, passing AT_REMOVEDIR to
|
|
faccessat would be undefined behavior and thus treating it equivalent to
|
|
AT_EACCESS is valid undefined behavior. */
|
|
#ifdef __USE_ATFILE
|
|
# define AT_FDCWD -100 /* Special value used to indicate
|
|
the *at functions should use the
|
|
current working directory. */
|
|
# define AT_SYMLINK_NOFOLLOW 0x100 /* Do not follow symbolic links. */
|
|
# define AT_REMOVEDIR 0x200 /* Remove directory instead of
|
|
unlinking file. */
|
|
# define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
|
|
# ifdef __USE_GNU
|
|
# define AT_NO_AUTOMOUNT 0x800 /* Suppress terminal automount
|
|
traversal. */
|
|
# define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname. */
|
|
# endif
|
|
# define AT_EACCESS 0x200 /* Test access permitted for
|
|
effective IDs, not real IDs. */
|
|
#endif
|
|
|
|
/* Do the file control operation described by CMD on FD.
|
|
The remaining arguments are interpreted depending on CMD.
|
|
|
|
This function is a cancellation point and therefore not marked with
|
|
__THROW. */
|
|
extern int fcntl (int __fd, int __cmd, ...);
|
|
|
|
/* Open FILE and return a new file descriptor for it, or -1 on error.
|
|
OFLAG determines the type of access used. If O_CREAT or O_TMPFILE is set
|
|
in OFLAG, the third argument is taken as a `mode_t', the mode of the
|
|
created file.
|
|
|
|
This function is a cancellation point and therefore not marked with
|
|
__THROW. */
|
|
#ifndef __USE_FILE_OFFSET64
|
|
extern int open (const char *__file, int __oflag, ...) __nonnull ((1));
|
|
#else
|
|
# ifdef __REDIRECT
|
|
extern int __REDIRECT (open, (const char *__file, int __oflag, ...), open64)
|
|
__nonnull ((1));
|
|
# else
|
|
# define open open64
|
|
# endif
|
|
#endif
|
|
#ifdef __USE_LARGEFILE64
|
|
extern int open64 (const char *__file, int __oflag, ...) __nonnull ((1));
|
|
#endif
|
|
|
|
#ifdef __USE_ATFILE
|
|
/* Similar to `open' but a relative path name is interpreted relative to
|
|
the directory for which FD is a descriptor.
|
|
|
|
NOTE: some other `openat' implementation support additional functionality
|
|
through this interface, especially using the O_XATTR flag. This is not
|
|
yet supported here.
|
|
|
|
This function is a cancellation point and therefore not marked with
|
|
__THROW. */
|
|
# ifndef __USE_FILE_OFFSET64
|
|
extern int openat (int __fd, const char *__file, int __oflag, ...)
|
|
__nonnull ((2));
|
|
# else
|
|
# ifdef __REDIRECT
|
|
extern int __REDIRECT (openat, (int __fd, const char *__file, int __oflag,
|
|
...), openat64) __nonnull ((2));
|
|
# else
|
|
# define openat openat64
|
|
# endif
|
|
# endif
|
|
# ifdef __USE_LARGEFILE64
|
|
extern int openat64 (int __fd, const char *__file, int __oflag, ...)
|
|
__nonnull ((2));
|
|
# endif
|
|
#endif
|
|
|
|
/* Create and open FILE, with mode MODE. This takes an `int' MODE
|
|
argument because that is what `mode_t' will be widened to.
|
|
|
|
This function is a cancellation point and therefore not marked with
|
|
__THROW. */
|
|
#ifndef __USE_FILE_OFFSET64
|
|
extern int creat (const char *__file, mode_t __mode) __nonnull ((1));
|
|
#else
|
|
# ifdef __REDIRECT
|
|
extern int __REDIRECT (creat, (const char *__file, mode_t __mode),
|
|
creat64) __nonnull ((1));
|
|
# else
|
|
# define creat creat64
|
|
# endif
|
|
#endif
|
|
#ifdef __USE_LARGEFILE64
|
|
extern int creat64 (const char *__file, mode_t __mode) __nonnull ((1));
|
|
#endif
|
|
|
|
#if !defined F_LOCK && (defined __USE_MISC || (defined __USE_XOPEN_EXTENDED \
|
|
&& !defined __USE_POSIX))
|
|
/* NOTE: These declarations also appear in <unistd.h>; be sure to keep both
|
|
files consistent. Some systems have them there and some here, and some
|
|
software depends on the macros being defined without including both. */
|
|
|
|
/* `lockf' is a simpler interface to the locking facilities of `fcntl'.
|
|
LEN is always relative to the current file position.
|
|
The CMD argument is one of the following. */
|
|
|
|
# define F_ULOCK 0 /* Unlock a previously locked region. */
|
|
# define F_LOCK 1 /* Lock a region for exclusive use. */
|
|
# define F_TLOCK 2 /* Test and lock a region for exclusive use. */
|
|
# define F_TEST 3 /* Test a region for other processes locks. */
|
|
|
|
# ifndef __USE_FILE_OFFSET64
|
|
extern int lockf (int __fd, int __cmd, off_t __len);
|
|
# else
|
|
# ifdef __REDIRECT
|
|
extern int __REDIRECT (lockf, (int __fd, int __cmd, __off64_t __len), lockf64);
|
|
# else
|
|
# define lockf lockf64
|
|
# endif
|
|
# endif
|
|
# ifdef __USE_LARGEFILE64
|
|
extern int lockf64 (int __fd, int __cmd, off64_t __len);
|
|
# endif
|
|
#endif
|
|
|
|
#ifdef __USE_XOPEN2K
|
|
/* Advice the system about the expected behaviour of the application with
|
|
respect to the file associated with FD. */
|
|
# ifndef __USE_FILE_OFFSET64
|
|
extern int posix_fadvise (int __fd, off_t __offset, off_t __len,
|
|
int __advise) __THROW;
|
|
# else
|
|
# ifdef __REDIRECT_NTH
|
|
extern int __REDIRECT_NTH (posix_fadvise, (int __fd, __off64_t __offset,
|
|
__off64_t __len, int __advise),
|
|
posix_fadvise64);
|
|
# else
|
|
# define posix_fadvise posix_fadvise64
|
|
# endif
|
|
# endif
|
|
# ifdef __USE_LARGEFILE64
|
|
extern int posix_fadvise64 (int __fd, off64_t __offset, off64_t __len,
|
|
int __advise) __THROW;
|
|
# endif
|
|
|
|
|
|
/* 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 posix_fallocate (int __fd, off_t __offset, off_t __len);
|
|
# else
|
|
# ifdef __REDIRECT
|
|
extern int __REDIRECT (posix_fallocate, (int __fd, __off64_t __offset,
|
|
__off64_t __len),
|
|
posix_fallocate64);
|
|
# else
|
|
# define posix_fallocate posix_fallocate64
|
|
# endif
|
|
# endif
|
|
# ifdef __USE_LARGEFILE64
|
|
extern int posix_fallocate64 (int __fd, off64_t __offset, off64_t __len);
|
|
# endif
|
|
#endif
|
|
|
|
|
|
/* Define some inlines helping to catch common problems. */
|
|
#if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function \
|
|
&& defined __va_arg_pack_len
|
|
# include <bits/fcntl2.h>
|
|
#endif
|
|
|
|
__END_DECLS
|
|
|
|
#endif /* fcntl.h */
|