summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--js/stat.ts8
-rw-r--r--src/handlers.rs13
-rw-r--r--src/msg.fbs2
3 files changed, 23 insertions, 0 deletions
diff --git a/js/stat.ts b/js/stat.ts
index 49902b396..3193794a5 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 18152c682..681f18812 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<Op> {
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<Op> {
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 4437ad1bc..458f5f437 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;