This works:
$ touch a && settrans a /hurd/symlink b
This doesn't:
$ mkdir a && settrans a /hurd/symlink b
settrans: a: Is a directory
It's the same file_set_translator
RPC both times, and it's translator
short-circuiting which makes the latter one
fail:
libdiskfs/file-set-trans.c
:
[...]
/* Set passive translator */
if (passive_flags & FS_TRANS_SET)
{
if (!(passive_flags & FS_TRANS_FORCE))
{
/* Handle the short-circuited translators */
mode_t newmode = 0;
if (diskfs_shortcut_symlink && !strcmp (passive, _HURD_SYMLINK))
newmode = S_IFLNK;
[...]
if (newmode)
{
if (S_ISDIR (np->dn_stat.st_mode))
{
/* We can't allow this, because if the mode of the directory
changes, the links will be lost. Perhaps it might be
allowed for empty directories, but that's too much of a
pain. */
mutex_unlock (&np->lock);
return EISDIR;
}
[...]