mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 03:27:44 +00:00
stat: add support for selinux
This commit is contained in:
parent
8220f061ef
commit
c7d39dded6
4 changed files with 49 additions and 1 deletions
|
@ -51,6 +51,7 @@ feat_selinux = [
|
||||||
"id/selinux",
|
"id/selinux",
|
||||||
"ls/selinux",
|
"ls/selinux",
|
||||||
"mkdir/selinux",
|
"mkdir/selinux",
|
||||||
|
"stat/selinux",
|
||||||
"selinux",
|
"selinux",
|
||||||
"feat_require_selinux",
|
"feat_require_selinux",
|
||||||
]
|
]
|
||||||
|
|
|
@ -22,6 +22,9 @@ clap = { workspace = true }
|
||||||
uucore = { workspace = true, features = ["entries", "libc", "fs", "fsext"] }
|
uucore = { workspace = true, features = ["entries", "libc", "fs", "fsext"] }
|
||||||
chrono = { workspace = true }
|
chrono = { workspace = true }
|
||||||
|
|
||||||
|
[features]
|
||||||
|
selinux = ["uucore/selinux"]
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "stat"
|
name = "stat"
|
||||||
path = "src/main.rs"
|
path = "src/main.rs"
|
||||||
|
|
|
@ -902,7 +902,27 @@ impl Stater {
|
||||||
// FIXME: blocksize differs on various platform
|
// FIXME: blocksize differs on various platform
|
||||||
// See coreutils/gnulib/lib/stat-size.h ST_NBLOCKSIZE // spell-checker:disable-line
|
// See coreutils/gnulib/lib/stat-size.h ST_NBLOCKSIZE // spell-checker:disable-line
|
||||||
'B' => OutputType::Unsigned(512),
|
'B' => OutputType::Unsigned(512),
|
||||||
|
// SELinux security context string
|
||||||
|
'C' => {
|
||||||
|
#[cfg(feature = "selinux")]
|
||||||
|
{
|
||||||
|
if uucore::selinux::check_selinux_enabled().is_ok() {
|
||||||
|
match uucore::selinux::get_selinux_security_context(Path::new(file))
|
||||||
|
{
|
||||||
|
Ok(ctx) => OutputType::Str(ctx),
|
||||||
|
Err(_) => OutputType::Str(
|
||||||
|
"failed to get security context".to_string(),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
OutputType::Str("unsupported on this system".to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[cfg(not(feature = "selinux"))]
|
||||||
|
{
|
||||||
|
OutputType::Str("unsupported for this operating system".to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
// device number in decimal
|
// device number in decimal
|
||||||
'd' => OutputType::Unsigned(meta.dev()),
|
'd' => OutputType::Unsigned(meta.dev()),
|
||||||
// device number in hex
|
// device number in hex
|
||||||
|
|
|
@ -490,3 +490,27 @@ fn test_printf_invalid_directive() {
|
||||||
.fails_with_code(1)
|
.fails_with_code(1)
|
||||||
.stderr_contains("'%9%': invalid directive");
|
.stderr_contains("'%9%': invalid directive");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(feature = "feat_selinux")]
|
||||||
|
fn test_stat_selinux() {
|
||||||
|
let ts = TestScenario::new(util_name!());
|
||||||
|
let at = &ts.fixtures;
|
||||||
|
at.touch("f");
|
||||||
|
ts.ucmd()
|
||||||
|
.arg("--printf='%C'")
|
||||||
|
.arg("f")
|
||||||
|
.succeeds()
|
||||||
|
.no_stderr()
|
||||||
|
.stdout_contains("unconfined_u");
|
||||||
|
ts.ucmd()
|
||||||
|
.arg("--printf='%C'")
|
||||||
|
.arg("/bin/")
|
||||||
|
.succeeds()
|
||||||
|
.no_stderr()
|
||||||
|
.stdout_contains("system_u");
|
||||||
|
// Count that we have 4 fields
|
||||||
|
let result = ts.ucmd().arg("--printf='%C'").arg("/bin/").succeeds();
|
||||||
|
let s: Vec<_> = result.stdout_str().split(":").collect();
|
||||||
|
assert!(s.len() == 4);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue