summaryrefslogtreecommitdiff
path: root/open_issues/settrans_directory_symlink.mdwn
blob: 86148a5254dd6d6665434b2eee4bbaab19a370ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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;
                    }
    [...]