Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions src/uu/mknod/locales/en-US.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,20 @@ mknod-after-help = Mandatory arguments to long options are mandatory for short o
NOTE: your shell may have its own version of mknod, which usually supersedes
the version described here. Please refer to your shell's documentation
for details about the options it supports.

# Help messages
mknod-help-mode = set file permission bits to MODE, not a=rw - umask
mknod-help-name = name of the new file
mknod-help-type = type of the new file (b, c, u or p)
mknod-help-major = major file type
mknod-help-minor = minor file type
mknod-help-selinux = set SELinux security context of each created directory to the default type
mknod-help-context = like -Z, or if CTX is specified then set the SELinux or SMACK security context to CTX

# Error messages
mknod-error-fifo-no-major-minor = Fifos do not have major and minor device numbers.
mknod-error-special-require-major-minor = Special files require major and minor device numbers.
mknod-error-invalid-mode = invalid mode ({ $error })
mknod-error-mode-permission-bits-only = mode must specify only file permission bits
mknod-error-missing-device-type = missing device type
mknod-error-invalid-device-type = invalid device type { $type }
34 changes: 34 additions & 0 deletions src/uu/mknod/locales/fr-FR.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
mknod-about = Créer le fichier spécial NOM du TYPE donné.
mknod-usage = mknod [OPTION]... NOM TYPE [MAJEUR MINEUR]
mknod-after-help = Les arguments obligatoires pour les options longues le sont aussi pour les options courtes.
-m, --mode=MODE définir les bits de permission de fichier à MODE, pas a=rw - umask

MAJEUR et MINEUR doivent tous deux être spécifiés quand TYPE est b, c, ou u, et ils
doivent être omis quand TYPE est p. Si MAJEUR ou MINEUR commence par 0x ou 0X,
il est interprété comme hexadécimal ; sinon, s'il commence par 0, comme octal ;
sinon, comme décimal. TYPE peut être :

- b créer un fichier spécial bloc (mis en mémoire tampon)
- c, u créer un fichier spécial caractère (non mis en mémoire tampon)
- p créer un FIFO

NOTE : votre shell peut avoir sa propre version de mknod, qui remplace généralement
la version décrite ici. Veuillez vous référer à la documentation de votre shell
pour les détails sur les options qu'il supporte.

# Messages d'aide
mknod-help-mode = définir les bits de permission de fichier à MODE, pas a=rw - umask
mknod-help-name = nom du nouveau fichier
mknod-help-type = type du nouveau fichier (b, c, u ou p)
mknod-help-major = type de fichier majeur
mknod-help-minor = type de fichier mineur
mknod-help-selinux = définir le contexte de sécurité SELinux de chaque répertoire créé au type par défaut
mknod-help-context = comme -Z, ou si CTX est spécifié, définir le contexte de sécurité SELinux ou SMACK à CTX

# Messages d'erreur
mknod-error-fifo-no-major-minor = Les fifos n'ont pas de numéros de périphérique majeur et mineur.
mknod-error-special-require-major-minor = Les fichiers spéciaux nécessitent des numéros de périphérique majeur et mineur.
mknod-error-invalid-mode = mode invalide ({ $error })
mknod-error-mode-permission-bits-only = le mode ne doit spécifier que les bits de permission de fichier
mknod-error-missing-device-type = type de périphérique manquant
mknod-error-invalid-device-type = type de périphérique invalide { $type }
38 changes: 23 additions & 15 deletions src/uu/mknod/src/mknod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
use clap::{Arg, ArgAction, Command, value_parser};
use libc::{S_IFBLK, S_IFCHR, S_IFIFO, S_IRGRP, S_IROTH, S_IRUSR, S_IWGRP, S_IWOTH, S_IWUSR};
use libc::{dev_t, mode_t};
use std::collections::HashMap;
use std::ffi::CString;

use uucore::display::Quotable;
use uucore::error::{UResult, USimpleError, UUsageError, set_exit_code};
use uucore::format_usage;

