X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FServer.cpp;h=d7a2e2514c285a26a533bfa67b39ac6bf79c6b5e;hb=70a24259f8e3eb75677178ef5e28ecbb51c2935b;hp=ebaa01c9778be950a656e85ff24cf95f21999e74;hpb=f1cba8ff64b369792fd49f5ddf90e8126ab476ac;p=lyx.git diff --git a/src/Server.cpp b/src/Server.cpp index ebaa01c977..d7a2e2514c 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -178,13 +178,39 @@ void LyXComm::closeConnection() int LyXComm::startPipe(string const & file, bool write) { + static bool stalepipe = false; FileName const filename(file); - if (::access(filename.toFilesystemEncoding().c_str(), F_OK) == 0) { - lyxerr << "LyXComm: Pipe " << filename << " already exists.\n" - << "If no other LyX program is active, please delete" - " the pipe by hand and try again." << endl; - pipename_.erase(); - return -1; + if (filename.exists()) { + if (!write) { + // Let's see whether we have a stale pipe. + int fd = ::open(filename.toFilesystemEncoding().c_str(), + O_WRONLY | O_NONBLOCK); + if (fd >= 0) { + // Another LyX instance is using it. + ::close(fd); + } else if (errno == ENXIO) { + // No process is reading from the other end. + stalepipe = true; + LYXERR(Debug::LYXSERVER, + "LyXComm: trying to remove " + << filename); + filename.removeFile(); + } + } else if (stalepipe) { + LYXERR(Debug::LYXSERVER, "LyXComm: trying to remove " + << filename); + filename.removeFile(); + stalepipe = false; + } + if (filename.exists()) { + lyxerr << "LyXComm: Pipe " << filename + << " already exists.\nIf no other LyX program" + " is active, please delete the pipe by hand" + " and try again." + << endl; + pipename_.erase(); + return -1; + } } if (::mkfifo(filename.toFilesystemEncoding().c_str(), 0600) < 0) {