loolwsd/Common.hpp     |    2 --
 loolwsd/LOOLForKit.cpp |   21 +++------------------
 loolwsd/LOOLWSD.cpp    |   33 +++++++--------------------------
 3 files changed, 10 insertions(+), 46 deletions(-)

New commits:
commit 58f78f8734b908c738eab8ec6a7eccaebd5ba2ee
Author: Tor Lillqvist <t...@collabora.com>
Date:   Wed Oct 12 18:15:13 2016 +0300

    Don't use named pipes (FIFOs)
    
    Use a plain pipe, as created by Poco::Process::launch() when you pass
    a non-nullptr inPipe pointer to it. Leads to simpler code. No need to
    explicitly create a FIFO and open it. In loolforkit, the read fd of
    the pipe is now always 0 (stdin).
    
    Creating the pipe ourselves in loolwsd using pipe() and passing the fd
    of the read end of the pipe on the loolforkit command-line would not
    be much more complex, and was what I first tried. But it did not work,
    as Poco::ProcessImpl::launchByForkExecImpl() closes all file
    descriptors >= 3. Which is a bit rude, and not documented, but there
    you go.

diff --git a/loolwsd/Common.hpp b/loolwsd/Common.hpp
index 3e5d5e9..68530e8 100644
--- a/loolwsd/Common.hpp
+++ b/loolwsd/Common.hpp
@@ -32,8 +32,6 @@ constexpr int READ_BUFFER_SIZE = 2048;
 /// size are considered small messages.
 constexpr int SMALL_MESSAGE_SIZE = READ_BUFFER_SIZE / 2;
 
-constexpr auto FIFO_LOOLWSD = "loolwsdfifo";
-constexpr auto FIFO_PATH = "pipe";
 constexpr auto JAILED_DOCUMENT_ROOT = "/user/docs/";
 constexpr auto CHILD_URI = "/loolws/child?";
 constexpr auto NEW_CHILD_URI = "/loolws/newchild?";
diff --git a/loolwsd/LOOLForKit.cpp b/loolwsd/LOOLForKit.cpp
index 2122444..c27e001 100644
--- a/loolwsd/LOOLForKit.cpp
+++ b/loolwsd/LOOLForKit.cpp
@@ -55,8 +55,6 @@ static std::map<Process::PID, std::string> childJails;
 int ClientPortNumber = DEFAULT_CLIENT_PORT_NUMBER;
 int MasterPortNumber = DEFAULT_MASTER_PORT_NUMBER;
 
-static int pipeFd = -1;
-
 /// Dispatcher class to demultiplex requests from
 /// WSD and handles them.
 class CommandDispatcher : public IoUtil::PipeReader
@@ -209,9 +207,8 @@ static int createLibreOfficeKit(const std::string& 
childRoot,
     Process::PID pid;
     if (!(pid = fork()))
     {
-        // quicker than a generic socket closing approach.
-        // (but pipeFd is a pipe, not a socket...?)
-        close(pipeFd);
+        // Close the pipe from loolwsd
+        close(0);
 
         UnitKit::get().postFork();
 
@@ -366,16 +363,6 @@ int main(int argc, char** argv)
     if (!std::getenv("LD_BIND_NOW"))
         Log::info("Note: LD_BIND_NOW is not set.");
 
-    // Open read fifo pipe with WSD.
-    const Path pipePath = Path::forDirectory(childRoot + "/" + FIFO_PATH);
-    const std::string pipeLoolwsd = Path(pipePath, FIFO_LOOLWSD).toString();
-    if ( (pipeFd = open(pipeLoolwsd.c_str(), O_RDONLY) ) < 0 )
-    {
-        Log::syserror("Failed to open pipe [" + pipeLoolwsd + "] for reading. 
Exiting.");
-        std::_Exit(Application::EXIT_SOFTWARE);
-    }
-    Log::debug("open(" + pipeLoolwsd + ", RDONLY) = " + 
std::to_string(pipeFd));
-
     if (!haveCorrectCapabilities())
         return Application::EXIT_SOFTWARE;
 
@@ -393,7 +380,7 @@ int main(int argc, char** argv)
         std::_Exit(Application::EXIT_SOFTWARE);
     }
 
-    CommandDispatcher commandDispatcher(pipeFd);
+    CommandDispatcher commandDispatcher(0);
     Log::info("ForKit process is ready.");
 
     while (!TerminationFlag)
@@ -434,8 +421,6 @@ int main(int argc, char** argv)
         }
     }
 
