Mercurial > emacs
changeset 15758:7e712d42d371
(main) [HAVE_SOCKETS]: Use two separate stdio
streams, one for sending and one for reading the reply.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Tue, 23 Jul 1996 14:18:34 +0000 |
parents | 5ddb082ffebb |
children | e74f36ff89e7 |
files | lib-src/emacsclient.c |
diffstat | 1 files changed, 22 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/lib-src/emacsclient.c Tue Jul 23 14:00:08 1996 +0000 +++ b/lib-src/emacsclient.c Tue Jul 23 14:18:34 1996 +0000 @@ -63,7 +63,7 @@ { char system_name[32]; int s, i; - FILE *out; + FILE *out, *in; struct sockaddr_un server; char *homedir, *cwd, *str; char string[BUFSIZ]; @@ -132,6 +132,8 @@ perror ("connect"); exit (1); } + + /* We use the stream OUT to send our command to the server. */ if ((out = fdopen (s, "r+")) == NULL) { fprintf (stderr, "%s: ", argv[0]); @@ -139,6 +141,18 @@ exit (1); } + /* We use the stream IN to read the response. + We used to use just one stream for both output and input + on the socket, but reversing direction works nonportably: + on some systems, the output appears as the first input; + on other systems it does not. */ + if ((in = fdopen (s, "r+")) == NULL) + { + fprintf (stderr, "%s: ", argv[0]); + perror ("fdopen"); + exit (1); + } + #ifdef BSD cwd = getwd (string); #else @@ -170,15 +184,14 @@ printf ("Waiting for Emacs..."); fflush (stdout); - rewind (out); /* re-read the output */ - str = fgets (string, BUFSIZ, out); - printf ("\n"); + /* Now, wait for an answer and print any messages. On some systems, + the first line we read will actually be the output we just sent. + We can't predict whether that will happen, so if it does, we + detect it by recognizing `Client: ' at the beginning. */ + + while (str = fgets (string, BUFSIZ, in)) + printf ("%s", str); - /* Now, wait for an answer and print any messages. */ - - while (str = fgets (string, BUFSIZ, out)) - printf ("%s", str); - return 0; }