summaryrefslogtreecommitdiff
path: root/open_issues/settrans_directory_symlink.mdwn
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-07-23 07:22:13 +0900
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-07-23 07:22:13 +0900
commitc0792ffe1f4be354f62ff866cf4c7ebb367e70bb (patch)
treec18ec30ed2c53c0b3feb41a92de2938ee582a764 /open_issues/settrans_directory_symlink.mdwn
parente9990192bb52a2c6085d4c4d355c6ad9d8bdac67 (diff)
parenta29dec0b89f2961c8af41e6cd851b4ed9c9d28d8 (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.mdwn52
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;
+ }
+ [...]