From a3c181dce35c34ffbfc6b28e36d89e5a6f73effe Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 23 Apr 2025 11:37:47 +0200 Subject: [PATCH] mknod: cleanup mode handling --- src/uu/mknod/src/mknod.rs | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/uu/mknod/src/mknod.rs b/src/uu/mknod/src/mknod.rs index e0e2f12e4..cb8c81603 100644 --- a/src/uu/mknod/src/mknod.rs +++ b/src/uu/mknod/src/mknod.rs @@ -42,6 +42,16 @@ enum FileType { Fifo, } +impl FileType { + fn as_mode(&self) -> mode_t { + match self { + Self::Block => S_IFBLK, + Self::Character => S_IFCHR, + Self::Fifo => S_IFIFO, + } + } +} + /// Configuration for directory creation. pub struct Config<'a> { pub mode: mode_t, @@ -101,13 +111,14 @@ fn mknod(file_name: &str, config: Config) -> i32 { pub fn uumain(args: impl uucore::Args) -> UResult<()> { let matches = uu_app().try_get_matches_from(args)?; - let mode = get_mode(matches.get_one::("mode")).map_err(|e| USimpleError::new(1, e))?; + let file_type = matches.get_one::("type").unwrap(); + let mode = get_mode(matches.get_one::("mode")).map_err(|e| USimpleError::new(1, e))? + | file_type.as_mode(); let file_name = matches .get_one::("name") .expect("Missing argument 'NAME'"); - let file_type = matches.get_one::("type").unwrap(); // Extract the SELinux related flags and options let set_selinux_context = matches.get_flag(options::SELINUX); let context = matches.get_one::(options::CONTEXT); @@ -126,7 +137,6 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { "Fifos do not have major and minor device numbers.", )) } else { - config.mode = S_IFIFO | mode; let exit_code = mknod(file_name, config); set_exit_code(exit_code); Ok(()) @@ -143,19 +153,7 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { (Some(&major), Some(&minor)) => { let dev = makedev(major, minor); config.dev = dev; - let exit_code = match file_type { - FileType::Block => { - config.mode |= S_IFBLK; - mknod(file_name, config) - } - FileType::Character => { - config.mode |= S_IFCHR; - mknod(file_name, config) - } - FileType::Fifo => { - unreachable!("file_type was validated to be only block or character") - } - }; + let exit_code = mknod(file_name, config); set_exit_code(exit_code); Ok(()) }