From 7bf2e3db23bd0a9ed59d95a683edd188fa52a033 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 3 Nov 2009 12:01:40 +0100 Subject: rm -f: ignore EROFS when it's really ENOENT rm -f must not print a diagnostic for a nonexistent file. However, most linux-based kernel unlinkat functions set errno to EROFS when the named file (regardless of whether it exists) would lie on a read-only file system. remove.c now performs an extra fstatat call in that case, to determine whether the file exists. * src/remove.c (excise): Map EROFS to ENOENT, if a file is nonexistent. Reported by Steven Drake in . * NEWS (Changes in behavior): Mention it. --- src/remove.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/remove.c') diff --git a/src/remove.c b/src/remove.c index 87fb32bf9..c4b93fe7e 100644 --- a/src/remove.c +++ b/src/remove.c @@ -437,6 +437,18 @@ excise (FTS *fts, FTSENT *ent, struct rm_options const *x, bool is_dir) return RM_OK; } + /* The unlinkat from kernels like linux-2.6.32 reports EROFS even for + nonexistent files. When the file is indeed missing, map that to ENOENT, + so that rm -f ignores it, as required. Even without -f, this is useful + because it makes rm print the more precise diagnostic. */ + if (errno == EROFS) + { + struct stat st; + if ( ! (lstatat (fts->fts_cwd_fd, ent->fts_accpath, &st) + && errno == ENOENT)) + errno = EROFS; + } + if (ignorable_missing (x, errno)) return RM_OK; -- cgit v1.2.3-54-g00ecf