// We assume that we don't make it
ready = false;
- if (pipename.empty()) return;
+ if (pipename.empty()) {
+ lyxerr[Debug::LYXSERVER]
+ << "LyXComm: server is disabled, nothing to do"
+ << endl;
+ return;
+ }
- if ((infd = startPipe(pipename + ".in")) == -1)
+ if ((infd = startPipe(inPipeName(), false)) == -1)
return;
- if ((outfd = startPipe(pipename + ".out")) == -1) {
- endPipe(infd, pipename + ".in");
+ if ((outfd = startPipe(outPipeName(), true)) == -1) {
+ endPipe(infd, inPipeName());
return;
}
if (fcntl(outfd, F_SETFL, O_NONBLOCK) < 0) {
- lyxerr << "LyXComm: Could not set flags on pipe " << pipename << ".out"
+ lyxerr << "LyXComm: Could not set flags on pipe " << outPipeName()
<< '\n' << strerror(errno) << endl;
return;
}
lyxerr[Debug::LYXSERVER] << "LyXComm: Closing connection" << endl;
if (pipename.empty()) {
+ lyxerr[Debug::LYXSERVER]
+ << "LyXComm: server is disabled, nothing to do"
+ << endl;
return;
}
return;
}
- endPipe(infd, pipename + ".in");
- endPipe(outfd, pipename + ".out");
+ endPipe(infd, inPipeName());
+ endPipe(outfd, outPipeName());
ready = false;
}
-int LyXComm::startPipe(string const & filename)
+int LyXComm::startPipe(string const & filename, bool write)
{
int fd;
<< strerror(errno) << endl;
return -1;
};
- fd = ::open(filename.c_str(), O_RDONLY|O_NONBLOCK);
+ fd = ::open(filename.c_str(), write ? (O_RDWR) : (O_RDONLY|O_NONBLOCK));
#endif
if (fd < 0) {
lyx::unlink(filename);
return -1;
}
- fl_add_io_callback(fd, FL_READ, C_LyXComm_callback, this);
+
+ if (!write)
+ fl_add_io_callback(fd, FL_READ, C_LyXComm_callback, this);
+
return fd;
}
void LyXComm::emergencyCleanup()
{
- endPipe(infd, pipename + ".in");
- endPipe(outfd, pipename + ".out");
+ if (!pipename.empty()) {
+ endPipe(infd, inPipeName());
+ endPipe(outfd, outPipeName());
+ }
}
errno = 0;
int status;
// the single = is intended here.
- while((status = read(fd, charbuf, CMDBUFLEN-1)))
+ while ((status = read(fd, charbuf, CMDBUFLEN-1)))
{// break and return in loop
if (status > 0) // got something
{
charbuf[status]= '\0'; // turn it into a c string
lsbuf += strip(charbuf, '\r');
// commit any commands read
- while(lsbuf.find('\n') != string::npos) // while still
+ while (lsbuf.find('\n') != string::npos) // while still
// commands
// left
{
// Format: LYXCMD:<client>:<func>:<argstring>\n
//
bool server_only = false;
- while(*p) {
+ while (*p) {
// --- 1. check 'header' ---
if (compare(p, "LYXSRV:", 7) == 0) {
server_only = true;
} else if (0 != compare(p, "LYXCMD:", 7)) {
- lyxerr << "LyXServer: Unknown request" << endl;
+ lyxerr << "LyXServer: Unknown request \"" << p << "\"" << endl;
return;
}
p += 7;
// --- 2. for the moment ignore the client name ---
string client;
- while(*p && *p != ':')
+ while (*p && *p != ':')
client += char(*p++);
if (*p == ':') ++p;
if (!*p) return;
// --- 3. get function name ---
string cmd;
- while(*p && *p != ':')
+ while (*p && *p != ':')
cmd += char(*p++);
// --- 4. parse the argument ---
string arg;
if (!server_only && *p == ':' && *(++p)) {
- while(*p && *p != '\n')
+ while (*p && *p != '\n')
arg += char(*p++);
if (*p) ++p;
}