changeset 8482:ffbf38ae06d1

[SYSV_IPC] (main): Make a separate process so we can listen for multiple requests.
author Richard M. Stallman <rms@gnu.org>
date Mon, 08 Aug 1994 07:08:17 +0000
parents b4c5b7658550
children 19dbc8373bec
files lib-src/emacsserver.c
diffstat 1 files changed, 40 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/lib-src/emacsserver.c	Mon Aug 08 04:38:37 1994 +0000
+++ b/lib-src/emacsserver.c	Mon Aug 08 07:08:17 1994 +0000
@@ -245,7 +245,7 @@
 
 main ()
 {
-  int s, infd, fromlen;
+  int s, infd, fromlen, ioproc;
   key_t key;
   struct msgbuf * msgp =
     (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ);
@@ -302,7 +302,25 @@
 	}
     }
 
-  /* This is executed in the child made by forking above.  */
+  /* This is executed in the child made by forking above.
+     Call it c1.  Make another process, ioproc.  */
+
+  ioproc = fork ();
+  if (ioproc == 0)
+    {
+      /* In process ioproc, wait for text from Emacs,
+	 and send it to the process c1.
+	 This way, c1 only has to wait for one source of input.  */
+      while (fgets (msgp->mtext, BUFSIZ, stdin))
+	{
+	  msgp->mtype = 1;
+	  msgsnd (s, msgp, strlen (msgp->mtext) + 1, 0);
+	}
+      exit (1);
+    }
+
+  /* In the process c1,
+     listen for messages from clients and pass them to Emacs.  */
   while (1)
     {
       if ((fromlen = msgrcv (s, msgp, BUFSIZ - 1, 1, 0)) < 0)
@@ -313,17 +331,30 @@
       else
         {
 	  msgctl (s, IPC_STAT, &msg_st);
+
+	  /* Distinguish whether the message came from a client, or from
+	     ioproc.  */
+	  if (msg_st.msg_lspid == ioproc)
+	    {
+	      char code[BUFSIZ];
+	      int inproc;
+
+	      /* Message from ioproc: tell a client we are done.  */
+	      msgp->mtext[strlen (msgp->mtext)-1] = 0;
+	      sscanf (msgp->mtext, "%s %d", code, &inproc);
+	      msgp->mtype = inproc;
+	      msgsnd (s, msgp, strlen (msgp->mtext) + 1, 0);
+	      continue;
+	    }
+
+	  /* This is a request from a client: copy to stdout
+	     so that Emacs will get it.  Include msg_lspid
+	     so server.el can tell us where to send the reply.  */
 	  strncpy (string, msgp->mtext, fromlen);
 	  string[fromlen] = 0;	/* make sure */
 	  /* Newline is part of string.. */
-	  printf ("Client: %d %s", s, string); 
+	  printf ("Client: %d %s", msg_st.msg_lspid, string);
 	  fflush (stdout);
-	  /* Now, wait for a wakeup */
-	  fgets (msgp->mtext, BUFSIZ, stdin);
-	  msgp->mtext[strlen (msgp->mtext)-1] = 0;
-	  /*	  strcpy (msgp->mtext, "done");*/
-	  msgp->mtype = msg_st.msg_lspid;
-	  msgsnd (s, msgp, strlen (msgp->mtext)+1, 0);
 	}
     }
 }