From 65c0334b28ce4dea8391020ac8b1e1cde91b6eeb Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Wed, 23 Jan 2013 10:18:23 +0100 Subject: [PATCH] Reuse pipe inode if it already exists. Fixes #3552 --- components/compat/compatcomponent.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/components/compat/compatcomponent.cpp b/components/compat/compatcomponent.cpp index c777bea3f..7d00e3888 100644 --- a/components/compat/compatcomponent.cpp +++ b/components/compat/compatcomponent.cpp @@ -100,11 +100,20 @@ void CompatComponent::Stop(void) #ifndef _WIN32 void CompatComponent::CommandPipeThread(const String& commandPath) { - (void) unlink(commandPath.CStr()); + struct stat statbuf; + bool fifo_ok = false; - int rc = mkfifo(commandPath.CStr(), S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); + if (lstat(commandPath.CStr(), &statbuf) >= 0) { + if (S_ISFIFO(statbuf.st_mode) && access(commandPath.CStr(), R_OK) >= 0) { + fifo_ok = true; + } else { + if (unlink(commandPath.CStr()) < 0) + throw_exception(PosixException("unlink() failed", errno)); + } + } - if (rc < 0) + + if (!fifo_ok && mkfifo(commandPath.CStr(), S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP) < 0) throw_exception(PosixException("mkfifo() failed", errno)); for (;;) {