-    close(pipeFd);
-
     int returnValue = Application::EXIT_OK;
     UnitKit::get().returnValue(returnValue);
 
diff --git a/loolwsd/LOOLWSD.cpp b/loolwsd/LOOLWSD.cpp
index cb5e94f..8b3cec2 100644
--- a/loolwsd/LOOLWSD.cpp
+++ b/loolwsd/LOOLWSD.cpp
@@ -78,6 +78,7 @@
 #include <Poco/Net/SocketAddress.h>
 #include <Poco/Net/WebSocket.h>
 #include <Poco/Path.h>
+#include <Poco/Pipe.h>
 #include <Poco/Process.h>
 #include <Poco/SAX/InputSource.h>
 #include <Poco/StreamCopier.h>
@@ -133,6 +134,7 @@ using Poco::Net::ServerSocket;
 using Poco::Net::SocketAddress;
 using Poco::Net::WebSocket;
 using Poco::Path;
+using Poco::Pipe;
 using Poco::Process;
 using Poco::ProcessHandle;
 using Poco::StreamCopier;
@@ -1848,7 +1850,11 @@ Process::PID LOOLWSD::createForKit()
               Poco::cat(std::string(" "), args.begin(), args.end()));
 
     lastForkRequestTime = std::chrono::steady_clock::now();
-    ProcessHandle child = Process::launch(forKitPath, args);
+    Pipe inPipe;
+    ProcessHandle child = Process::launch(forKitPath, args, &inPipe, nullptr, 
nullptr);
+
+    // The Pipe dtor closes the fd, so dup it.
+    ForKitWritePipe = dup(inPipe.writeHandle());
 
     return child.id();
 }
@@ -1906,23 +1912,6 @@ int LOOLWSD::main(const std::vector<std::string>& 
/*args*/)
     if (ClientPortNumber == MasterPortNumber)
         throw IncompatibleOptionsException("port");
 
-    // Create the directory where the fifo pipe with ForKit will be.
-    const Path pipePath = Path::forDirectory(ChildRoot + "/" + FIFO_PATH);
-    if (!File(pipePath).exists() && !File(pipePath).createDirectory())
-    {
-        Log::error("Failed to create pipe directory [" + pipePath.toString() + 
"].");
-        return Application::EXIT_SOFTWARE;
-    }
-
-    // Create the fifo with ForKit.
-    const std::string pipeLoolwsd = Path(pipePath, FIFO_LOOLWSD).toString();
-    Log::debug("mkfifo(" + pipeLoolwsd + ")");
-    if (mkfifo(pipeLoolwsd.c_str(), 0666) < 0 && errno != EEXIST)
-    {
-        Log::syserror("Failed to create fifo [" + pipeLoolwsd + "].");
-        return Application::EXIT_SOFTWARE;
-    }
-
     // Configure the Server.
     // Note: TCPServer internally uses a ThreadPool to
     // dispatch connections (the default if not given).
@@ -1960,14 +1949,6 @@ int LOOLWSD::main(const std::vector<std::string>& 
/*args*/)
         return Application::EXIT_SOFTWARE;
     }
 
-    // Open write fifo pipe with ForKit.
-    if ( (ForKitWritePipe = open(pipeLoolwsd.c_str(), O_WRONLY) ) < 0 )
-    {
-        Log::syserror("Failed to open pipe [" + pipeLoolwsd + "] for 
writing.");
-        return Application::EXIT_SOFTWARE;
-    }
-    Log::debug("open(" + pipeLoolwsd + ", WRONLY) = " + 
std::to_string(ForKitWritePipe));
-
     // Init the Admin manager
     Admin::instance().setForKitPid(forKitPid);
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to