about summary refs log tree commit diff
path: root/io
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2005-12-02 21:55:54 +0000
committerUlrich Drepper <drepper@redhat.com>2005-12-02 21:55:54 +0000
commite186c703dc073b8be95d0bf893bb8ebb127fe02b (patch)
treebcb3f09e881383811b00aa8359cb2f71391b116b /io
parent975407d507f2e8ad6cbf366e22e0f41d598ddcee (diff)
downloadglibc-e186c703dc073b8be95d0bf893bb8ebb127fe02b.tar.gz
glibc-e186c703dc073b8be95d0bf893bb8ebb127fe02b.tar.xz
glibc-e186c703dc073b8be95d0bf893bb8ebb127fe02b.zip
* io/Makefile (routines): Add mknodat, xmknodat, mkdirat, mkfifoat.
	(static-only-routines): Add mknodat.
	* io/Versions [GLIBC_2.4]: Add mkdirat, mkfifoat, __xmknodat.
	* io/sys/stat.h: Declare mkditat, mknodat, mkfifoat, __xmknodat.
	Define mknodat inline function.
	* include/sys/stat.h: Add hidden proto for __xmknodat.
	* sysdeps/generic/mkdirat.c: New file.
	* sysdeps/generic/mkfifoat.c: New file.
	* sysdeps/generic/mknodat.c: New file.
	* sysdeps/generic/xmknodat.c: New file.
	* sysdeps/unix/mkfifoat.c: New file.
	* sysdeps/unix/sysv/linux/mkdirat.c: New file.
	* sysdeps/unix/sysv/linux/xmknodat.c: New file.

	* sysdeps/generic/xmknod.c: Add one more parameter check.
Diffstat (limited to 'io')
-rw-r--r--io/Makefile13
-rw-r--r--io/Versions1
-rw-r--r--io/sys/stat.h37
3 files changed, 45 insertions, 6 deletions
diff --git a/io/Makefile b/io/Makefile
index 9339ffe699..76e6072c4b 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -28,13 +28,14 @@ headers := sys/stat.h bits/stat.h sys/statfs.h bits/statfs.h sys/vfs.h \
 
 routines :=								\
 	utime								\
-	mkfifo								\
-	stat fstat lstat mknod stat64 fstat64 lstat64 fstatat fstatat64	\
-	xstat fxstat lxstat xmknod xstat64 fxstat64 lxstat64		\
+	mkfifo mkfifoat							\
+	stat fstat lstat stat64 fstat64 lstat64 fstatat fstatat64	\
+	xstat fxstat lxstat xstat64 fxstat64 lxstat64			\
+	mknod mknodat xmknod xmknodat					\
 	fxstatat fxstatat64						\
 	statfs fstatfs statfs64 fstatfs64				\
 	statvfs fstatvfs statvfs64 fstatvfs64				\
-	umask chmod fchmod lchmod mkdir					\
+	umask chmod fchmod lchmod mkdir mkdirat				\
 	open open64 openat openat64 close				\
 	read write lseek lseek64 access euidaccess			\
 	fcntl flock lockf lockf64					\
@@ -54,8 +55,8 @@ routines :=								\
 # These routines will be omitted from the libc shared object.
 # Instead the static object files will be included in a special archive
 # linked against when the shared library will be used.
-static-only-routines = stat fstat lstat mknod stat64 fstat64 lstat64	\
-		       fstatat fstatat64
+static-only-routines = stat fstat lstat stat64 fstat64 lstat64	\
+		       fstatat fstatat64 mknod mknodat
 
 others		:= pwd
 test-srcs	:= ftwtest
diff --git a/io/Versions b/io/Versions
index 65ee77182e..05b9bfc185 100644
--- a/io/Versions
+++ b/io/Versions
@@ -100,6 +100,7 @@ libc {
   GLIBC_2.4 {
     fchownat;
     __fxstatat; __fxstatat64;
+    mkdirat; mkfifoat; __xmknodat;
     openat; openat64;
     unlinkat;
   }
diff --git a/io/sys/stat.h b/io/sys/stat.h
index 03152990e7..d164645a8e 100644
--- a/io/sys/stat.h
+++ b/io/sys/stat.h
@@ -305,6 +305,14 @@ extern __mode_t getumask (void) __THROW;
 extern int mkdir (__const char *__path, __mode_t __mode)
      __THROW __nonnull ((1));
 
+#ifdef __USE_GNU
+/* Like mkdir, create a new directory with permission bits MODE.  But
+   interpret relative PATH names relative to the directory associated
+   with FD.  */
+extern int mkdirat (int __fd, __const char *__path, __mode_t __mode)
+     __THROW __nonnull ((2));
+#endif
+
 /* Create a device file named PATH, with permission and special bits MODE
    and device number DEV (which can be constructed from major and minor
    device numbers with the `makedev' macro above).  */
@@ -313,10 +321,26 @@ extern int mknod (__const char *__path, __mode_t __mode, __dev_t __dev)
      __THROW __nonnull ((1));
 #endif
 
+#ifdef __USE_GNU
+/* 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));
+#endif
+
 
 /* Create a new FIFO named PATH, with permission bits MODE.  */
 extern int mkfifo (__const char *__path, __mode_t __mode)
      __THROW __nonnull ((1));
+
+#ifdef __USE_GNU
+/* Like mkfifo, create a new FIFO with permission bits MODE.  But
+   interpret relative PATH names relative to the directory associated
+   with FD.  */
+extern int mkfifoat (int __fd, __const char *__path, __mode_t __mode)
+     __THROW __nonnull ((2));
+#endif
 
 /* To allow the `struct stat' structure and the file type `mode_t'
    bits to vary without changing shared library major version number,
@@ -388,6 +412,10 @@ extern int __fxstatat64 (int __ver, int __fildes, __const char *__filename,
 extern int __xmknod (int __ver, __const char *__path, __mode_t __mode,
 		     __dev_t *__dev) __THROW __nonnull ((2, 4));
 
+extern int __xmknodat (int __ver, int __fd, __const char *__path,
+		       __mode_t __mode, __dev_t *__dev)
+     __THROW __nonnull ((3, 5));
+
 #if defined __GNUC__ && __GNUC__ >= 2
 /* Inlined versions of the real stat and mknod functions.  */
 
@@ -428,6 +456,15 @@ __NTH (mknod (__const char *__path, __mode_t __mode, __dev_t __dev))
 }
 # endif
 
+# ifdef __USE_GNU
+extern __inline__ int
+__NTH (mknodat (int __fd, __const char *__path, __mode_t __mode,
+		__dev_t __dev))
+{
+  return __xmknodat (_MKNOD_VER, __fd, __path, __mode, &__dev);
+}
+# endif
+
 # if defined __USE_LARGEFILE64 \
   && (! defined __USE_FILE_OFFSET64 \
       || (defined __REDIRECT_NTH && defined __OPTIMIZE__))