diff options
author | Aaron Power <theaaronepower@gmail.com> | 2018-08-29 14:22:25 +0100 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-08-30 12:39:33 -0400 |
commit | b86bf4d8a4d19f8ba50615028d711413307487e9 (patch) | |
tree | 8c0f40147723ba210f9c4507772e593e11e79fb5 /src | |
parent | d8d5c421c33b1cc5416ff87f6a7c3837e5176d4d (diff) |
Implemented statSync and lStatSync
Diffstat (limited to 'src')
-rw-r--r-- | src/handlers.rs | 55 | ||||
-rw-r--r-- | src/msg.fbs | 16 |
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]; |