summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/BUILD.gn1
-rw-r--r--cli/msg.fbs6
-rw-r--r--cli/ops.rs23
3 files changed, 30 insertions, 0 deletions
diff --git a/cli/BUILD.gn b/cli/BUILD.gn
index ee032a757..f385a0391 100644
--- a/cli/BUILD.gn
+++ b/cli/BUILD.gn
@@ -72,6 +72,7 @@ ts_sources = [
"../js/headers.ts",
"../js/io.ts",
"../js/lib.web_assembly.d.ts",
+ "../js/link.ts",
"../js/location.ts",
"../js/main.ts",
"../js/make_temp_dir.ts",
diff --git a/cli/msg.fbs b/cli/msg.fbs
index 695515f55..c515b9add 100644
--- a/cli/msg.fbs
+++ b/cli/msg.fbs
@@ -21,6 +21,7 @@ union Any {
GlobalTimerStop,
IsTTY,
IsTTYRes,
+ Link,
Listen,
ListenRes,
MakeTempDir,
@@ -391,6 +392,11 @@ table Symlink {
newname: string;
}
+table Link {
+ oldname: string;
+ newname: string;
+}
+
table Stat {
filename: string;
lstat: bool;
diff --git a/cli/ops.rs b/cli/ops.rs
index 130a22431..889061651 100644
--- a/cli/ops.rs
+++ b/cli/ops.rs
@@ -176,6 +176,7 @@ pub fn op_selector_std(inner_type: msg::Any) -> Option<OpCreator> {
msg::Any::GlobalTimer => Some(op_global_timer),
msg::Any::GlobalTimerStop => Some(op_global_timer_stop),
msg::Any::IsTTY => Some(op_is_tty),
+ msg::Any::Link => Some(op_link),
msg::Any::Listen => Some(op_listen),
msg::Any::MakeTempDir => Some(op_make_temp_dir),
msg::Any::Metrics => Some(op_metrics),
@@ -1259,6 +1260,28 @@ fn op_rename(
})
}
+fn op_link(
+ sc: &IsolateStateContainer,
+ base: &msg::Base<'_>,
+ data: deno_buf,
+) -> Box<OpWithError> {
+ assert_eq!(data.len(), 0);
+ let inner = base.inner_as_link().unwrap();
+ let oldname = PathBuf::from(inner.oldname().unwrap());
+ let newname_ = inner.newname().unwrap();
+ let newname = PathBuf::from(newname_);
+
+ if let Err(e) = sc.state().check_write(&newname_) {
+ return odd_future(e);
+ }
+
+ blocking(base.sync(), move || -> OpResult {
+ debug!("op_link {} {}", oldname.display(), newname.display());
+ std::fs::hard_link(&oldname, &newname)?;
+ Ok(empty_buf())
+ })
+}
+
fn op_symlink(
sc: &IsolateStateContainer,
base: &msg::Base<'_>,