From b425eae843921ec89a66aaea5a5ce16f46141a25 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Thu, 6 Jul 2017 16:15:46 -0700 Subject: [PATCH 1/2] Use libstd instead of syscall for stat It now works on Unix. --- src/bin/stat.rs | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/bin/stat.rs b/src/bin/stat.rs index 39dba002..a93cc19e 100644 --- a/src/bin/stat.rs +++ b/src/bin/stat.rs @@ -2,12 +2,12 @@ extern crate coreutils; extern crate extra; -extern crate syscall; use std::{env, fmt, fs}; use std::io::{stdout, stderr, Write}; use coreutils::ArgParser; use extra::option::OptionalExt; +use std::os::unix::fs::MetadataExt; const MAN_PAGE: &'static str = /* @MANSTART{stat} */ r#" NAME @@ -25,13 +25,13 @@ OPTIONS "#; /* @MANEND */ -struct Perms(u16); +struct Perms(u32); impl fmt::Display for Perms { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "(0{:o}/", self.0 & 0o777)?; let perm = |i, c| { - if self.0 & ((1 << i) as u16) != 0 { + if self.0 & ((1 << i) as u32) != 0 { c } else { "-" @@ -60,26 +60,26 @@ fn main() { } for path in &parser.args[0..] { - let mut st = syscall::Stat::default(); - let fd = syscall::open(path, syscall::O_CLOEXEC | syscall::O_STAT | syscall::O_NOFOLLOW).unwrap(); - syscall::fstat(fd, &mut st).unwrap(); - syscall::close(fd).unwrap(); - let file_type = match st.st_mode & syscall::MODE_TYPE { - syscall::MODE_FILE => "regular file", - syscall::MODE_DIR => "directory", - syscall::MODE_SYMLINK => "symbolic link", - _ => "" + let meta = fs::symlink_metadata(path).unwrap(); + let file_type = if meta.file_type().is_symlink() { + "symbolic link" + } else if meta.is_file() { + "regular file" + } else if meta.is_dir() { + "directory" + } else { + "" }; - if st.st_mode & syscall::MODE_SYMLINK == syscall::MODE_SYMLINK { + if meta.file_type().is_symlink() { println!("File: {} -> {}", path, fs::read_link(path).unwrap().display()); } else { println!("File: {}", path); } - println!("Size: {} Blocks: {} IO Block: {} {}", st.st_size, st.st_blocks, st.st_blksize, file_type); - println!("Device: {} Inode: {} Links: {}", st.st_dev, st.st_ino, st.st_nlink); - println!("Access: {} Uid: {} Gid: {}", Perms(st.st_mode), st.st_uid, st.st_gid); - println!("Access: {}.{:09}", st.st_atime, st.st_atime_nsec); - println!("Modify: {}.{:09}", st.st_mtime, st.st_mtime_nsec); - println!("Change: {}.{:09}", st.st_ctime, st.st_ctime_nsec); + println!("Size: {} Blocks: {} IO Block: {} {}", meta.size(), meta.blocks(), meta.blksize(), file_type); + println!("Device: {} Inode: {} Links: {}", meta.dev(), meta.ino(), meta.nlink()); + println!("Access: {} Uid: {} Gid: {}", Perms(meta.mode()), meta.uid(), meta.gid()); + println!("Access: {}.{:09}", meta.atime(), meta.atime_nsec()); + println!("Modify: {}.{:09}", meta.mtime(), meta.mtime_nsec()); + println!("Change: {}.{:09}", meta.ctime(), meta.ctime_nsec()); } } From 99db1b11398d5c0f28959396866ece5bb764fa15 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Thu, 6 Jul 2017 16:53:46 -0700 Subject: [PATCH 2/2] Remove unneeded 'extern crate' --- src/bin/readlink.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bin/readlink.rs b/src/bin/readlink.rs index 8ba4980c..43e70662 100644 --- a/src/bin/readlink.rs +++ b/src/bin/readlink.rs @@ -2,7 +2,6 @@ extern crate coreutils; extern crate extra; -extern crate syscall; use std::env; use std::fs;