From a088f51761538f37848016ed26d1b55d6023d6d1 Mon Sep 17 00:00:00 2001
From: Dan Goodliffe <dan@randomdan.homeip.net>
Date: Sun, 3 Feb 2019 21:51:55 +0000
Subject: R-value construct paths when resolving

---
 netfs/daemon/daemonVolume.cpp | 46 +++++++++++++++++++++----------------------
 netfs/daemon/daemonVolume.h   |  2 +-
 2 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/netfs/daemon/daemonVolume.cpp b/netfs/daemon/daemonVolume.cpp
index 2a6cc09..1a3680f 100644
--- a/netfs/daemon/daemonVolume.cpp
+++ b/netfs/daemon/daemonVolume.cpp
@@ -38,7 +38,7 @@ VolumeServer::access(const NetFS::ReqEnv re, const std::string path, Ice::Int mo
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	struct stat s;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	if (::stat(p.c_str(), &s) != 0) {
 		return errno;
 	}
@@ -64,7 +64,7 @@ VolumeServer::getattr(const NetFS::ReqEnv re, const std::string path, const Ice:
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	struct stat s;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertReadParent(p);
 	if (::lstat(p.c_str(), &s) != 0) {
 		throw NetFS::SystemError(errno);
@@ -77,7 +77,7 @@ VolumeServer::mknod(const NetFS::ReqEnv re, const std::string path, Ice::Int mod
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWriteParent(p);
 	if (::mknod(p.c_str(), mode, dev) != 0) {
 		throw NetFS::SystemError(errno);
@@ -89,7 +89,7 @@ VolumeServer::symlink(const NetFS::ReqEnv re, const std::string path1, const std
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path2));
+	std::filesystem::path p(resolvePath(std::move(path2)));
 	mc.AssertWriteParent(p);
 	if (::symlink(path1.c_str(), p.c_str()) != 0) {
 		throw NetFS::SystemError(errno);
@@ -105,8 +105,8 @@ VolumeServer::link(const NetFS::ReqEnv re, const std::string path1, const std::s
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p1(resolvePath(path1));
-	std::filesystem::path p2(resolvePath(path2));
+	std::filesystem::path p1(resolvePath(std::move(path1)));
+	std::filesystem::path p2(resolvePath(std::move(path2)));
 	if (::link(p1.c_str(), p2.c_str()) != 0) {
 		throw NetFS::SystemError(errno);
 	}
@@ -121,8 +121,8 @@ VolumeServer::rename(const NetFS::ReqEnv re, const std::string from, const std::
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path f(resolvePath(from));
-	std::filesystem::path t(resolvePath(to));
+	std::filesystem::path f(resolvePath(std::move(from)));
+	std::filesystem::path t(resolvePath(std::move(to)));
 	mc.AssertWriteParent(f);
 	mc.AssertWriteParent(t);
 	if (::rename(f.c_str(), t.c_str()) != 0) {
@@ -136,7 +136,7 @@ VolumeServer::readlink(const NetFS::ReqEnv re, const std::string path, const Ice
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
 	char buf[PATH_MAX];
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertRead(p);
 	ssize_t rc = ::readlink(p.c_str(), buf, PATH_MAX);
 	if (rc == -1) {
@@ -150,7 +150,7 @@ VolumeServer::chmod(const NetFS::ReqEnv re, const std::string path, Ice::Int mod
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWritePerms(p);
 	if (::chmod(p.c_str(), mode) != 0) {
 		throw NetFS::SystemError(errno);
@@ -162,7 +162,7 @@ VolumeServer::chown(const NetFS::ReqEnv re, const std::string path, Ice::Int uid
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWrite(p);
 	if (::lchown(p.c_str(), uid, gid) != 0) {
 		throw NetFS::SystemError(errno);
@@ -180,7 +180,7 @@ VolumeServer::utimens(const NetFS::ReqEnv re, const std::string path,
 	times[0].tv_nsec = ns0;
 	times[1].tv_sec = s1;
 	times[1].tv_nsec = ns1;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWrite(p);
 	if (::utimensat(0, p.c_str(), times, AT_SYMLINK_NOFOLLOW) != 0) {
 		throw NetFS::SystemError(errno);
@@ -193,7 +193,7 @@ VolumeServer::statfs(const NetFS::ReqEnv re, const std::string path, const Ice::
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
 	struct statvfs s;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertRead(p);
 	if (::statvfs(p.c_str(), &s) != 0) {
 		throw NetFS::SystemError(errno);
@@ -206,7 +206,7 @@ VolumeServer::truncate(const NetFS::ReqEnv re, const std::string path, Ice::Long
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWrite(p);
 	if (::truncate(p.c_str(), size) != 0) {
 		throw NetFS::SystemError(errno);
@@ -218,7 +218,7 @@ VolumeServer::unlink(const NetFS::ReqEnv re, const std::string path, const Ice::
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWriteParent(p);
 	if (::unlink(p.c_str()) != 0) {
 		throw NetFS::SystemError(errno);
@@ -230,7 +230,7 @@ VolumeServer::open(const NetFS::ReqEnv re, const std::string path, Ice::Int flag
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertRead(p);
 	if (flags & O_CREAT) {
 		throw NetFS::SystemError(EINVAL);
@@ -248,7 +248,7 @@ VolumeServer::create(const NetFS::ReqEnv re, const std::string path, Ice::Int fl
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWriteParent(p);
 	int fd = ::open(p.c_str(), O_CREAT | O_EXCL | flags, mode);
 	if (fd == -1) {
@@ -268,7 +268,7 @@ VolumeServer::opendir(const NetFS::ReqEnv re, const std::string path, const Ice:
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertRead(p);
 	DIR * od = ::opendir(p.c_str());
 	if (!od) {
@@ -283,7 +283,7 @@ VolumeServer::mkdir(const NetFS::ReqEnv re, const std::string path, Ice::Int mod
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWriteParent(p);
 	if (::mkdir(p.c_str(), mode) != 0) {
 		throw NetFS::SystemError(errno);
@@ -299,7 +299,7 @@ VolumeServer::rmdir(const NetFS::ReqEnv re, const std::string path, const Ice::C
 {
 	ModeCheck mc(re, root, userLookup, groupLookup);
 	errno = 0;
-	std::filesystem::path p(resolvePath(path));
+	std::filesystem::path p(resolvePath(std::move(path)));
 	mc.AssertWriteParent(p);
 	if (::rmdir(p.c_str()) != 0) {
 		throw NetFS::SystemError(errno);
@@ -307,7 +307,7 @@ VolumeServer::rmdir(const NetFS::ReqEnv re, const std::string path, const Ice::C
 }
 
 std::filesystem::path
-normalizedAppend(std::filesystem::path out, const std::filesystem::path & in)
+normalizedAppend(std::filesystem::path out, const std::filesystem::path && in)
 {
 	unsigned int depth = 0;
 	for(auto e : in) {
@@ -330,8 +330,8 @@ normalizedAppend(std::filesystem::path out, const std::filesystem::path & in)
 }
 
 std::filesystem::path
-VolumeServer::resolvePath(const std::string & path) const
+VolumeServer::resolvePath(const std::string && path) const
 {
-	return normalizedAppend(root, path);
+	return normalizedAppend(root, std::move(path));
 }
 
diff --git a/netfs/daemon/daemonVolume.h b/netfs/daemon/daemonVolume.h
index 1549f6d..6e29893 100644
--- a/netfs/daemon/daemonVolume.h
+++ b/netfs/daemon/daemonVolume.h
@@ -40,7 +40,7 @@ class VolumeServer : public NetFS::Volume {
 		virtual void disconnect(const Ice::Current&) override;
 
 	protected:
-		std::filesystem::path resolvePath(const std::string & path) const;
+		std::filesystem::path resolvePath(const std::string && path) const;
 
 	private:
 		const std::filesystem::path root;
-- 
cgit v1.2.3