June 21, 2021 9:22 AM, "Sergey Bugaev" <[email protected]> wrote:
> Hello, > > I came by this issue [0], which basically states that /hurd/symlink was > behaving in a weird way. Namely, when opened with O_NOLINK, it would > appear to be an empty file, not a symlink. The report talks about broken > symlinks, but the issue is more fundamental: Thanks for working on this! I'm wanting to learn more about trivfs for my caesar cipher eventually, but looking that how to write trivial translators makes me a little curious...I'll learn more about it someday. :) It would be cool to have a gemini translator. It would only take a few 100 lines of code. > > $ settrans -ac /tmp/demo /hurd/symlink /etc/hostname > $ cat /tmp/demo > sergey-hurd-box > $ file /tmp/demo > /tmp/demo: empty > $ ls -l /tmp/demo > -rw-r--r-- 1 sergey sergey 0 Jun 21 15:52 /tmp/demo > $ fsysopts /tmp/demo > ext2fs --writable --relatime --no-inherit-dir-group --store-type=typed > device:hd0s1 > > [0]: https://www.gnu.org/software/hurd/open_issues/symlink_translator.html > > I took a look at trans/symlink.c, and found out that: > > * It was not using libtrivs, as I would expect it to. > > * It was treating O_NOLINK like O_NOTRANS; namely by returning the underlying > node. This is the cause of the issue: O_NOLINK has very different semantics. > It should open the link itself, and then suppport io_stat () and io_read () > on it, returning S_IFLNK | 0777 for the mode, and the link target as > contents. > > * It was leaking ports (should deallocate dotdot when not MOVE_SEND'ing it), > and skipping some error checks. > > So I thought I'd try rewriting /hurd/symlink to use trivfs. This is possible > because trivfs has this convenient trivfs_getroot_hook mechanism, which lets > me > either handle fsys_getroot () any way I want to, or continue with the default > implementation found in trivfs (for O_NOLINK). > > End result: it seems to work great. Absolute, relative; file, ls, ls -l, stat, > readlink, cat; everything just does what I'd expect it to. Even fsysopts now > shows the invocation properly. Some demos: > > $ settrans -ac /tmp/demo trans/symlink /etc/hostname > $ cat /etc/hostname > sergey-hurd-box > $ cat /tmp/demo > sergey-hurd-box > $ file /tmp/demo > /tmp/demo: symbolic link to /etc/hostname > $ ls -l /tmp/demo > lrwxrwxrwx 1 sergey sergey 13 Jun 21 16:11 /tmp/demo -> /etc/hostname > $ fsysopts /tmp/demo > trans/symlink /etc/hostname > > $ settrans -ac /tmp/demo trans/symlink no-such-file > $ cat /tmp/demo > cat: /tmp/demo: No such file or directory > $ file /tmp/demo > /tmp/demo: broken symbolic link to no-such-file > $ ls -l /tmp/demo > lrwxrwxrwx 1 sergey sergey 12 Jun 21 16:11 /tmp/demo -> no-such-file > > Sergey Bugaev (1): > trans/symlink.c: Rewrite on top of trivfs > > trans/Makefile | 10 +- > trans/symlink.c | 243 +++++++++++++++++++++++++++--------------------- > 2 files changed, 137 insertions(+), 116 deletions(-) > > -- > 2.31.1
