Attached is a patch to LyXComm:read_ready that enables the 
LyXServer to work coherently with Tru64 unix. It's little more 
than a clean-up of the existing code and does not change the 
resulting string passed to the LyXServer /at all/.

It transpires that the root of the problems lies in 

  int select(
          int nfds,
          fd_set *readfds,
          fd_set *writefds,
          fd_set *exceptfds,
          struct timeval *timeout) ;

that lies at the heart of fl_watch_io. The Tru64 version behaves 
differently to that on Linux boxes, returning a +ve value if a 
pipe is not connected "at both ends", ie by a read and a write 
file descriptor.

I'll apply this patch if no-one says not to.
Angus
Index: src/lyxserver.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxserver.C,v
retrieving revision 1.45
diff -u -p -r1.45 lyxserver.C
--- src/lyxserver.C	14 Aug 2002 21:22:29 -0000	1.45
+++ src/lyxserver.C	11 Sep 2002 15:39:49 -0000
@@ -257,56 +257,54 @@ void LyXComm::emergencyCleanup()
 // Receives messages and sends then to client
 void LyXComm::read_ready()
 {
-	if (lyxerr.debugging(Debug::LYXSERVER)) {
-		lyxerr << "LyXComm: Receiving from fd " << infd << endl;
-	}
+	// nb! make read_buffer_ a class-member for multiple sessions
+	static string read_buffer_;
+	read_buffer_.erase();
 
-	int const CMDBUFLEN = 100;
-	char charbuf[CMDBUFLEN];
-	string cmd;
-// nb! make lsbuf a class-member for multiple sessions
-	static string lsbuf;
+	int const charbuf_size = 100;
+	char charbuf[charbuf_size];
 
 	errno = 0;
 	int status;
 	// the single = is intended here.
-	while ((status = read(infd, charbuf, CMDBUFLEN - 1))) {
-		int rerrno = errno;
- 
+	while ((status = ::read(infd, charbuf, charbuf_size - 1))) {
+
 		if (status > 0) {
-			charbuf[status]= '\0'; // turn it into a c string
-			lsbuf += rtrim(charbuf, "\r");
-			// commit any commands read
-			while (lsbuf.find('\n') != string::npos) {
-				// split() grabs the entire string if
-				// the delim /wasn't/ found. ?:-P
-				lsbuf= split(lsbuf, cmd,'\n');
-				lyxerr[Debug::LYXSERVER]
-					<< "LyXComm: status:" << status
-					<< ", lsbuf:" << lsbuf
-					<< ", cmd:" << cmd << endl;
-				if (!cmd.empty())
-					clientcb(client, cmd);
-					//\n or not \n?
-			}
-		}
-		if (rerrno == EAGAIN) {
-			errno = 0;
-			return;
-		}
-		if (rerrno != 0) {
-			lyxerr << "LyXComm: " << strerror(rerrno) << endl;
-			if (!lsbuf.empty()) {
+			charbuf[status] = '\0'; // turn it into a c string
+			read_buffer_ += rtrim(charbuf, "\r");
+
+		} else if (errno != EAGAIN) {
+			if (!read_buffer_.empty()) {
 				lyxerr << "LyXComm: truncated command: "
-				       << lsbuf << endl;
-				lsbuf.erase();
+				       << read_buffer_ << '\n'
+				       << "Resetting connection" << endl;
+				read_buffer_.erase();
 			}
-			break; // reset connection
+
+			// reset connection			
+			closeConnection();
+			openConnection();
+			break;
+
+		} else {
+			// errno == EAGAIN
+		  	// Nothing new has arrived, so now's the time
+			// to tell the outside world if there's anything
+			// in the read buffer.
+			break;
 		}
 	}
-	closeConnection();
-	openConnection();
-	errno= 0;
+
+	if (!read_buffer_.empty()) {
+		read_buffer_ = rtrim(read_buffer_, "\n");
+		lyxerr[Debug::LYXSERVER]
+			<< "LyXComm: Received from fd "
+			<< infd << '\n'
+			<< '\"' << read_buffer_ << '\"' << endl;
+		clientcb(client, read_buffer_);
+	}
+
+	errno = 0;
 }
 
 

Reply via email to