From 26081a32dfaf34fdc8b6cf53222c15f3d4e4f30d Mon Sep 17 00:00:00 2001 From: "Kevin (Kun) \"Kassimo\" Qian" Date: Wed, 12 Sep 2018 07:28:48 -0700 Subject: [PATCH] Add unix-only `mode` for FileInfo (#732) --- js/stat.ts | 8 ++++++++ src/handlers.rs | 13 +++++++++++++ src/msg.fbs | 2 ++ 3 files changed, 23 insertions(+) diff --git a/js/stat.ts b/js/stat.ts index 49902b3963..3193794a5d 100644 --- a/js/stat.ts +++ b/js/stat.ts @@ -8,6 +8,7 @@ import { assert } from "./util"; * A FileInfo describes a file and is returned by `stat`, `lstat`, * `statSync`, `lstatSync`. */ +// TODO FileInfo should be an interface not a class. export class FileInfo { private readonly _isFile: boolean; private readonly _isSymlink: boolean; @@ -31,12 +32,18 @@ export class FileInfo { * be available on all platforms. */ created: number | null; + /** + * The underlying raw st_mode bits that contain the standard Unix permissions + * for this file/directory. TODO Match behavior with Go on windows for mode. + */ + mode: number | null; /* @internal */ constructor(private _msg: fbs.StatRes) { const modified = this._msg.modified().toFloat64(); const accessed = this._msg.accessed().toFloat64(); const created = this._msg.created().toFloat64(); + const mode = this._msg.mode(); // negative for invalid mode (Windows) this._isFile = this._msg.isFile(); this._isSymlink = this._msg.isSymlink(); @@ -44,6 +51,7 @@ export class FileInfo { this.modified = modified ? modified : null; this.accessed = accessed ? accessed : null; this.created = created ? created : null; + this.mode = mode >= 0 ? mode : null; // null if invalid mode (Windows) } /** diff --git a/src/handlers.rs b/src/handlers.rs index 18152c682a..681f18812b 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -15,6 +15,8 @@ use msg; use remove_dir_all::remove_dir_all; use std; use std::fs; +#[cfg(any(unix))] +use std::os::unix::fs::PermissionsExt; use std::path::Path; use std::time::UNIX_EPOCH; use std::time::{Duration, Instant}; @@ -504,6 +506,16 @@ macro_rules! to_seconds { }}; } +#[cfg(any(unix))] +fn get_mode(perm: fs::Permissions) -> i32 { + (perm.mode() as i32) +} + +#[cfg(not(any(unix)))] +fn get_mode(_perm: fs::Permissions) -> i32 { + -1 +} + fn handle_stat(_d: *const DenoC, base: &msg::Base) -> Box { let msg = base.msg_as_stat().unwrap(); let cmd_id = base.cmd_id(); @@ -529,6 +541,7 @@ fn handle_stat(_d: *const DenoC, base: &msg::Base) -> Box { modified: to_seconds!(metadata.modified()), accessed: to_seconds!(metadata.accessed()), created: to_seconds!(metadata.created()), + mode: get_mode(metadata.permissions()), ..Default::default() }, ); diff --git a/src/msg.fbs b/src/msg.fbs index 4437ad1bca..458f5f437b 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -211,6 +211,8 @@ table StatRes { modified:ulong; accessed:ulong; created:ulong; + mode: int = -1; + // negative mode for invalid (Windows); default to invalid } root_type Base;