summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2010-04-04 02:08:37 -0700
committerUlrich Drepper <drepper@redhat.com>2010-04-04 02:08:37 -0700
commitcb652f30b0aa17e65803962305e052e509a5316d (patch)
treec5c4f6be9a4d948ee7fb3d1c83f02c414eb0ca35
parent952df0afdca2333e9fae7d62a36077c348d2df93 (diff)
downloadglibc-cb652f30b0aa17e65803962305e052e509a5316d.tar.gz
Handle POSIX-compliant errno value of unlink in remove.
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/posix/remove.c10
-rw-r--r--sysdeps/unix/sysv/linux/remove.c2
3 files changed, 16 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index a178be5de4..5cccc47274 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2010-04-04 Ulrich Drepper <drepper@redhat.com>
+ [BZ #11276]
+ * sysdeps/posix/remove.c (IS_NO_DIRECTORY_ERROR): Define.
+ (remove): Use IS_NO_DIRECTORY_ERROR to check for file being no
+ directory.
+ * sysdeps/unix/sysv/linux/remove.c: New file.
+
* conform/data/sys/stat.h-data: Fix testing of S_IS* macros.
[BZ #11279]
diff --git a/sysdeps/posix/remove.c b/sysdeps/posix/remove.c
index c44af92d74..ae5bbdbdc9 100644
--- a/sysdeps/posix/remove.c
+++ b/sysdeps/posix/remove.c
@@ -1,5 +1,5 @@
/* ANSI C `remove' function to delete a file or directory. POSIX.1 version.
- Copyright (C) 1995,96,97,2002,2003 Free Software Foundation, Inc.
+ Copyright (C) 1995,96,97,2002,2003,2010 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
@@ -21,6 +21,12 @@
#include <stdio.h>
#include <unistd.h>
+
+#ifndef IS_NO_DIRECTORY_ERROR
+# define IS_NO_DIRECTORY_ERROR errno != EPERM
+#endif
+
+
int
remove (file)
const char *file;
@@ -28,7 +34,7 @@ remove (file)
/* First try to unlink since this is more frequently the necessary action. */
if (__unlink (file) != 0
/* If it is indeed a directory... */
- && (errno != EISDIR
+ && (IS_NO_DIRECTORY_ERROR
/* ...try to remove it. */
|| __rmdir (file) != 0))
/* Cannot remove the object for whatever reason. */
diff --git a/sysdeps/unix/sysv/linux/remove.c b/sysdeps/unix/sysv/linux/remove.c
new file mode 100644
index 0000000000..4abf34a73d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/remove.c
@@ -0,0 +1,2 @@
+#define IS_NO_DIRECTORY_ERROR errno != EISDIR
+#include <sysdeps/posix/remove.c>