Re: `rmdir .` doesn't work in 2.4

Andries.Brouwer
2001-01-08T22:51:45Z

From: Andrea Arcangeli <andrea@suse.de>

> But in fact it fails with EINVAL, and
>
> [EINVAL]: The path argument contains a last component that is dot.

I can't confirm. The specs I'm checking are here:

http://www.opengroup.org/onlinepubs/007908799/xsh/rmdir.html

That is the SUSv2 text, one of the ingredients for the new
POSIX standard. I quoted the current Austin draft, the current
draft for the next version of the POSIX standard.

Quoting a text fragment:

The rmdir( ) function shall remove a directory whose name is given by
path. The directory is removed only if it is an empty directory.
If the directory is the root directory or the current working
directory of any process, it is unspecified whether the function
succeeds, or whether it shall fail and set errno to [EBUSY].
If path names a symbolic link, then rmdir( ) shall fail and
set errno to [ENOTDIR]. If the path argument refers to a path
whose final component is either dot or dot-dot, rmdir( ) shall
fail. ...

> Indeed, rmdir("P/D") does roughly the following:
> (i) check that P/D is a directory
> (ii) check that P/D does not have entries other than . and ..
> (iii) delete the names . and .. from P/D
> (iv) delete the name D from P

SUSv2 is straightforward. It doesn't talk about (iv).

I just made explicit what rmdir() actually does, in order to
show that a trailing dot really is a different case where
other rules than the usual ones would have to be applied.
Indeed, rmdir("foo/bar") finishes by removing the name "bar"
from the directory "foo", but rmdir("foo/.") does not finish
by removing the name "." from the directory "foo".

Andries

[Think classical Unix: there are inodes, and there are names.
The rmdir call, just like rm, removes names. Now foo and foo/.
may both be names for the same inode, but they are not the same name.]