summaryrefslogtreecommitdiff
path: root/cli/ops.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/ops.rs')
-rw-r--r--cli/ops.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/cli/ops.rs b/cli/ops.rs
index 4ebcf5fdb..d8a0c5cfa 100644
--- a/cli/ops.rs
+++ b/cli/ops.rs
@@ -50,6 +50,7 @@ use tokio::net::TcpListener;
use tokio::net::TcpStream;
use tokio_process::CommandExt;
use tokio_threadpool;
+use utime;
#[cfg(unix)]
use std::os::unix::fs::PermissionsExt;
@@ -202,6 +203,7 @@ pub fn op_selector_std(inner_type: msg::Any) -> Option<OpCreator> {
msg::Any::Stat => Some(op_stat),
msg::Any::Symlink => Some(op_symlink),
msg::Any::Truncate => Some(op_truncate),
+ msg::Any::Utime => Some(op_utime),
msg::Any::CreateWorker => Some(op_create_worker),
msg::Any::HostGetWorkerClosed => Some(op_host_get_worker_closed),
msg::Any::HostGetMessage => Some(op_host_get_message),
@@ -1507,6 +1509,29 @@ fn op_truncate(
})
}
+fn op_utime(
+ state: &ThreadSafeState,
+ base: &msg::Base<'_>,
+ data: deno_buf,
+) -> Box<OpWithError> {
+ assert_eq!(data.len(), 0);
+
+ let inner = base.inner_as_utime().unwrap();
+ let filename = String::from(inner.filename().unwrap());
+ let atime = inner.atime();
+ let mtime = inner.mtime();
+
+ if let Err(e) = state.check_write(&filename) {
+ return odd_future(e);
+ }
+
+ blocking(base.sync(), move || {
+ debug!("op_utimes {} {} {}", filename, atime, mtime);
+ utime::set_file_times(filename, atime, mtime)?;
+ Ok(empty_buf())
+ })
+}
+
fn op_listen(
state: &ThreadSafeState,
base: &msg::Base<'_>,