From 2f3179987f81afcbefe99860d451b0c529d7cc32 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Mon, 8 Aug 1994 07:08:17 +0000 Subject: [PATCH] [SYSV_IPC] (main): Make a separate process so we can listen for multiple requests. --- lib-src/emacsserver.c | 49 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/lib-src/emacsserver.c b/lib-src/emacsserver.c index fe95381c8f9..ed3493b76ce 100644 --- a/lib-src/emacsserver.c +++ b/lib-src/emacsserver.c @@ -245,7 +245,7 @@ msgcatch () 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 @@ main () } } - /* 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 @@ main () 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); } } } -- 2.39.5