# HG changeset patch # User Richard M. Stallman # Date 838131514 0 # Node ID 7e712d42d37198ef0086a28101a8891484b65fc8 # Parent 5ddb082ffebbdf586adbaf5d72f203432a15194f (main) [HAVE_SOCKETS]: Use two separate stdio streams, one for sending and one for reading the reply. diff -r 5ddb082ffebb -r 7e712d42d371 lib-src/emacsclient.c --- 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; }