From fd72e3042517f3c95ab2d707e1074f4d393b5f9a Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Mon, 20 Jul 2009 13:36:52 -0400 Subject: first pass at implementing *at funcs Tested basic functionality with coreutils and things seem to work. At least gives us a basis to jump from. Signed-off-by: Mike Frysinger --- include/dirent.h | 10 +++++++++- include/fcntl.h | 15 +++++++++------ include/features.h | 51 ++++++++++++++++++++++++++++++++++++--------------- include/stdio.h | 5 +++++ include/sys/stat.h | 34 +++++++++++++++++++++++++++------- include/sys/time.h | 2 +- 6 files changed, 87 insertions(+), 30 deletions(-) (limited to 'include') diff --git a/include/dirent.h b/include/dirent.h index d4fc5c7d9..a9ff465f6 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -135,6 +135,14 @@ typedef struct __dirstream DIR; extern DIR *opendir (__const char *__name) __nonnull ((1)); libc_hidden_proto(opendir) +#ifdef __USE_XOPEN2K8 +/* Same as opendir, but open the stream on the file descriptor FD. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ +extern DIR *fdopendir (int __fd); +#endif + /* Close the directory stream DIRP. Return 0 if successful, -1 if not. @@ -216,7 +224,7 @@ extern void seekdir (DIR *__dirp, long int __pos) __THROW __nonnull ((1)); extern long int telldir (DIR *__dirp) __THROW __nonnull ((1)); #endif -#if defined __USE_BSD || defined __USE_MISC +#if defined __USE_BSD || defined __USE_MISC || defined __XOPEN_2K8 /* Return the file descriptor used by DIRP. */ extern int dirfd (DIR *__dirp) __THROW __nonnull ((1)); diff --git a/include/fcntl.h b/include/fcntl.h index 5d0e4aa82..a6001c0ff 100644 --- a/include/fcntl.h +++ b/include/fcntl.h @@ -56,13 +56,16 @@ __BEGIN_DECLS # define SEEK_END 2 /* Seek from end of file. */ #endif /* XPG */ -#if 0 /*def __USE_GNU*/ +#ifdef __USE_ATFILE # define AT_FDCWD -100 /* Special value used to indicate - openat should use the current - working directory. */ + 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. */ +# define AT_EACCESS 0x200 /* Test access permitted for + effective IDs, not real IDs. */ #endif /* Do the file control operation described by CMD on FD. @@ -107,11 +110,11 @@ extern int open64 (__const char *__file, int __oflag, ...) __nonnull ((1)); libc_hidden_proto(open64) #endif -#if 0 /*def __USE_GNU*/ -/* Similar to OPEN but a relative path name is interpreted relative to +#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 + NOTE: some other `openat' implementation support additional functionality through this interface, especially using the O_XATTR flag. This is not yet supported here. diff --git a/include/features.h b/include/features.h index 1b401497d..16ed44cba 100644 --- a/include/features.h +++ b/include/features.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991-1993,1995-2003,2004,2005 Free Software Foundation, Inc. +/* Copyright (C) 1991-1993,1995-2006,2007,2009 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 @@ -58,9 +58,10 @@ if >=199309L, add IEEE Std 1003.1b-1993; if >=199506L, add IEEE Std 1003.1c-1995; if >=200112L, all of IEEE 1003.1-2004 + if >=200809L, all of IEEE 1003.1-2008 _XOPEN_SOURCE Includes POSIX and XPG things. Set to 500 if Single Unix conformance is wanted, to 600 for the - upcoming sixth revision. + sixth revision, to 700 for the seventh revision. _XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions. _LARGEFILE_SOURCE Some more functions for correct standard I/O. _LARGEFILE64_SOURCE Additional functionality from LFS for large files. @@ -77,7 +78,7 @@ The `-ansi' switch to the GNU C compiler defines __STRICT_ANSI__. If none of these are defined, the default is to have _SVID_SOURCE, _BSD_SOURCE, and _POSIX_SOURCE set to one and _POSIX_C_SOURCE set to - 199506L. If more than one of these are defined, they accumulate. + 200112L. If more than one of these are defined, they accumulate. For example __STRICT_ANSI__, _POSIX_SOURCE and _POSIX_C_SOURCE together give you ISO C, 1003.1, and 1003.2, but nothing else. @@ -85,6 +86,7 @@ header files to decide what to declare or define: __USE_ISOC99 Define ISO C99 things. + __USE_ISOC95 Define ISO C90 AMD1 (C95) things. __USE_POSIX Define IEEE Std 1003.1 things. __USE_POSIX2 Define IEEE Std 1003.2 things. __USE_POSIX199309 Define IEEE Std 1003.1, and .1b things. @@ -93,6 +95,7 @@ __USE_XOPEN_EXTENDED Define X/Open Unix things. __USE_UNIX98 Define Single Unix V2 things. __USE_XOPEN2K Define XPG6 things. + __USE_XOPEN2K8 Define XPG7 things. __USE_LARGEFILE Define correct standard I/O things. __USE_LARGEFILE64 Define LFS things with separate names. __USE_FILE_OFFSET64 Define 64bit interface as default. @@ -119,6 +122,7 @@ /* Undefine everything, so we get a clean slate. */ #undef __USE_ISOC99 +#undef __USE_ISOC95 #undef __USE_POSIX #undef __USE_POSIX2 #undef __USE_POSIX199309 @@ -127,6 +131,7 @@ #undef __USE_XOPEN_EXTENDED #undef __USE_UNIX98 #undef __USE_XOPEN2K +#undef __USE_XOPEN2K8 #undef __USE_LARGEFILE #undef __USE_LARGEFILE64 #undef __USE_FILE_OFFSET64 @@ -179,9 +184,9 @@ # undef _POSIX_SOURCE # define _POSIX_SOURCE 1 # undef _POSIX_C_SOURCE -# define _POSIX_C_SOURCE 199506L +# define _POSIX_C_SOURCE 200809L # undef _XOPEN_SOURCE -# define _XOPEN_SOURCE 600 +# define _XOPEN_SOURCE 700 # undef _XOPEN_SOURCE_EXTENDED # define _XOPEN_SOURCE_EXTENDED 1 # ifdef __UCLIBC_HAS_LFS__ @@ -215,6 +220,12 @@ # define __USE_ISOC99 1 #endif +/* This is to enable the ISO C90 Amendment 1:1995 extension. */ +#if (defined _ISOC99_SOURCE || defined _ISOC9X_SOURCE \ + || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199409L)) +# define __USE_ISOC95 1 +#endif + /* If none of the ANSI/POSIX macros are defined, use POSIX.1 and POSIX.2 (and IEEE Std 1003.1b-1993 unless _XOPEN_SOURCE is defined). */ #if ((!defined __STRICT_ANSI__ || (_XOPEN_SOURCE - 0) >= 500) && \ @@ -222,9 +233,14 @@ # define _POSIX_SOURCE 1 # if defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 500 # define _POSIX_C_SOURCE 2 -# else +# elif defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 600 # define _POSIX_C_SOURCE 199506L +# elif defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) < 700 +# define _POSIX_C_SOURCE 200112L +# else +# define _POSIX_C_SOURCE 200809L # endif +# define __USE_POSIX_IMPLICITLY 1 #endif #if defined _POSIX_SOURCE || _POSIX_C_SOURCE >= 1 || defined _XOPEN_SOURCE @@ -245,6 +261,14 @@ #if (_POSIX_C_SOURCE - 0) >= 200112L # define __USE_XOPEN2K 1 +# undef __USE_ISOC99 +# define __USE_ISOC99 1 +#endif + +#if (_POSIX_C_SOURCE - 0) >= 200809L +# define __USE_XOPEN2K8 1 +# undef _ATFILE_SOURCE +# define _ATFILE_SOURCE 1 #endif #ifdef _XOPEN_SOURCE @@ -255,6 +279,9 @@ # undef _LARGEFILE_SOURCE # define _LARGEFILE_SOURCE 1 # if (_XOPEN_SOURCE - 0) >= 600 +# if (_XOPEN_SOURCE - 0) >= 700 +# define __USE_XOPEN2K8 1 +# endif # define __USE_XOPEN2K 1 # undef __USE_ISOC99 # define __USE_ISOC99 1 @@ -321,7 +348,7 @@ #ifdef __UCLIBC_HAS_WCHAR__ /* wchar_t uses ISO 10646-1 (2nd ed., published 2000-09-15) / Unicode 3.1. */ -# define __STDC_ISO_10646__ 200009L +#define __STDC_ISO_10646__ 200009L #endif /* There is an unwholesomely huge amount of code out there that depends on the @@ -380,10 +407,8 @@ * uclibc itself is usually built without __USE_EXTERN_INLINES, * remove "&& !defined __OPTIMIZE_SIZE__" part to do otherwise. */ -#if __GNUC_PREREQ (2, 7) \ - && defined __OPTIMIZE__ \ - && !defined __OPTIMIZE_SIZE__ \ - && !defined __NO_INLINE__ \ +#if __GNUC_PREREQ (2, 7) && defined __OPTIMIZE__ \ + && !defined __OPTIMIZE_SIZE__ && !defined __NO_INLINE__ \ && (defined __extern_inline || defined __GNUC_GNU_INLINE__) # define __USE_EXTERN_INLINES 1 #endif @@ -422,10 +447,6 @@ uClibc was built without large file support enabled. # define __USE_LARGEFILE64 1 #endif -/* uClibc does not support *at interfaces. */ -#undef _ATFILE_SOURCE -#undef __USE_ATFILE - #ifdef _LIBC # include #endif diff --git a/include/stdio.h b/include/stdio.h index 9336fe3cc..3c86f256b 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -148,6 +148,11 @@ libc_hidden_proto(remove) extern int rename (__const char *__old, __const char *__new) __THROW; __END_NAMESPACE_STD +#ifdef __USE_ATFILE +/* Rename file OLD relative to OLDFD to NEW relative to NEWFD. */ +extern int renameat (int __oldfd, __const char *__old, int __newfd, + __const char *__new) __THROW; +#endif __BEGIN_NAMESPACE_STD /* Create a temporary file and open it read/write. diff --git a/include/sys/stat.h b/include/sys/stat.h index b2c87ddd5..d84ace5a2 100644 --- a/include/sys/stat.h +++ b/include/sys/stat.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1991,1992,1995-2004,2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1995-2004, 2005, 2006, 2007, 2009 + 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 @@ -27,11 +28,12 @@ #include /* For __mode_t and __dev_t. */ -#if defined __USE_XOPEN || defined __USE_MISC +#if defined __USE_XOPEN || defined __USE_XOPEN2K || defined __USE_MISC \ + || defined __USE_ATFILE # if defined __USE_XOPEN || defined __USE_XOPEN2K # define __need_time_t # endif -# ifdef __USE_MISC +# if defined __USE_MISC || defined __USE_ATFILE # define __need_timespec # endif # include /* For time_t resp. timespec. */ @@ -251,12 +253,14 @@ extern int __REDIRECT_NTH (fstatat, (int __fd, __const char *__restrict __file, # endif # endif +# ifdef __USE_LARGEFILE64 extern int fstatat64 (int __fd, __const char *__restrict __file, struct stat64 *__restrict __buf, int __flag) __THROW __nonnull ((2, 3)); +# endif #endif -#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED +#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K # ifndef __USE_FILE_OFFSET64 /* Get file attributes about FILE and put them in BUF. If FILE is a symbolic link, do not follow it. */ @@ -303,7 +307,8 @@ extern int fchmod (int __fd, __mode_t __mode) __THROW; #ifdef __USE_ATFILE /* Set file access permissions of FILE relative to the directory FD is open on. */ -extern int fchmodat (int __fd, __const char *__file, __mode_t mode, int __flag) +extern int fchmodat (int __fd, __const char *__file, __mode_t __mode, + int __flag) __THROW __nonnull ((2)) __wur; #endif /* Use ATFILE. */ @@ -339,14 +344,15 @@ extern int mkdirat (int __fd, __const char *__path, __mode_t __mode) extern int mknod (__const char *__path, __mode_t __mode, __dev_t __dev) __THROW __nonnull ((1)); libc_hidden_proto(mknod) -#endif -#ifdef __USE_ATFILE +# ifdef __USE_ATFILE /* Like mknod, create a new device file with permission bits MODE and device number DEV. But interpret relative PATH names relative to the directory associated with FD. */ extern int mknodat (int __fd, __const char *__path, __mode_t __mode, __dev_t __dev) __THROW __nonnull ((2)); +libc_hidden_proto(mknodat) +# endif #endif @@ -361,7 +367,21 @@ extern int mkfifo (__const char *__path, __mode_t __mode) extern int mkfifoat (int __fd, __const char *__path, __mode_t __mode) __THROW __nonnull ((2)); #endif + +#ifdef __USE_ATFILE +/* Set file access and modification times relative to directory file + descriptor. */ +extern int utimensat (int __fd, __const char *__path, + __const struct timespec __times[2], + int __flags) + __THROW __nonnull ((2)); +#endif +#ifdef __USE_XOPEN2K8 +/* Set file access and modification times of the file associated with FD. */ +extern int futimens (int __fd, __const struct timespec __times[2]) __THROW; +#endif + /* on uClibc we have unversioned struct stat and mknod. * bits/stat.h is filled with wrong info, so we undo it here. */ #undef _STAT_VER diff --git a/include/sys/time.h b/include/sys/time.h index a6388e454..33f5873ee 100644 --- a/include/sys/time.h +++ b/include/sys/time.h @@ -153,7 +153,7 @@ extern int lutimes (__const char *__file, __const struct timeval __tvp[2]) extern int futimes (int __fd, __const struct timeval __tvp[2]) __THROW; #endif -#if 0 /*def __USE_GNU*/ +#ifdef __USE_GNU /* Change the access time of FILE relative to FD to TVP[0] and the modification time of FILE to TVP[1]. If TVP is a null pointer, use the current time instead. Returns 0 on success, -1 on errors. */ -- cgit v1.2.3