1pub fn strmode(mode: u32) -> String {
25 let mut flags = ['-'; 10];
26
27 let perms = [
28 (0o000400, 'r'), (0o000200, 'w'), (0o000100, 'x'), (0o000040, 'r'), (0o000020, 'w'), (0o000010, 'x'), (0o000004, 'r'), (0o000002, 'w'), (0o000001, 'x'), ];
32
33 let s = &mut flags[1..];
35 for i in 0..9 {
36 if mode & perms[i].0 == perms[i].0 {
37 s[i] = perms[i].1;
38 }
39 }
40
41 match mode & 0o170000 {
43 0o010000 => { flags[0] = 'p' }, 0o020000 => { flags[0] = 'c' }, 0o040000 => { flags[0] = 'd' }, 0o060000 => { flags[0] = 'b' }, 0o100000 => { }, 0o120000 => { flags[0] = 'l' }, 0o140000 => { flags[0] = 's' }, _ => { flags[0] = '?' }, }
52
53 let xusr_setuid = mode & (0o000100 | 0o004000);
55 if xusr_setuid == 0o004000 {
56 flags[3] = 'S';
57 } else if xusr_setuid == (0o000100 | 0o004000) {
58 flags[3] = 's';
59 }
60
61 let xgrp_setgid = mode & (0o000010 | 0o002000);
63 if xgrp_setgid == 0o002000 {
64 flags[6] = 'S';
65 } else if xgrp_setgid == (0o000010 | 0o002000) {
66 flags[6] = 's';
67 }
68
69 let xoth_sticky = mode & (0o000001 | 0o001000);
71 if xoth_sticky == 0o001000 {
72 flags[9] = 'T';
73 } else if xoth_sticky == (0o000001 | 0o001000) {
74 flags[9] = 't';
75 }
76
77 return flags.into_iter().collect();
78}
79
80#[test]
81fn test_strmode() {
82 let tests = [
83 (0o100644, "-rw-r--r--", "file, 644"),
84 (0o100600, "-rw-------", "file, 600"),
85 (0o100777, "-rwxrwxrwx", "file, 777"),
86 (0o040755, "drwxr-xr-x", "directory, 755"),
87 (0o040711, "drwx--x--x", "directory, 711"),
88 (0o020660, "crw-rw----", "character special, 660"),
89 (0o060660, "brw-rw----", "block special, 660"),
90 (0o120777, "lrwxrwxrwx", "symbolic link, 777"),
91 (0o010600, "prw-------", "fifo, 600"),
92 (0o140755, "srwxr-xr-x", "socket ,755"),
93 (0o104555, "-r-sr-xr-x", "file, 755 with setuid"),
94 (0o104644, "-rwSr--r--", "file, 644 with setuid"),
95 (0o044755, "drwsr-xr-x", "directory, 755 with setuid"),
96 (0o044666, "drwSrw-rw-", "directory, 666 with setuid"),
97 (0o102755, "-rwxr-sr-x", "file, 755 with setgid"),
98 (0o102644, "-rw-r-Sr--", "file, 644 with setgid"),
99 (0o042755, "drwxr-sr-x", "directory, 755 with setgid"),
100 (0o042644, "drw-r-Sr--", "directory, 644 with setgid"),
101 (0o041755, "drwxr-xr-t", "directory, 755 with sticky"),
102 (0o041644, "drw-r--r-T", "directory, 644 with sticky"),
103 (0o104471, "-r-Srwx--x", "file, 471 with setuid"),
104 (0o106471, "-r-Srws--x", "file, 471 with setuid and setgid"),
105 (0o044471, "dr-Srwx--x", "directory, 471 with setuid"),
106 (0o046471, "dr-Srws--x", "directory, 471 with setuid and setgid"),
107 (0o045471, "dr-Srwx--t", "directory, 471 with setuid and sticky"),
108 (0o047471, "dr-Srws--t", "directory, 471 with setuid, setgid, and sticky"),
109 (0o047470, "dr-Srws--T", "directory, 470 with setuid, setgid, and sticky"),
110 ];
111
112 for t in &tests {
113 assert_eq!(t.1, strmode(t.0), "{}: {:o}", t.2, t.0);
114 }
115}