diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-07-23 07:22:13 +0900 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-07-23 07:22:13 +0900 |
commit | c0792ffe1f4be354f62ff866cf4c7ebb367e70bb (patch) | |
tree | c18ec30ed2c53c0b3feb41a92de2938ee582a764 /open_issues/settrans_directory_symlink.mdwn | |
parent | e9990192bb52a2c6085d4c4d355c6ad9d8bdac67 (diff) | |
parent | a29dec0b89f2961c8af41e6cd851b4ed9c9d28d8 (diff) |
Merge branch 'master' of http://git.savannah.gnu.org/cgit/hurd/web
Diffstat (limited to 'open_issues/settrans_directory_symlink.mdwn')
-rw-r--r-- | open_issues/settrans_directory_symlink.mdwn | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/open_issues/settrans_directory_symlink.mdwn b/open_issues/settrans_directory_symlink.mdwn new file mode 100644 index 00000000..86148a52 --- /dev/null +++ b/open_issues/settrans_directory_symlink.mdwn @@ -0,0 +1,52 @@ +[[!meta copyright="Copyright © 2012 Free Software Foundation, Inc."]] + +[[!meta license="""[[!toggle id="license" text="GFDL 1.2+"]][[!toggleable +id="license" text="Permission is granted to copy, distribute and/or modify this +document under the terms of the GNU Free Documentation License, Version 1.2 or +any later version published by the Free Software Foundation; with no Invariant +Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license +is included in the section entitled [[GNU Free Documentation +License|/fdl]]."]]"""]] + +[[!tag open_issue_hurd]] + +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|hurd/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; + } + [...] |