summaryrefslogtreecommitdiff
path: root/lib-src/emacsclient.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib-src/emacsclient.c')
-rw-r--r--lib-src/emacsclient.c29
1 files changed, 21 insertions, 8 deletions
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;
}