annotate lib-src/emacsserver.c @ 4774:8e36034f65e2

(doprnt): Use a fixed buffer to store the format specification, but only if we are sure it will fit. Otherwise, use alloca () to get enouhg space. Don't allow negative size specifications to core dump; instead, treat them as positive ("%-20d" == "%20d").
author Brian Fox <bfox@gnu.org>
date Wed, 22 Sep 1993 18:12:09 +0000
parents 1fc792473491
children 16e98db8cc1b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 /* Communication subprocess for GNU Emacs acting as server.
620
88a29c720fa7 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 470
diff changeset
2 Copyright (C) 1986, 1987, 1992 Free Software Foundation, Inc.
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
620
88a29c720fa7 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 470
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 any later version.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 /* The GNU Emacs edit server process is run as a subprocess of Emacs
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 under control of the file lisp/server.el.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 This program accepts communication from client (program emacsclient.c)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 and passes their commands (consisting of keyboard characters)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 up to the Emacs which then executes them. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 #define NO_SHORTNAMES
4696
1fc792473491 Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents: 4178
diff changeset
28 #include <../src/config.h>
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 #undef read
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
30 #undef write
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
31 #undef open
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
32 #undef close
3393
5ee985ad8340 #undef signal.
Richard M. Stallman <rms@gnu.org>
parents: 620
diff changeset
33 #undef signal
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
36 #if !defined(HAVE_SOCKETS) && !defined(HAVE_SYSVIPC)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 #include <stdio.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 main ()
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 fprintf (stderr, "Sorry, the Emacs server is supported only on systems\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 fprintf (stderr, "with Berkeley sockets or System V IPC.\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 #else /* HAVE_SOCKETS or HAVE_SYSVIPC */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
48 #if ! defined (HAVE_SYSVIPC)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
49 /* BSD code is very different from SYSV IPC code */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50
4178
57e52e312188 Include types.h before file.h.
Richard M. Stallman <rms@gnu.org>
parents: 3594
diff changeset
51 #include <sys/types.h>
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 #include <sys/file.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 #include <sys/socket.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 #include <sys/signal.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 #include <sys/un.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 #include <stdio.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 #include <errno.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 extern int errno;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 main ()
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 {
470
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
63 char system_name[32];
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 int s, infd, fromlen;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 struct sockaddr_un server, fromunix;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 char *homedir;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 char *str, string[BUFSIZ], code[BUFSIZ];
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 FILE *infile;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
69 FILE **openfiles;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
70 int openfiles_size;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
71
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72 int geteuid ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 char *getenv ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 openfiles_size = 20;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 openfiles = (FILE **) malloc (openfiles_size * sizeof (FILE *));
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77 if (openfiles == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
78 abort ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
79
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
80 /*
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
81 * Open up an AF_UNIX socket in this person's home directory
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
82 */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
83
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
84 if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
85 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
86 perror ("socket");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
87 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
88 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
89 server.sun_family = AF_UNIX;
470
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
90 #ifndef SERVER_HOME_DIR
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
91 gethostname (system_name, sizeof (system_name));
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
92 sprintf (server.sun_path, "/tmp/esrv%d-%s", geteuid (), system_name);
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
93
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
94 if (unlink (server.sun_path) == -1 && errno != ENOENT)
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
95 {
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
96 perror ("unlink");
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
97 exit (1);
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
98 }
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
99 #else
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
100 if ((homedir = getenv ("HOME")) == NULL)
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
101 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
102 fprintf (stderr,"No home directory\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
103 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
104 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
105 strcpy (server.sun_path, homedir);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
106 strcat (server.sun_path, "/.emacs_server");
470
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
107 /* Delete anyone else's old server. */
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
108 unlink (server.sun_path);
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
109 #endif
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
110
3594
aacca1901f73 * emacsserver.c (main): When we're passing a `struct sockaddr_un'
Jim Blandy <jimb@redhat.com>
parents: 3393
diff changeset
111 if (bind (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2) < 0)
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
112 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
113 perror ("bind");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
114 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
115 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
116 /* Only this user can send commands to this Emacs. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
117 chmod (server.sun_path, 0600);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
118 /*
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
119 * Now, just wait for everything to come in..
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
120 */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
121 if (listen (s, 5) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
122 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
123 perror ("listen");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
124 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
125 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 /* Disable sigpipes in case luser kills client... */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128 signal (SIGPIPE, SIG_IGN);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129 for (;;)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 int rmask = (1 << s) + 1;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132 if (select (s + 1, &rmask, 0, 0, 0) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
133 perror ("select");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
134 if (rmask & (1 << s)) /* client sends list of filenames */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136 fromlen = sizeof (fromunix);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
137 fromunix.sun_family = AF_UNIX;
3594
aacca1901f73 * emacsserver.c (main): When we're passing a `struct sockaddr_un'
Jim Blandy <jimb@redhat.com>
parents: 3393
diff changeset
138 infd = accept (s, (struct sockaddr *) &fromunix, &fromlen); /* open socket fd */
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
139 if (infd < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
140 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
141 if (errno == EMFILE || errno == ENFILE)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
142 printf ("Too many clients.\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 else
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 perror ("accept");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
145 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
146 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148 if (infd >= openfiles_size)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 openfiles_size *= 2;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 openfiles = (FILE **) realloc (openfiles,
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 openfiles_size * sizeof (FILE *));
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 if (openfiles == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 abort ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 infile = fdopen (infd, "r+"); /* open stream */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 if (infile == NULL)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 printf ("Too many clients.\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 write (infd, "Too many clients.\n", 18);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
162 close (infd); /* Prevent descriptor leak.. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
163 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165 str = fgets (string, BUFSIZ, infile);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
166 if (str == NULL)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
167 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
168 perror ("fgets");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
169 close (infd); /* Prevent descriptor leak.. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
170 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
171 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
172 openfiles[infd] = infile;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
173 printf ("Client: %d %s", infd, string);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
174 /* If what we read did not end in a newline,
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
175 it means there is more. Keep reading from the socket
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
176 and outputting to Emacs, until we get the newline. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
177 while (string[strlen (string) - 1] != '\n')
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
178 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
179 if (fgets (string, BUFSIZ, infile) == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
180 break;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
181 printf ("%s", string);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
182 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
183 fflush (stdout);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
184 fflush (infile);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
185 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 else if (rmask & 1) /* emacs sends codeword, fd, and string message */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189 /* Read command codeword and fd */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190 clearerr (stdin);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191 scanf ("%s %d%*c", code, &infd);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 if (ferror (stdin) || feof (stdin))
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 fprintf (stderr, "server: error reading from standard input\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 /* Transfer text from Emacs to the client, up to a newline. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 infile = openfiles[infd];
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 while (1)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 if (fgets (string, BUFSIZ, stdin) == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 break;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 fprintf (infile, "%s", string);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 if (string[strlen (string) - 1] == '\n')
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 break;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
208 fflush (infile);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 /* If command is close, close connection to client. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 if (strncmp (code, "Close:", 6) == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 if (infd > 2)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
213 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
214 fclose (infile);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
215 close (infd);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
216 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
217 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
218 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
219 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
220 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
221
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 #else /* This is the SYSV IPC section */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 #include <sys/types.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 #include <sys/signal.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 #include <sys/ipc.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
227 #include <sys/msg.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
228 #include <setjmp.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
230 jmp_buf msgenv;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231
620
88a29c720fa7 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 470
diff changeset
232 SIGTYPE
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
233 msgcatch ()
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 longjmp (msgenv, 1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 /* "THIS has to be fixed. Remember, stderr may not exist...-rlk."
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 Incorrect. This program runs as an inferior of Emacs.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 Its stderr always exists--rms. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 #include <stdio.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 main ()
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 int s, infd, fromlen;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 key_t key;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 struct msgbuf * msgp =
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 struct msqid_ds msg_st;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 int p;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 char *homedir, *getenv ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 char string[BUFSIZ];
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
254 FILE *infile;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 /*
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 * Create a message queue using ~/.emacs_server as the path for ftok
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
259 if ((homedir = getenv ("HOME")) == NULL)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 fprintf (stderr,"No home directory\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 strcpy (string, homedir);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 strcat (string, "/.emacs_server");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 creat (string, 0600);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 key = ftok (string, 1); /* unlikely to be anyone else using it */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268 s = msgget (key, 0600 | IPC_CREAT);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 if (s == -1)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 perror ("msgget");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 /* Fork so we can close connection even if parent dies */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 p = fork ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 if (setjmp (msgenv))
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 msgctl (s, IPC_RMID, 0);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 kill (p, SIGKILL);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 exit (0);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 signal (SIGTERM, msgcatch);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 signal (SIGINT, msgcatch);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 /* If parent goes away, remove message box and exit */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 if (p == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 p = getppid ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 setpgrp (); /* Gnu kills process group on exit */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 while (1)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 if (kill (p, 0) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 msgctl (s, IPC_RMID, 0);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 exit (0);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 sleep (10);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 while (1)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
302 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
303 if ((fromlen = msgrcv (s, msgp, BUFSIZ - 1, 1, 0)) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
304 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 perror ("msgrcv");
470
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
306 exit (1);
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 else
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 msgctl (s, IPC_STAT, &msg_st);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 strncpy (string, msgp->mtext, fromlen);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 string[fromlen] = 0; /* make sure */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 /* Newline is part of string.. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 printf ("Client: %d %s", s, string);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 fflush (stdout);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 /* Now, wait for a wakeup */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 fgets (msgp->mtext, BUFSIZ, stdin);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 msgp->mtext[strlen (msgp->mtext)-1] = 0;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319 /* strcpy (msgp->mtext, "done");*/
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 msgp->mtype = msg_st.msg_lspid;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 msgsnd (s, msgp, strlen (msgp->mtext)+1, 0);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 #endif /* HAVE_SYSVIPC */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 #endif /* HAVE_SOCKETS or HAVE_SYSVIPC */