From e275c37bab60de8fd919eff9cdeb6111a7cd47b2 Mon Sep 17 00:00:00 2001 From: ProgrammerIn-wonderland <3838shah@gmail.com> Date: Sun, 28 Jul 2024 05:13:23 -0400 Subject: [PATCH] Fix symlink (16) and renameat (74) --- lib/9p-filer.js | 58 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/lib/9p-filer.js b/lib/9p-filer.js index decd76441d..bb36081289 100644 --- a/lib/9p-filer.js +++ b/lib/9p-filer.js @@ -423,12 +423,15 @@ Virtio9p.prototype.ReceiveRequest = async function(bufchain) { var name = req[1]; var newPath = Path.join(path, name); var symtgt = req[2]; + var symtgtPath = Path.join(path, symtgt); // TODO: deal with gid var gid = req[3]; + console.log(self.fids[fid]); + console.log(req); - message.Debug("[symlink] fid=" + fid + ", name=" + name + ", symtgt=" + symtgt + ", gid=" + gid); - - fs.symlink(symtgt, newPath, function(err) { + console.log("[symlink] fid=" + fid + ", name=" + name + ", symtgt=" + symtgt + ", gid=" + gid); + + fs.symlink(Path.resolve(path, name), Path.resolve(path, symtgt), function(err) { if (self.shouldAbortRequest(tag)) return; if (err) { @@ -436,7 +439,7 @@ Virtio9p.prototype.ReceiveRequest = async function(bufchain) { self.SendReply(bufchain); return; } - fs.stat(newPath, function(err, stats) { + fs.stat(newPath, function(err, stats) { if (self.shouldAbortRequest(tag)) return; if (err) { @@ -1041,18 +1044,43 @@ Virtio9p.prototype.ReceiveRequest = async function(bufchain) { var newPath = Path.join(self.fids[newdirfid].path, newname); message.Debug("[renameat]: oldname=" + oldname + " newname=" + newname); - fs.rename(oldPath, newPath, function(err) { - if (self.shouldAbortRequest(tag)) return; - - if (err) { - self.SendError(tag, err); - self.SendReply(bufchain); + fs.exists(newPath, (exists) => { + if (exists) { + (new fs.Shell()).rm(newPath, {recursive: true}, (err) => { + if (err) { + self.SendError(tag, err); + self.SendReply(bufchain); + } else { + fs.rename(oldPath, newPath, function(err) { + if (self.shouldAbortRequest(tag)) return; + + if (err) { + self.SendError(tag, err); + self.SendReply(bufchain); + } + + self.BuildReply(id, tag, 0); + self.SendReply(bufchain); + }); + } + + }); + } else { + fs.rename(oldPath, newPath, function(err) { + if (self.shouldAbortRequest(tag)) return; + + if (err) { + self.SendError(tag, err); + self.SendReply(bufchain); + } + + + self.BuildReply(id, tag, 0); + self.SendReply(bufchain); + }); } - - - self.BuildReply(id, tag, 0); - self.SendReply(bufchain); - }); + + }) break;