Subject: Re: Linux emulation and mkdir with trailing /
To: None <tech-kern@netbsd.org>
From: Christos Zoulas <christos@zoulas.com>
List: tech-kern
Date: 09/24/2000 18:48:59
In article <20000924182408.94D046@proven.weird.com>,
Greg A. Woods <tech-kern@netbsd.org> wrote:
> V6 & V7 & 32V & SysIII included this little loop twice in namei() [all
> these releases contain remarkably identical code]:
>
> while(c == '/')
> c = (*func)();
>
> (where `func' is "a function called to get the next char of name")
>
> John Lions gives the following explanation:
>
> Multiple slashes are acceptable! (i.e. "////a///b/" is the same
> as "/a/b");
>
> The second occurance would appear to be the one that eats up any
> trailing slashes. This does not appear to be done in 4.3BSD for reasons
> I cannot fathom, though I may be simply missing some subtlety in my
> quick and naive attempt at a code walkthrough. (if I'm right was it a
> simple omission in the rewrite?).
>
> I don't ever recall any difference in behaviour of any SysV -- I'm
> reasonably sure they all honoured the original Unix behaviour. In fact
> I remeber tripping over related "bugs" in BSD, but not the other way
> around.
>
> In NetBSD it would appear that there is code to do this, though it may
> not be happening at the right point to have the effect I think it does.
>
> In any case I think *BSD should definitely take on the behaviour of
> traditional Unix and do as Lions comment says. I cannot think of
> anything serious that would break, but I can thing of many things that
> would be fixed, not the least of which would be the elimination of any
> need for `special' handling of pathnames in programs that call mkdir(2).
>
> BTW, I think that doing this in a `POSIX' compatability routine would be
> absolutely wrong. If someone wants to wrap the kernel code in `#ifdef
> POSIX' then that might be OK, but in the case of NetBSD in particular I
> think `#define POSIX 1' is strongly in order!
Well, there is precedence to have a function behaving differently
in presense of a POSIX symbol: rename(2). Changing the particular namei()
behavior of ignoring the trailing slash affects too many system calls
and will break a lot of userland programs. A glaring example is doing
echo */ in a directory, which with this change will return all files.
[someone will need to visit all vestiges of globing code and take care
of this in userland].
Notice that Slowaris 2.7 is still broken with respect to that: try
echo */ in /bin using /bin/sh, /bin/csh, /bin/jsh, and /bin/ksh.
Lunix appears to ignore the trailing slash in directories, but not
in plain files.
Fixing this in userland is a PITA, specially when one considers
symlinks too.
Having said that, it would be nice if:
- the emulations DTRT
- if posix really says that the trailing slashes are ignored:
- provide posix_ functions [but that is a pain because
there are too many of them, and it adds a lot of crud].
- provide a sysctl to turn this on [this is *really*
bad]
christos