[Libreoffice-commits] online.git: loolwsd/LOOLBroker.cpp loolwsd/LOOLKit.cpp loolwsd/LOOLWSD.cpp
Ashod Nakashian
ashod.nakashian at collabora.co.uk
Mon Dec 28 15:38:43 PST 2015
loolwsd/LOOLBroker.cpp | 44 ++++++++++++++++++++++++++++----------------
loolwsd/LOOLKit.cpp | 20 ++++++++++----------
loolwsd/LOOLWSD.cpp | 9 ++++++---
3 files changed, 44 insertions(+), 29 deletions(-)
New commits:
commit cf972fbed27f96493cf315181f58d30120ef4295
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date: Mon Dec 28 17:23:05 2015 -0500
loolwsd: use full path when spawning loolkit
Change-Id: I9875fb7fbbc67915ed62785a3f3d1298a355f0a5
Reviewed-on: https://gerrit.libreoffice.org/20998
Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
Tested-by: Ashod Nakashian <ashnakash at gmail.com>
diff --git a/loolwsd/LOOLBroker.cpp b/loolwsd/LOOLBroker.cpp
index 0351739..5c53025 100644
--- a/loolwsd/LOOLBroker.cpp
+++ b/loolwsd/LOOLBroker.cpp
@@ -46,6 +46,7 @@
#define LIB_SCLO "lib" "sclo" ".so"
#define LIB_SWLO "lib" "swlo" ".so"
#define LIB_SDLO "lib" "sdlo" ".so"
+#define JAILED_LOOLKIT_PATH "/usr/bin/loolkit"
typedef int (LokHookPreInit) ( const char *install_path, const char *user_profile_path );
@@ -528,7 +529,6 @@ static int createLibreOfficeKit(const bool sharePages, const std::string& loSubP
}
else
{
- const std::string executable = "loolkit";
const std::string pipe = BROKER_PREFIX + std::to_string(childCounter++) + BROKER_SUFIX;
if (mkfifo(pipe.c_str(), 0666) < 0)
@@ -541,22 +541,30 @@ static int createLibreOfficeKit(const bool sharePages, const std::string& loSubP
args.push_back("--losubpath=" + loSubPath);
args.push_back("--child=" + childId);
args.push_back("--pipe=" + pipe);
- args.push_back("--clientport=" + ClientPortNumber);
+ args.push_back("--clientport=" + std::to_string(ClientPortNumber));
- Log::info("Launching LibreOfficeKit: " + executable + " " +
+ Log::info("Launching LibreOfficeKit #" + std::to_string(childCounter) +
+ ": " + JAILED_LOOLKIT_PATH + " " +
Poco::cat(std::string(" "), args.begin(), args.end()));
- ProcessHandle procChild = Process::launch(executable, args);
+ ProcessHandle procChild = Process::launch(JAILED_LOOLKIT_PATH, args);
child = procChild.id();
- Log::info("Launched kit process: " + std::to_string(child));
+ if (!Process::isRunning(procChild))
+ {
+ // This can happen if we fail to copy it, or bad chroot etc.
+ Log::error("Error: loolkit was stillborn.");
+ return -1;
+ }
- if ( ( nFIFOWriter = open(pipe.c_str(), O_WRONLY) ) < 0 )
+ if ( (nFIFOWriter = open(pipe.c_str(), O_WRONLY)) < 0 )
{
- Log::error("Error: failed to open pipe [" + pipe + "] write only.");
+ Log::error("Error: failed to open pipe [" + pipe + "] write only. Abandoning child.");
+ Poco::Process::requestTermination(child);
return -1;
}
}
+ Log::info() << "Adding Kit #" << childCounter << " PID " << child << Log::end;
_childProcesses[child] = nFIFOWriter;
return child;
}
@@ -695,27 +703,31 @@ int main(int argc, char** argv)
Log::error(std::string("Exception: ") + exc.what());
}
+ // The loolkit binary must be in our directory.
+ const std::string loolkitPath = Poco::Path(argv[0]).parent().toString() + "loolkit";
+ if (!File(loolkitPath).exists())
+ {
+ Log::error("Error: loolkit does not exists at [" + loolkitPath + "].");
+ exit(-1);
+ }
+
const std::string childId = std::to_string(Util::rng::getNext());
- Path jailPath = Path::forDirectory(childRoot + Path::separator() + childId);
+ const Path jailPath = Path::forDirectory(childRoot + Path::separator() + childId);
+ Log::info("Jail path: " + jailPath.toString());
+
File(jailPath).createDirectories();
Path jailLOInstallation(jailPath, loSubPath);
jailLOInstallation.makeDirectory();
File(jailLOInstallation).createDirectory();
- // Copy (link) LO installation and other necessary files into it from the template
-
+ // Copy (link) LO installation and other necessary files into it from the template.
linkOrCopy(sysTemplate, jailPath);
linkOrCopy(loTemplate, jailLOInstallation);
// It is necessary to deploy loolkit process to chroot jail.
- if (!File("loolkit").exists())
- {
- Log::error("loolkit does not exists");
- exit(-1);
- }
- File("loolkit").copyTo(Path(jailPath, "/usr/bin").toString());
+ File(loolkitPath).copyTo(Path(jailPath, JAILED_LOOLKIT_PATH).toString());
// We need this because sometimes the hostname is not resolved
std::vector<std::string> networkFiles = {"/etc/host.conf", "/etc/hosts", "/etc/nsswitch.conf", "/etc/resolv.conf"};
diff --git a/loolwsd/LOOLKit.cpp b/loolwsd/LOOLKit.cpp
index 3a4cd08..6b9acce 100644
--- a/loolwsd/LOOLKit.cpp
+++ b/loolwsd/LOOLKit.cpp
@@ -453,14 +453,6 @@ private:
void run_lok_main(const std::string &loSubPath, const std::string& childId, const std::string& pipe)
{
- if (std::getenv("SLEEPFORDEBUGGER"))
- {
- std::cerr << "Sleeping " << std::getenv("SLEEPFORDEBUGGER")
- << " seconds to attach debugger to process "
- << Process::id() << std::endl;
- Thread::sleep(std::stoul(std::getenv("SLEEPFORDEBUGGER")) * 1000);
- }
-
struct pollfd aPoll;
ssize_t nBytes = -1;
char aBuffer[1024*2];
@@ -682,12 +674,20 @@ void run_lok_main(const std::string &loSubPath, const std::string& childId, cons
/// Simple argument parsing wrapper / helper for the above.
int main(int argc, char** argv)
{
+ if (std::getenv("SLEEPFORDEBUGGER"))
+ {
+ std::cerr << "Sleeping " << std::getenv("SLEEPFORDEBUGGER")
+ << " seconds to attach debugger to process "
+ << Process::id() << std::endl;
+ Thread::sleep(std::stoul(std::getenv("SLEEPFORDEBUGGER")) * 1000);
+ }
+
+ Log::initialize("kit");
+
std::string loSubPath;
std::string childId;
std::string pipe;
- Log::initialize("kit");
-
for (int i = 1; i < argc; ++i)
{
char *cmd = argv[i];
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index e66d872..3b68fed 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -833,13 +833,16 @@ int LOOLWSD::createBroker()
args.push_back("--numprespawns=" + std::to_string(NumPreSpawnedChildren));
args.push_back("--clientport=" + std::to_string(ClientPortNumber));
- std::string executable = Path(Application::instance().commandPath()).parent().toString() + "loolbroker";
+ const std::string brokerPath = Path(Application::instance().commandPath()).parent().toString() + "loolbroker";
- Log::info("Launching Broker: " + executable + " " +
+ const auto childIndex = MasterProcessSession::_childProcesses.size() + 1;
+ Log::info("Launching Broker #" + std::to_string(childIndex) +
+ ": " + brokerPath + " " +
Poco::cat(std::string(" "), args.begin(), args.end()));
- ProcessHandle child = Process::launch(executable, args);
+ ProcessHandle child = Process::launch(brokerPath, args);
+ Log::info() << "Adding Broker #" << childIndex << " PID " << child.id() << Log::end;
MasterProcessSession::_childProcesses[child.id()] = child.id();
return Application::EXIT_OK;
More information about the Libreoffice-commits
mailing list