Mercurial > emacs
annotate lib-src/emacsserver.c @ 22758:dbd9ecc9dbac
Added next-buffer/previous-buffer keybindings (bound to M-n/M-p).
(crisp-unbury-buffer): New function.
Fixed bogus XEmacs/Lucid string-match checking.
Made modeline entry mouse2-able.
(crisp-mode-map): Make this a sparse keymap parented from
current-global-map.
(crisp-mode-original-keymap): Don't copy the keymap.
(crisp-last-last-command): Renamed from last-last-command. defvar it.
(crisp-mode): Honor ARG.
(crisp-kill-line, crisp-copy-line): When a region isn't highlighted,
use the region from point to eol. Honor prefix argument.
(crisp-submit-bug-report): New command, taken from cc-mode.
Shortened the version numbering, removed the release-version tracking
(crisp-version): New function.
New keybindings `C-home', `C-end', `M-home', `M-end', `C-f', `M-l',
`M-m'.
(crisp-copy-line): No need to save point.
Removed S-right and S-left bindings.
Abstract the marking and selection interfaces so that we can be
compatible with both Emacs and XEmacs. And try and make the
behavior as close as possible under both environments so that there
are no surprises.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Tue, 14 Jul 1998 22:17:35 +0000 |
parents | 1a8c44e38d9c |
children | 2ce0e36402ff |
rev | line source |
---|---|
204 | 1 /* Communication subprocess for GNU Emacs acting as server. |
9418
5d8165cdb0d8
[! SYSVIPC] (main): Fix uses of FD_* macros: fd_set arg is a pointer,
Roland McGrath <roland@gnu.org>
parents:
8811
diff
changeset
|
2 Copyright (C) 1986, 1987, 1992, 1994 Free Software Foundation, Inc. |
204 | 3 |
4 This file is part of GNU Emacs. | |
5 | |
6 GNU Emacs is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
620 | 8 the Free Software Foundation; either version 2, or (at your option) |
204 | 9 any later version. |
10 | |
11 GNU Emacs is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GNU Emacs; see the file COPYING. If not, write to | |
14186
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
13925
diff
changeset
|
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
13925
diff
changeset
|
19 Boston, MA 02111-1307, USA. */ |
204 | 20 |
21 | |
22 /* The GNU Emacs edit server process is run as a subprocess of Emacs | |
23 under control of the file lisp/server.el. | |
24 This program accepts communication from client (program emacsclient.c) | |
25 and passes their commands (consisting of keyboard characters) | |
26 up to the Emacs which then executes them. */ | |
27 | |
28 #define NO_SHORTNAMES | |
16449 | 29 #include <signal.h> |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4178
diff
changeset
|
30 #include <../src/config.h> |
204 | 31 #undef read |
32 #undef write | |
33 #undef open | |
34 #undef close | |
3393 | 35 #undef signal |
204 | 36 |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
37 #if !defined (HAVE_SOCKETS) && !defined (HAVE_SYSVIPC) |
204 | 38 #include <stdio.h> |
39 | |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
40 int |
204 | 41 main () |
42 { | |
43 fprintf (stderr, "Sorry, the Emacs server is supported only on systems\n"); | |
44 fprintf (stderr, "with Berkeley sockets or System V IPC.\n"); | |
45 exit (1); | |
46 } | |
47 | |
48 #else /* HAVE_SOCKETS or HAVE_SYSVIPC */ | |
49 | |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
50 void perror_1 (); |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
51 void fatal_error (); |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
52 |
11368
91abe61bb495
Test NO_SOCKETS_IN_FILE_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents:
11031
diff
changeset
|
53 #if defined (HAVE_SOCKETS) && ! defined (NO_SOCKETS_IN_FILE_SYSTEM) |
204 | 54 /* BSD code is very different from SYSV IPC code */ |
55 | |
4178
57e52e312188
Include types.h before file.h.
Richard M. Stallman <rms@gnu.org>
parents:
3594
diff
changeset
|
56 #include <sys/types.h> |
204 | 57 #include <sys/file.h> |
58 #include <sys/socket.h> | |
59 #include <sys/un.h> | |
60 #include <stdio.h> | |
61 #include <errno.h> | |
13925
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
62 #include <sys/stat.h> |
204 | 63 |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
64 #ifdef HAVE_UNISTD_H |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
65 #include <unistd.h> |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
66 #endif |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
67 |
204 | 68 extern int errno; |
69 | |
8811
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
70 /* Copied from src/process.c */ |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
71 #ifdef FD_SET |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
72 /* We could get this from param.h, but better not to depend on finding that. |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
73 And better not to risk that it might define other symbols used in this |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
74 file. */ |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
75 #ifdef FD_SETSIZE |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
76 #define MAXDESC FD_SETSIZE |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
77 #else |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
78 #define MAXDESC 64 |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
79 #endif |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
80 #define SELECT_TYPE fd_set |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
81 #else /* no FD_SET */ |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
82 #define MAXDESC 32 |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
83 #define SELECT_TYPE int |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
84 |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
85 /* Define the macros to access a single-int bitmap of descriptors. */ |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
86 #define FD_SET(n, p) (*(p) |= (1 << (n))) |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
87 #define FD_CLR(n, p) (*(p) &= ~(1 << (n))) |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
88 #define FD_ISSET(n, p) (*(p) & (1 << (n))) |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
89 #define FD_ZERO(p) (*(p) = 0) |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
90 #endif /* no FD_SET */ |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
91 |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
92 /* This is the file name of the socket that we made. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
93 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
94 char *socket_name; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
95 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
96 /* Name of this program. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
97 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
98 char *progname; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
99 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
100 /* Handle fatal signals. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
101 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
102 /* This is the handler. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
103 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
104 SIGTYPE |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
105 delete_socket (sig) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
106 int sig; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
107 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
108 signal (sig, SIG_DFL); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
109 unlink (socket_name); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
110 kill (getpid (), sig); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
111 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
112 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
113 /* Set up to handle all the signals. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
114 |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
115 void |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
116 handle_signals () |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
117 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
118 signal (SIGHUP, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
119 signal (SIGINT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
120 signal (SIGQUIT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
121 signal (SIGILL, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
122 signal (SIGTRAP, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
123 #ifdef SIGABRT |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
124 signal (SIGABRT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
125 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
126 #ifdef SIGHWE |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
127 signal (SIGHWE, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
128 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
129 #ifdef SIGPRE |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
130 signal (SIGPRE, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
131 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
132 #ifdef SIGORE |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
133 signal (SIGORE, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
134 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
135 #ifdef SIGUME |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
136 signal (SIGUME, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
137 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
138 #ifdef SIGDLK |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
139 signal (SIGDLK, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
140 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
141 #ifdef SIGCPULIM |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
142 signal (SIGCPULIM, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
143 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
144 #ifdef SIGIOT |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
145 /* This is missing on some systems - OS/2, for example. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
146 signal (SIGIOT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
147 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
148 #ifdef SIGEMT |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
149 signal (SIGEMT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
150 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
151 signal (SIGFPE, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
152 #ifdef SIGBUS |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
153 signal (SIGBUS, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
154 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
155 signal (SIGSEGV, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
156 #ifdef SIGSYS |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
157 signal (SIGSYS, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
158 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
159 signal (SIGTERM, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
160 #ifdef SIGXCPU |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
161 signal (SIGXCPU, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
162 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
163 #ifdef SIGXFSZ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
164 signal (SIGXFSZ, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
165 #endif /* SIGXFSZ */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
166 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
167 #ifdef AIX |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
168 /* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
169 signal (SIGXCPU, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
170 #ifndef _I386 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
171 signal (SIGIOINT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
172 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
173 signal (SIGGRANT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
174 signal (SIGRETRACT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
175 signal (SIGSOUND, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
176 signal (SIGMSG, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
177 #endif /* AIX */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
178 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
179 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
180 /* Print error message. `s1' is printf control string, `s2' is arg for it. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
181 void |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
182 error (s1, s2) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
183 char *s1, *s2; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
184 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
185 fprintf (stderr, "%s: ", progname); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
186 fprintf (stderr, s1, s2); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
187 fprintf (stderr, "\n"); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
188 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
189 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
190 /* Print error message and exit. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
191 void |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
192 fatal (s1, s2) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
193 char *s1, *s2; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
194 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
195 error (s1, s2); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
196 exit (1); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
197 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
198 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
199 /* Like malloc but get fatal error if memory is exhausted. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
200 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
201 long * |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
202 xmalloc (size) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
203 unsigned int size; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
204 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
205 long *result = (long *) malloc (size); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
206 if (result == NULL) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
207 fatal ("virtual memory exhausted", 0); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
208 return result; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
209 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
210 |
15682
9f7228c75a4b
[__GNU_LIBRARY__]: Use size_t for fromlen.
Karl Heuer <kwzh@gnu.org>
parents:
15591
diff
changeset
|
211 int |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
212 main (argc, argv) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
213 int argc; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
214 char **argv; |
204 | 215 { |
470 | 216 char system_name[32]; |
16137
dc1387f877d4
(main): Declare `fromlen' as size_t, undo previous change.
Erik Naggum <erik@naggum.no>
parents:
16122
diff
changeset
|
217 int s, infd; |
19344
1151154e9ba4
(main): use SOCKLEN_TYPE for fromlen, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents:
16449
diff
changeset
|
218 #ifdef SOCKLEN_TYPE |
1151154e9ba4
(main): use SOCKLEN_TYPE for fromlen, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents:
16449
diff
changeset
|
219 SOCKLEN_TYPE fromlen; |
1151154e9ba4
(main): use SOCKLEN_TYPE for fromlen, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents:
16449
diff
changeset
|
220 #else |
16137
dc1387f877d4
(main): Declare `fromlen' as size_t, undo previous change.
Erik Naggum <erik@naggum.no>
parents:
16122
diff
changeset
|
221 size_t fromlen; |
19344
1151154e9ba4
(main): use SOCKLEN_TYPE for fromlen, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents:
16449
diff
changeset
|
222 #endif |
16137
dc1387f877d4
(main): Declare `fromlen' as size_t, undo previous change.
Erik Naggum <erik@naggum.no>
parents:
16122
diff
changeset
|
223 struct sockaddr_un server, fromunix; |
204 | 224 char *homedir; |
225 char *str, string[BUFSIZ], code[BUFSIZ]; | |
226 FILE *infile; | |
227 FILE **openfiles; | |
228 int openfiles_size; | |
13925
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
229 struct stat statbuf; |
204 | 230 |
8025
f25cb844c3dd
(main): Don't declare geteuid.
Richard M. Stallman <rms@gnu.org>
parents:
5856
diff
changeset
|
231 #ifndef convex |
204 | 232 char *getenv (); |
8025
f25cb844c3dd
(main): Don't declare geteuid.
Richard M. Stallman <rms@gnu.org>
parents:
5856
diff
changeset
|
233 #endif |
204 | 234 |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
235 progname = argv[0]; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
236 |
204 | 237 openfiles_size = 20; |
238 openfiles = (FILE **) malloc (openfiles_size * sizeof (FILE *)); | |
239 if (openfiles == 0) | |
240 abort (); | |
241 | |
242 /* | |
243 * Open up an AF_UNIX socket in this person's home directory | |
244 */ | |
245 | |
246 if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) | |
247 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
248 perror_1 ("socket"); |
204 | 249 exit (1); |
250 } | |
251 server.sun_family = AF_UNIX; | |
470 | 252 #ifndef SERVER_HOME_DIR |
253 gethostname (system_name, sizeof (system_name)); | |
254 sprintf (server.sun_path, "/tmp/esrv%d-%s", geteuid (), system_name); | |
255 | |
256 if (unlink (server.sun_path) == -1 && errno != ENOENT) | |
257 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
258 perror_1 ("unlink"); |
470 | 259 exit (1); |
260 } | |
261 #else | |
262 if ((homedir = getenv ("HOME")) == NULL) | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
263 fatal_error ("No home directory\n"); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
264 |
204 | 265 strcpy (server.sun_path, homedir); |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
266 strcat (server.sun_path, "/.emacs-server-"); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
267 gethostname (system_name, sizeof (system_name)); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
268 strcat (server.sun_path, system_name); |
470 | 269 /* Delete anyone else's old server. */ |
270 unlink (server.sun_path); | |
204 | 271 #endif |
272 | |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
273 /* Save the socket name so we can delete it. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
274 socket_name = (char *) xmalloc (strlen (server.sun_path) + 1); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
275 strcpy (socket_name, server.sun_path); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
276 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
277 handle_signals (); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
278 |
3594
aacca1901f73
* emacsserver.c (main): When we're passing a `struct sockaddr_un'
Jim Blandy <jimb@redhat.com>
parents:
3393
diff
changeset
|
279 if (bind (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2) < 0) |
204 | 280 { |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
281 perror_1 ("bind"); |
204 | 282 exit (1); |
283 } | |
284 /* Only this user can send commands to this Emacs. */ | |
13925
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
285 if (stat (server.sun_path, &statbuf) < 0) |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
286 { |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
287 perror_1 ("bind"); |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
288 exit (1); |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
289 } |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
290 |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
291 chmod (server.sun_path, statbuf.st_mode & 0600); |
204 | 292 /* |
293 * Now, just wait for everything to come in.. | |
294 */ | |
295 if (listen (s, 5) < 0) | |
296 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
297 perror_1 ("listen"); |
204 | 298 exit (1); |
299 } | |
300 | |
301 /* Disable sigpipes in case luser kills client... */ | |
302 signal (SIGPIPE, SIG_IGN); | |
303 for (;;) | |
304 { | |
8811
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
305 SELECT_TYPE rmask; |
9418
5d8165cdb0d8
[! SYSVIPC] (main): Fix uses of FD_* macros: fd_set arg is a pointer,
Roland McGrath <roland@gnu.org>
parents:
8811
diff
changeset
|
306 FD_ZERO (&rmask); |
5d8165cdb0d8
[! SYSVIPC] (main): Fix uses of FD_* macros: fd_set arg is a pointer,
Roland McGrath <roland@gnu.org>
parents:
8811
diff
changeset
|
307 FD_SET (0, &rmask); |
5d8165cdb0d8
[! SYSVIPC] (main): Fix uses of FD_* macros: fd_set arg is a pointer,
Roland McGrath <roland@gnu.org>
parents:
8811
diff
changeset
|
308 FD_SET (s, &rmask); |
8811
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
309 if (select (s + 1, &rmask, 0, 0, 0) < 0) |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
310 perror_1 ("select"); |
9418
5d8165cdb0d8
[! SYSVIPC] (main): Fix uses of FD_* macros: fd_set arg is a pointer,
Roland McGrath <roland@gnu.org>
parents:
8811
diff
changeset
|
311 if (FD_ISSET (s, &rmask)) /* client sends list of filenames */ |
204 | 312 { |
313 fromlen = sizeof (fromunix); | |
314 fromunix.sun_family = AF_UNIX; | |
8811
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
315 infd = accept (s, (struct sockaddr *) &fromunix, &fromlen); |
204 | 316 if (infd < 0) |
317 { | |
318 if (errno == EMFILE || errno == ENFILE) | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
319 fprintf (stderr, "Error: too many clients.\n"); |
204 | 320 else |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
321 perror_1 ("accept"); |
204 | 322 continue; |
323 } | |
324 | |
325 if (infd >= openfiles_size) | |
326 { | |
327 openfiles_size *= 2; | |
328 openfiles = (FILE **) realloc (openfiles, | |
329 openfiles_size * sizeof (FILE *)); | |
330 if (openfiles == 0) | |
331 abort (); | |
332 } | |
333 | |
334 infile = fdopen (infd, "r+"); /* open stream */ | |
335 if (infile == NULL) | |
336 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
337 fprintf (stderr, "Error: too many clients.\n"); |
204 | 338 write (infd, "Too many clients.\n", 18); |
339 close (infd); /* Prevent descriptor leak.. */ | |
340 continue; | |
341 } | |
342 str = fgets (string, BUFSIZ, infile); | |
343 if (str == NULL) | |
344 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
345 perror_1 ("fgets"); |
204 | 346 close (infd); /* Prevent descriptor leak.. */ |
347 continue; | |
348 } | |
349 openfiles[infd] = infile; | |
350 printf ("Client: %d %s", infd, string); | |
351 /* If what we read did not end in a newline, | |
352 it means there is more. Keep reading from the socket | |
353 and outputting to Emacs, until we get the newline. */ | |
354 while (string[strlen (string) - 1] != '\n') | |
355 { | |
356 if (fgets (string, BUFSIZ, infile) == 0) | |
357 break; | |
358 printf ("%s", string); | |
359 } | |
360 fflush (stdout); | |
361 fflush (infile); | |
362 continue; | |
363 } | |
9418
5d8165cdb0d8
[! SYSVIPC] (main): Fix uses of FD_* macros: fd_set arg is a pointer,
Roland McGrath <roland@gnu.org>
parents:
8811
diff
changeset
|
364 else if (FD_ISSET (0, &rmask)) /* emacs sends codeword, fd, and string message */ |
204 | 365 { |
366 /* Read command codeword and fd */ | |
367 clearerr (stdin); | |
368 scanf ("%s %d%*c", code, &infd); | |
369 if (ferror (stdin) || feof (stdin)) | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
370 fatal_error ("server: error reading from standard input\n"); |
204 | 371 |
372 /* Transfer text from Emacs to the client, up to a newline. */ | |
373 infile = openfiles[infd]; | |
15591
deab323dd651
(main) [HAVE_SOCKETS]: Call rewind before writing to infile.
Miles Bader <miles@gnu.org>
parents:
14186
diff
changeset
|
374 rewind (infile); |
204 | 375 while (1) |
376 { | |
377 if (fgets (string, BUFSIZ, stdin) == 0) | |
378 break; | |
379 fprintf (infile, "%s", string); | |
380 if (string[strlen (string) - 1] == '\n') | |
381 break; | |
382 } | |
383 fflush (infile); | |
384 | |
385 /* If command is close, close connection to client. */ | |
386 if (strncmp (code, "Close:", 6) == 0) | |
387 if (infd > 2) | |
388 { | |
389 fclose (infile); | |
390 close (infd); | |
391 } | |
392 continue; | |
393 } | |
394 } | |
395 } | |
396 | |
397 #else /* This is the SYSV IPC section */ | |
398 | |
399 #include <sys/types.h> | |
400 #include <sys/ipc.h> | |
401 #include <sys/msg.h> | |
402 #include <setjmp.h> | |
9593
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
403 #include <errno.h> |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
404 #include <sys/utsname.h> |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
405 |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
406 struct utsname system_name; |
9593
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
407 |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
408 #ifndef errno |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
409 extern int errno; |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
410 #endif |
204 | 411 |
412 jmp_buf msgenv; | |
413 | |
620 | 414 SIGTYPE |
204 | 415 msgcatch () |
416 { | |
417 longjmp (msgenv, 1); | |
418 } | |
419 | |
420 | |
421 /* "THIS has to be fixed. Remember, stderr may not exist...-rlk." | |
422 Incorrect. This program runs as an inferior of Emacs. | |
423 Its stderr always exists--rms. */ | |
424 #include <stdio.h> | |
425 | |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
426 int |
204 | 427 main () |
428 { | |
8482
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
429 int s, infd, fromlen, ioproc; |
204 | 430 key_t key; |
431 struct msgbuf * msgp = | |
432 (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ); | |
433 struct msqid_ds msg_st; | |
434 int p; | |
435 char *homedir, *getenv (); | |
436 char string[BUFSIZ]; | |
437 FILE *infile; | |
438 | |
439 /* | |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
440 * Create a message queue using ~/.emacs-server as the path for ftok |
204 | 441 */ |
442 if ((homedir = getenv ("HOME")) == NULL) | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
443 fatal_error ("No home directory\n"); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
444 |
204 | 445 strcpy (string, homedir); |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
446 #ifndef HAVE_LONG_FILE_NAMES |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
447 /* If file names are short, we can't fit the host name. */ |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
448 strcat (string, "/.emacs-server"); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
449 #else |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
450 strcat (string, "/.emacs-server-"); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
451 uname (&system_name); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
452 strcat (string, system_name.nodename); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
453 #endif |
204 | 454 creat (string, 0600); |
455 key = ftok (string, 1); /* unlikely to be anyone else using it */ | |
456 s = msgget (key, 0600 | IPC_CREAT); | |
457 if (s == -1) | |
458 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
459 perror_1 ("msgget"); |
204 | 460 exit (1); |
461 } | |
462 | |
463 /* Fork so we can close connection even if parent dies */ | |
464 p = fork (); | |
465 if (setjmp (msgenv)) | |
466 { | |
467 msgctl (s, IPC_RMID, 0); | |
9593
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
468 if (p > 0) |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
469 kill (p, SIGKILL); |
204 | 470 exit (0); |
471 } | |
472 signal (SIGTERM, msgcatch); | |
473 signal (SIGINT, msgcatch); | |
9593
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
474 signal (SIGHUP, msgcatch); |
5856
16e98db8cc1b
(main) [HAVE_SYSVIPC]: Reverse test of fork value.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
475 if (p > 0) |
204 | 476 { |
5856
16e98db8cc1b
(main) [HAVE_SYSVIPC]: Reverse test of fork value.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
477 /* This is executed in the original process that did the fork above. */ |
16e98db8cc1b
(main) [HAVE_SYSVIPC]: Reverse test of fork value.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
478 /* Get pid of Emacs itself. */ |
204 | 479 p = getppid (); |
480 setpgrp (); /* Gnu kills process group on exit */ | |
481 while (1) | |
482 { | |
5856
16e98db8cc1b
(main) [HAVE_SYSVIPC]: Reverse test of fork value.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
483 /* Is Emacs still alive? */ |
204 | 484 if (kill (p, 0) < 0) |
485 { | |
486 msgctl (s, IPC_RMID, 0); | |
487 exit (0); | |
488 } | |
489 sleep (10); | |
490 } | |
491 } | |
492 | |
8482
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
493 /* This is executed in the child made by forking above. |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
494 Call it c1. Make another process, ioproc. */ |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
495 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
496 ioproc = fork (); |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
497 if (ioproc == 0) |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
498 { |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
499 /* In process ioproc, wait for text from Emacs, |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
500 and send it to the process c1. |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
501 This way, c1 only has to wait for one source of input. */ |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
502 while (fgets (msgp->mtext, BUFSIZ, stdin)) |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
503 { |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
504 msgp->mtype = 1; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
505 msgsnd (s, msgp, strlen (msgp->mtext) + 1, 0); |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
506 } |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
507 exit (1); |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
508 } |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
509 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
510 /* In the process c1, |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
511 listen for messages from clients and pass them to Emacs. */ |
204 | 512 while (1) |
513 { | |
514 if ((fromlen = msgrcv (s, msgp, BUFSIZ - 1, 1, 0)) < 0) | |
515 { | |
9593
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
516 #ifdef EINTR |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
517 if (errno == EINTR) |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
518 continue; |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
519 #endif |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
520 perror_1 ("msgrcv"); |
470 | 521 exit (1); |
204 | 522 } |
523 else | |
524 { | |
525 msgctl (s, IPC_STAT, &msg_st); | |
8482
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
526 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
527 /* Distinguish whether the message came from a client, or from |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
528 ioproc. */ |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
529 if (msg_st.msg_lspid == ioproc) |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
530 { |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
531 char code[BUFSIZ]; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
532 int inproc; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
533 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
534 /* Message from ioproc: tell a client we are done. */ |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
535 msgp->mtext[strlen (msgp->mtext)-1] = 0; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
536 sscanf (msgp->mtext, "%s %d", code, &inproc); |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
537 msgp->mtype = inproc; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
538 msgsnd (s, msgp, strlen (msgp->mtext) + 1, 0); |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
539 continue; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
540 } |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
541 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
542 /* This is a request from a client: copy to stdout |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
543 so that Emacs will get it. Include msg_lspid |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
544 so server.el can tell us where to send the reply. */ |
204 | 545 strncpy (string, msgp->mtext, fromlen); |
546 string[fromlen] = 0; /* make sure */ | |
547 /* Newline is part of string.. */ | |
8482
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
548 printf ("Client: %d %s", msg_st.msg_lspid, string); |
204 | 549 fflush (stdout); |
550 } | |
551 } | |
552 } | |
553 | |
554 #endif /* HAVE_SYSVIPC */ | |
555 | |
556 #endif /* HAVE_SOCKETS or HAVE_SYSVIPC */ | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
557 |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
558 /* This is like perror but puts `Error: ' at the beginning. */ |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
559 |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
560 void |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
561 perror_1 (string) |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
562 char *string; |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
563 { |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
564 char *copy = (char *) malloc (strlen (string) + 8); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
565 if (copy == 0) |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
566 fatal_error ("Virtual memory exhausted"); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
567 |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
568 strcpy (copy, "Error: "); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
569 strcat (copy, string); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
570 perror (copy); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
571 } |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
572 |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
573 void |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
574 fatal_error (string) |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
575 char *string; |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
576 { |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
577 fprintf (stderr, "%s", "Error: "); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
578 fprintf (stderr, string); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
579 exit (1); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
580 } |