Skip to content

Commit 1c6be20

Browse files
authored
Merge pull request #8440 from yuankunzhang/mkfifo-support-symbolic-mode
mkfifo: support symbolic mode
2 parents 01819d0 + 5825e5e commit 1c6be20

File tree

2 files changed

+39
-15
lines changed

2 files changed

+39
-15
lines changed

src/uu/mkfifo/src/mkfifo.rs

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,8 @@ mod options {
2525
pub fn uumain(args: impl uucore::Args) -> UResult<()> {
2626
let matches = uu_app().try_get_matches_from(args)?;
2727

28-
let mode = match matches.get_one::<String>(options::MODE) {
29-
// if mode is passed, ignore umask
30-
Some(m) => match usize::from_str_radix(m, 8) {
31-
Ok(m) => m,
32-
Err(e) => {
33-
return Err(USimpleError::new(
34-
1,
35-
translate!("mkfifo-error-invalid-mode", "error" => e),
36-
));
37-
}
38-
},
39-
// Default value + umask if present
40-
None => 0o666 & !(uucore::mode::get_umask() as usize),
41-
};
28+
let mode = calculate_mode(matches.get_one::<String>(options::MODE))
29+
.map_err(|e| USimpleError::new(1, translate!("mkfifo-error-invalid-mode", "error" => e)))?;
4230

4331
let fifos: Vec<String> = match matches.get_many::<String>(options::FIFO) {
4432
Some(v) => v.cloned().collect(),
@@ -63,7 +51,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
6351
}
6452

6553
// Explicitly set the permissions to ignore umask
66-
if let Err(e) = fs::set_permissions(&f, fs::Permissions::from_mode(mode as u32)) {
54+
if let Err(e) = fs::set_permissions(&f, fs::Permissions::from_mode(mode)) {
6755
return Err(USimpleError::new(
6856
1,
6957
translate!("mkfifo-error-cannot-set-permissions", "path" => f.quote(), "error" => e),
@@ -127,3 +115,22 @@ pub fn uu_app() -> Command {
127115
.value_hint(clap::ValueHint::AnyPath),
128116
)
129117
}
118+
119+
fn calculate_mode(mode_option: Option<&String>) -> Result<u32, String> {
120+
let umask = uucore::mode::get_umask();
121+
let mut mode = 0o666; // Default mode for FIFOs
122+
123+
if let Some(m) = mode_option {
124+
if m.chars().any(|c| c.is_ascii_digit()) {
125+
mode = uucore::mode::parse_numeric(mode, m, false)?;
126+
} else {
127+
for item in m.split(',') {
128+
mode = uucore::mode::parse_symbolic(mode, item, umask, false)?;
129+
}
130+
}
131+
} else {
132+
mode &= !umask; // Apply umask if no mode is specified
133+
}
134+
135+
Ok(mode)
136+
}

tests/by-util/test_mkfifo.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ fn test_create_one_fifo_with_invalid_mode() {
3434
.arg("invalid")
3535
.fails()
3636
.stderr_contains("invalid mode");
37+
38+
new_ucmd!()
39+
.arg("abcd")
40+
.arg("-m")
41+
.arg("0999")
42+
.fails()
43+
.stderr_contains("invalid mode");
3744
}
3845

3946
#[test]
@@ -82,6 +89,16 @@ fn test_create_fifo_with_mode_and_umask() {
8289

8390
test_fifo_creation("734", 0o077, "prwx-wxr--"); // spell-checker:disable-line
8491
test_fifo_creation("706", 0o777, "prwx---rw-"); // spell-checker:disable-line
92+
test_fifo_creation("a=rwx", 0o022, "prwxrwxrwx"); // spell-checker:disable-line
93+
test_fifo_creation("a=rx", 0o022, "pr-xr-xr-x"); // spell-checker:disable-line
94+
test_fifo_creation("a=r", 0o022, "pr--r--r--"); // spell-checker:disable-line
95+
test_fifo_creation("=rwx", 0o022, "prwxr-xr-x"); // spell-checker:disable-line
96+
test_fifo_creation("u+w", 0o022, "prw-rw-rw-"); // spell-checker:disable-line
97+
test_fifo_creation("u-w", 0o022, "pr--rw-rw-"); // spell-checker:disable-line
98+
test_fifo_creation("u+x", 0o022, "prwxrw-rw-"); // spell-checker:disable-line
99+
test_fifo_creation("u-r,g-w,o+x", 0o022, "p-w-r--rwx"); // spell-checker:disable-line
100+
test_fifo_creation("a=rwx,o-w", 0o022, "prwxrwxr-x"); // spell-checker:disable-line
101+
test_fifo_creation("=rwx,o-w", 0o022, "prwxr-xr-x"); // spell-checker:disable-line
85102
}
86103

87104
#[test]

0 commit comments

Comments
 (0)