diff --git a/mode.go b/mode.go index 01d3444..a53aa7d 100644 --- a/mode.go +++ b/mode.go @@ -262,8 +262,10 @@ func ParseWithUmask(s string, umask uint) (Set, error) { case 'w': perm |= iWUser | iWGroup | iWOther case 'X': - if op == '+' { + if op != '-' { permX = iXUser | iXGroup | iXOther + } else { + perm |= iXUser | iXGroup | iXOther } case 'x': perm |= iXUser | iXGroup | iXOther diff --git a/mode_test.go b/mode_test.go index c1c5f2b..dd51b4d 100644 --- a/mode_test.go +++ b/mode_test.go @@ -119,8 +119,8 @@ func TestApply(t *testing.T) { {0777, 0333, 0000, "-r"}, {0777, 0555, 0000, "-w"}, {0777, 0666, 0000, "-x"}, - {0777, 0777, 0000, "-X"}, - {os.ModeDir | 0777, os.ModeDir | 0777, 0000, "-X"}, + {0777, 0666, 0000, "-X"}, + {os.ModeDir | 0777, os.ModeDir | 0666, 0000, "-X"}, {os.ModeSetuid | os.ModeSetgid | 0777, 0777, 0000, "-s"}, {0777, 0337, 0037, "-r"}, {0777, 0557, 0057, "-w"}, @@ -129,8 +129,8 @@ func TestApply(t *testing.T) { {0777, 0377, 0000, "u-r"}, {0777, 0577, 0000, "u-w"}, {0777, 0677, 0000, "u-x"}, - {0777, 0777, 0000, "u-X"}, - {os.ModeDir | 0777, os.ModeDir | 0777, 0000, "u-X"}, + {0777, 0677, 0000, "u-X"}, + {os.ModeDir | 0777, os.ModeDir | 0677, 0000, "u-X"}, {os.ModeSetuid | 0777, 0777, 0000, "u-s"}, {0000, 0600, 0000, "u=rw"}, @@ -179,6 +179,15 @@ func TestApply(t *testing.T) { {0670, 0644, 0000, "go=u-w"}, {0570, 0555, 0000, "go=u-w"}, {0370, 0311, 0000, "go=u-w"}, + + // Linux compatible X + {0444, 0644, 0000, "u=rwX,go=rX"}, + {os.ModeDir | 0442, os.ModeDir | 0755, 0000, "u=rwX,go=rX"}, + {0641, 0755, 0000, "u=rwX,go=rX"}, + {0777, 0766, 0000, "go-X"}, + {0424, 0000, 0000, "=X"}, + {0421, 0111, 0000, "=X"}, + {0421, 0555, 0000, "=rX"}, } var lastSet Set var lastStr string