From a3c181dce35c34ffbfc6b28e36d89e5a6f73effe Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 23 Apr 2025 11:37:47 +0200 Subject: [PATCH 1/2] 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(()) } From be4e6913a58a27c8197180e12c40ee7c62378efc Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 23 Apr 2025 11:49:29 +0200 Subject: [PATCH 2/2] mknod: cleanup dev handling --- src/uu/mknod/src/mknod.rs | 57 ++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/src/uu/mknod/src/mknod.rs b/src/uu/mknod/src/mknod.rs index cb8c81603..681b9d500 100644 --- a/src/uu/mknod/src/mknod.rs +++ b/src/uu/mknod/src/mknod.rs @@ -123,42 +123,37 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let set_selinux_context = matches.get_flag(options::SELINUX); let context = matches.get_one::(options::CONTEXT); - let mut config = Config { + let dev = match ( + file_type, + matches.get_one::(options::MAJOR), + matches.get_one::(options::MINOR), + ) { + (FileType::Fifo, None, None) => 0, + (FileType::Fifo, _, _) => { + return Err(UUsageError::new( + 1, + "Fifos do not have major and minor device numbers.", + )); + } + (_, Some(&major), Some(&minor)) => makedev(major, minor), + _ => { + return Err(UUsageError::new( + 1, + "Special files require major and minor device numbers.", + )); + } + }; + + let config = Config { mode, - dev: 0, + dev, set_selinux_context: set_selinux_context || context.is_some(), context, }; - if *file_type == FileType::Fifo { - if matches.contains_id(options::MAJOR) || matches.contains_id(options::MINOR) { - Err(UUsageError::new( - 1, - "Fifos do not have major and minor device numbers.", - )) - } else { - let exit_code = mknod(file_name, config); - set_exit_code(exit_code); - Ok(()) - } - } else { - match ( - matches.get_one::(options::MAJOR), - matches.get_one::(options::MINOR), - ) { - (_, None) | (None, _) => Err(UUsageError::new( - 1, - "Special files require major and minor device numbers.", - )), - (Some(&major), Some(&minor)) => { - let dev = makedev(major, minor); - config.dev = dev; - let exit_code = mknod(file_name, config); - set_exit_code(exit_code); - Ok(()) - } - } - } + let exit_code = mknod(file_name, config); + set_exit_code(exit_code); + Ok(()) } pub fn uu_app() -> Command {