use uucore::locale::get_message;
use uucore::locale::{get_message, get_message_with_args};

const MODE_RW_UGO: mode_t = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

Expand Down Expand Up @@ -130,14 +130,14 @@
(FileType::Fifo, _, _) => {
return Err(UUsageError::new(
1,
"Fifos do not have major and minor device numbers.",
get_message("mknod-error-fifo-no-major-minor"),
));
}
(_, Some(&major), Some(&minor)) => makedev(major, minor),
_ => {
return Err(UUsageError::new(
1,
"Special files require major and minor device numbers.",
get_message("mknod-error-special-require-major-minor"),
));
}
};
Expand Down Expand Up @@ -166,38 +166,38 @@
.short('m')
.long("mode")
.value_name("MODE")
.help("set file permission bits to MODE, not a=rw - umask"),
.help(get_message("mknod-help-mode")),
)
.arg(
Arg::new("name")
.value_name("NAME")
.help("name of the new file")
.help(get_message("mknod-help-name"))
.required(true)
.value_hint(clap::ValueHint::AnyPath),
)
.arg(
Arg::new(options::TYPE)
.value_name("TYPE")
.help("type of the new file (b, c, u or p)")
.help(get_message("mknod-help-type"))
.required(true)
.value_parser(parse_type),
)
.arg(
Arg::new(options::MAJOR)
.value_name(options::MAJOR)
.help("major file type")
.help(get_message("mknod-help-major"))
.value_parser(value_parser!(u64)),
)
.arg(
Arg::new(options::MINOR)
.value_name(options::MINOR)
.help("minor file type")
.help(get_message("mknod-help-minor"))
.value_parser(value_parser!(u64)),
)
.arg(
Arg::new(options::SELINUX)
.short('Z')
.help("set SELinux security context of each created directory to the default type")
.help(get_message("mknod-help-selinux"))
.action(ArgAction::SetTrue),
)
.arg(
Expand All @@ -207,18 +207,23 @@
.value_parser(value_parser!(String))
.num_args(0..=1)
.require_equals(true)
.help("like -Z, or if CTX is specified then set the SELinux or SMACK security context to CTX")
.help(get_message("mknod-help-context")),
)
}

fn get_mode(str_mode: Option<&String>) -> Result<mode_t, String> {
match str_mode {
None => Ok(MODE_RW_UGO),
Some(str_mode) => uucore::mode::parse_mode(str_mode)
.map_err(|e| format!("invalid mode ({e})"))
.map_err(|e| {
get_message_with_args(
"mknod-error-invalid-mode",
HashMap::from([("error".to_string(), e.to_string())]),
)
})
.and_then(|mode| {
if mode > 0o777 {
Err("mode must specify only file permission bits".to_string())
Err(get_message("mknod-error-mode-permission-bits-only"))

Check warning on line 226 in src/uu/mknod/src/mknod.rs

View check run for this annotation

Codecov / codecov/patch

src/uu/mknod/src/mknod.rs#L226

Added line #L226 was not covered by tests
} else {
Ok(mode)
}
Expand All @@ -231,11 +236,14 @@
// 'mknod /dev/rst0 character 18 0'.
tpe.chars()
.next()
.ok_or_else(|| "missing device type".to_string())
.ok_or_else(|| get_message("mknod-error-missing-device-type"))
.and_then(|first_char| match first_char {
'b' => Ok(FileType::Block),
'c' | 'u' => Ok(FileType::Character),
'p' => Ok(FileType::Fifo),
_ => Err(format!("invalid device type {}", tpe.quote())),
_ => Err(get_message_with_args(
"mknod-error-invalid-device-type",
HashMap::from([("type".to_string(), tpe.quote().to_string())]),
)),

Check warning on line 247 in src/uu/mknod/src/mknod.rs

View check run for this annotation

Codecov / codecov/patch

src/uu/mknod/src/mknod.rs#L244-L247

Added lines #L244 - L247 were not covered by tests
})
}
Loading