Skip to content
Closed
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
15 changes: 15 additions & 0 deletions src/uu/chcon/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
use std::env;

pub fn main() {
// Do not rebuild build script unless the script itself or the enabled features are modified
// See <https://doc.rust-lang.org/cargo/reference/build-scripts.html#change-detection>
println!("cargo:rerun-if-changed=build.rs");

let target_os = env::var("CARGO_CFG_TARGET_OS").unwrap();
let target_env = env::var("CARGO_CFG_TARGET_ENV").unwrap();

// On musl, fts is not part of libc, but in its own library.
if target_os == "linux" && target_env == "musl" {
println!("cargo:rustc-link-lib=fts");
}
}
12 changes: 9 additions & 3 deletions src/uu/chcon/src/fts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@

use std::ffi::{CStr, CString, OsStr};
use std::marker::PhantomData;
use std::os::raw::{c_int, c_long, c_short};
use std::os::raw::{c_int, c_long};
// On musl, fts_level is an int, but on glibc it is a short.
#[cfg(target_env = "musl")]
use std::os::raw::c_int as fts_level_t;
#[cfg(target_env = "gnu")]
use std::os::raw::c_short as fts_level_t;
use std::path::Path;
use std::{io, iter, ptr, slice};

Expand Down Expand Up @@ -142,7 +147,7 @@ impl<'fts> EntryRef<'fts> {
self.as_ref().fts_errno
}

pub(crate) fn level(&self) -> c_short {
pub(crate) fn level(&self) -> fts_level_t {
self.as_ref().fts_level
}

Expand All @@ -162,7 +167,8 @@ impl<'fts> EntryRef<'fts> {

ptr::NonNull::new(entry.fts_path)
.map(|path_ptr| {
let path_size = usize::from(entry.fts_pathlen).saturating_add(1);
let mut path_size: usize = entry.fts_pathlen as usize;
path_size = path_size.saturating_add(1);

// SAFETY: `entry.fts_path` is a non-null pointer that is assumed to be valid.
unsafe { slice::from_raw_parts(path_ptr.as_ptr().cast(), path_size) }
Expand Down