Commit 2f317998 authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

[SYSV_IPC] (main): Make a separate process

so we can listen for multiple requests.
parent 93cffa2f
...@@ -245,7 +245,7 @@ msgcatch () ...@@ -245,7 +245,7 @@ msgcatch ()
main () main ()
{ {
int s, infd, fromlen; int s, infd, fromlen, ioproc;
key_t key; key_t key;
struct msgbuf * msgp = struct msgbuf * msgp =
(struct msgbuf *) malloc (sizeof *msgp + BUFSIZ); (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ);
...@@ -302,7 +302,25 @@ main () ...@@ -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) while (1)
{ {
if ((fromlen = msgrcv (s, msgp, BUFSIZ - 1, 1, 0)) < 0) if ((fromlen = msgrcv (s, msgp, BUFSIZ - 1, 1, 0)) < 0)
...@@ -313,17 +331,30 @@ main () ...@@ -313,17 +331,30 @@ main ()
else else
{ {
msgctl (s, IPC_STAT, &msg_st); 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); strncpy (string, msgp->mtext, fromlen);
string[fromlen] = 0; /* make sure */ string[fromlen] = 0; /* make sure */
/* Newline is part of string.. */ /* Newline is part of string.. */
printf ("Client: %d %s", s, string); printf ("Client: %d %s", msg_st.msg_lspid, string);
fflush (stdout); 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);
} }
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment