From db2705c47106808cf02af1b99fa517bf5a3f6202 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Tue, 23 Jul 1996 14:18:34 +0000 Subject: (main) [HAVE_SOCKETS]: Use two separate stdio streams, one for sending and one for reading the reply. --- lib-src/emacsclient.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'lib-src/emacsclient.c') diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index b3dac792390..d1fb4df2ac7 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -63,7 +63,7 @@ main (argc, argv) { 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 @@ main (argc, argv) 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 @@ main (argc, argv) 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 @@ main (argc, argv) 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. */ + /* 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, out)) + while (str = fgets (string, BUFSIZ, in)) printf ("%s", str); - + return 0; } -- cgit v1.2.1