From 237c15650305a65f7d894abc4dfcfaef103fa23a Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sat, 11 May 2019 11:46:49 -0600 Subject: [PATCH] Read permissions from original file --- src/bin/ar.rs | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/bin/ar.rs b/src/bin/ar.rs index 6332e91190..e7ede3e873 100644 --- a/src/bin/ar.rs +++ b/src/bin/ar.rs @@ -6,6 +6,7 @@ use std::{env, fs, process}; use std::io::{self, Read}; use std::path::Path; use std::time::{Duration, SystemTime, UNIX_EPOCH}; +use std::os::unix::fs::PermissionsExt; use redoxfs::{BLOCK_SIZE, Disk, DiskSparse, Extent, FileSystem, Node}; use uuid::Uuid; @@ -18,24 +19,31 @@ fn archive_at>(fs: &mut FileSystem, parent_path: P, c for entry_res in fs::read_dir(parent_path)? { let entry = entry_res?; + let metadata = entry.metadata()?; + let permissions = metadata.permissions(); + let file_type = metadata.file_type(); + let name = entry.file_name().into_string().map_err(|_| io::Error::new( io::ErrorKind::InvalidData, "filename is not valid UTF-8" ) )?; - let path = entry.path(); - let dir = path.is_dir(); - let (mode_type, mode_perm) = if dir { - (Node::MODE_DIR, 0o755) - } /* else if flags & O_SYMLINK == O_SYMLINK { + let mode_type = if file_type.is_dir() { + Node::MODE_DIR + } else if file_type.is_file() { + Node::MODE_FILE + } else if file_type.is_symlink() { Node::MODE_SYMLINK - } */ else { - (Node::MODE_FILE, 0o644) + } else { + return Err(io::Error::new( + io::ErrorKind::Other, + format!("Does not support parsing {:?}", file_type) + )); }; - let mode = mode_type | (mode_perm & Node::MODE_PERM); + let mode = mode_type | (permissions.mode() as u16 & Node::MODE_PERM); let mut node = fs.create_node( mode, &name, @@ -47,9 +55,10 @@ fn archive_at>(fs: &mut FileSystem, parent_path: P, c node.1.gid = 0; fs.write_at(node.0, &node.1).map_err(syscall_err)?; - if dir { + let path = entry.path(); + if file_type.is_dir() { archive_at(fs, path, ctime, node.0)?; - } else { + } else if file_type.is_file() { let data = fs::read(path)?; fs.write_node( node.0, @@ -58,6 +67,11 @@ fn archive_at>(fs: &mut FileSystem, parent_path: P, c ctime.as_secs(), ctime.subsec_nanos() ).map_err(syscall_err)?; + } else { + return Err(io::Error::new( + io::ErrorKind::Other, + format!("Does not support creating {:?}", file_type) + )); } }