summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAaron Power <theaaronepower@gmail.com>2018-08-29 14:22:25 +0100
committerRyan Dahl <ry@tinyclouds.org>2018-08-30 12:39:33 -0400
commitb86bf4d8a4d19f8ba50615028d711413307487e9 (patch)
tree8c0f40147723ba210f9c4507772e593e11e79fb5 /src
parentd8d5c421c33b1cc5416ff87f6a7c3837e5176d4d (diff)
Implemented statSync and lStatSync
Diffstat (limited to 'src')
-rw-r--r--src/handlers.rs55
-rw-r--r--src/msg.fbs16
2 files changed, 71 insertions, 0 deletions
diff --git a/src/handlers.rs b/src/handlers.rs
index 7ee6018cc..564f5e5be 100644
--- a/src/handlers.rs
+++ b/src/handlers.rs
@@ -14,6 +14,7 @@ use hyper::Client;
use msg_generated::deno as msg;
use std;
use std::fs;
+use std::time::UNIX_EPOCH;
use std::path::Path;
use std::time::{Duration, Instant};
use tokio::prelude::future;
@@ -78,6 +79,13 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) {
let filename = msg.filename().unwrap();
handle_read_file_sync(d, &mut builder, filename)
}
+ msg::Any::StatSync => {
+ // TODO base.msg_as_StatSync();
+ let msg = msg::StatSync::init_from_table(base.msg().unwrap());
+ let filename = msg.filename().unwrap();
+ let lstat = msg.lstat();
+ handle_stat_sync(d, &mut builder, filename, lstat)
+ }
msg::Any::WriteFileSync => {
// TODO base.msg_as_WriteFileSync();
let msg = msg::WriteFileSync::init_from_table(base.msg().unwrap());
@@ -467,6 +475,53 @@ fn handle_read_file_sync(
))
}
+macro_rules! to_seconds {
+ ($time:expr) => {{
+ // Unwrap is safe here as if the file is before the unix epoch
+ // something is very wrong.
+ $time.and_then(|t| Ok(t.duration_since(UNIX_EPOCH).unwrap().as_secs()))
+ .unwrap_or(0)
+ }}
+}
+
+
+fn handle_stat_sync(
+ _d: *const DenoC,
+ builder: &mut FlatBufferBuilder,
+ filename: &str,
+ lstat: bool,
+) -> HandlerResult {
+ debug!("handle_stat_sync {} {}", filename, lstat);
+ let path = Path::new(filename);
+ let metadata = if lstat {
+ fs::symlink_metadata(path)?
+ } else {
+ fs::metadata(path)?
+ };
+
+ let msg = msg::StatSyncRes::create(
+ builder,
+ &msg::StatSyncResArgs {
+ is_file: metadata.is_file(),
+ is_symlink: metadata.file_type().is_symlink(),
+ len: metadata.len(),
+ modified: to_seconds!(metadata.modified()),
+ accessed: to_seconds!(metadata.accessed()),
+ created: to_seconds!(metadata.created()),
+ ..Default::default()
+ },
+ );
+
+ Ok(create_msg(
+ builder,
+ &msg::BaseArgs {
+ msg: Some(flatbuffers::Offset::new(msg.value())),
+ msg_type: msg::Any::StatSyncRes,
+ ..Default::default()
+ },
+ ))
+}
+
fn handle_write_file_sync(
d: *const DenoC,
_builder: &mut FlatBufferBuilder,
diff --git a/src/msg.fbs b/src/msg.fbs
index 162a8ddee..eb3753d75 100644
--- a/src/msg.fbs
+++ b/src/msg.fbs
@@ -16,6 +16,8 @@ union Any {
MakeTempDirRes,
ReadFileSync,
ReadFileSyncRes,
+ StatSync,
+ StatSyncRes,
WriteFileSync,
}
@@ -153,6 +155,20 @@ table ReadFileSyncRes {
data: [ubyte];
}
+table StatSync {
+ filename: string;
+ lstat: bool;
+}
+
+table StatSyncRes {
+ is_file: bool;
+ is_symlink: bool;
+ len: ulong;
+ modified:ulong;
+ accessed:ulong;
+ created:ulong;
+}
+
table WriteFileSync {
filename: string;
data: [ubyte];