@@ -25,20 +25,8 @@ mod options {
2525pub 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+ }
0 commit comments