9ns: Make walk() follow symlinks
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 26 Feb 2018 21:55:29 +0000 (16:55 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 6 Apr 2018 19:23:01 +0000 (15:23 -0400)
commitaa62086eb3896bd8feba673bb7109dfc962c09df
tree4f1081894b8d5e7b9d73090e378dc7e9322fbfea
parent698746b292adfb20672e5f53a697a9267aaa73f0
9ns: Make walk() follow symlinks

When we hit a chan that is a symlink, walk() will check it for mount
points, just like any other file.  Otherwise, we'll attempt to walk it.

Note that O_NOFOLLOW doesn't throw an error; it just means to not follow
the last step.  open() can throw an error if it wants.

Relative lookups are a little nasty.  We need the parent of the symlink,
but only the device knows the parent.  We can use walk() and dotdot to get
the parent.  The special casing can be a tricky.  When the tree_file code
is merged, you can see what tree_file_walk does.  It's basically the same
as the check that walk() makes: we can walk from a symlink, but only to
dotdot.  We should only be doing that when handling a relative walk, though
there might be a case where we can sneak by - hence the asserts.

We allow eight nested symlinks, and otherwise you can have as many symlinks
in your path as you'd like.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/ns/chan.c
kern/src/ns/dev.c