Mercurial > emacs
annotate lib-src/emacsserver.c @ 29473:80835e075d87
(display_line): Set row's and iterator's
starts_in_middle_of_char_p and ends_in_middle_of_char_p flags.
Set cursor even if row ends in the middle of a character.
(dump_glyph_row): Print values of new flags.
(redisplay_window) <cursor movement in unchanged window>: When
point has been moved forward, and PT is at the end of the cursor
row, don't place the cursor in the next row if the cursor row ends
in the middle of a character or at ZV.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Tue, 06 Jun 2000 20:02:39 +0000 |
parents | 134b57acef68 |
children | a3e7758ab661 |
rev | line source |
---|---|
204 | 1 /* Communication subprocess for GNU Emacs acting as server. |
26083
134b57acef68
Add support for large files. Merge glibc 2.1.2.
Paul Eggert <eggert@twinsun.com>
parents:
25448
diff
changeset
|
2 Copyright (C) 1986, 1987, 1992, 1994, 1999 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 | |
26083
134b57acef68
Add support for large files. Merge glibc 2.1.2.
Paul Eggert <eggert@twinsun.com>
parents:
25448
diff
changeset
|
29 #include <../src/config.h> |
16449 | 30 #include <signal.h> |
3393 | 31 #undef signal |
204 | 32 |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
33 #if !defined (HAVE_SOCKETS) && !defined (HAVE_SYSVIPC) |
204 | 34 #include <stdio.h> |
35 | |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
36 int |
204 | 37 main () |
38 { | |
39 fprintf (stderr, "Sorry, the Emacs server is supported only on systems\n"); | |
40 fprintf (stderr, "with Berkeley sockets or System V IPC.\n"); | |
41 exit (1); | |
42 } | |
43 | |
44 #else /* HAVE_SOCKETS or HAVE_SYSVIPC */ | |
45 | |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
46 void perror_1 (); |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
47 void fatal_error (); |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
48 |
11368
91abe61bb495
Test NO_SOCKETS_IN_FILE_SYSTEM.
Richard M. Stallman <rms@gnu.org>
parents:
11031
diff
changeset
|
49 #if defined (HAVE_SOCKETS) && ! defined (NO_SOCKETS_IN_FILE_SYSTEM) |
204 | 50 /* BSD code is very different from SYSV IPC code */ |
51 | |
4178
57e52e312188
Include types.h before file.h.
Richard M. Stallman <rms@gnu.org>
parents:
3594
diff
changeset
|
52 #include <sys/types.h> |
204 | 53 #include <sys/file.h> |
54 #include <sys/socket.h> | |
55 #include <sys/un.h> | |
56 #include <stdio.h> | |
57 #include <errno.h> | |
13925
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
58 #include <sys/stat.h> |
204 | 59 |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
60 #ifdef HAVE_UNISTD_H |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
61 #include <unistd.h> |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
62 #endif |
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
63 |
25448
95f7147cb572
Include <stdlib.h> if available. Don't declare errno if it's a macro.
Andreas Schwab <schwab@suse.de>
parents:
25261
diff
changeset
|
64 #ifndef errno |
204 | 65 extern int errno; |
25448
95f7147cb572
Include <stdlib.h> if available. Don't declare errno if it's a macro.
Andreas Schwab <schwab@suse.de>
parents:
25261
diff
changeset
|
66 #endif |
204 | 67 |
8811
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
68 /* 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
|
69 #ifdef FD_SET |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
70 /* 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
|
71 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
|
72 file. */ |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
73 #ifdef FD_SETSIZE |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
74 #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
|
75 #else |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
76 #define MAXDESC 64 |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
77 #endif |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
78 #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
|
79 #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
|
80 #define MAXDESC 32 |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
81 #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
|
82 |
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
83 /* 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
|
84 #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
|
85 #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
|
86 #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
|
87 #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
|
88 #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
|
89 |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
90 /* 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
|
91 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
92 char *socket_name; |
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 /* Name of this program. */ |
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 char *progname; |
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 /* Handle fatal signals. */ |
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 /* This is the handler. */ |
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 SIGTYPE |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
103 delete_socket (sig) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
104 int sig; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
105 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
106 signal (sig, SIG_DFL); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
107 unlink (socket_name); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
108 kill (getpid (), sig); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
109 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
110 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
111 /* Set up to handle all the signals. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
112 |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
113 void |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
114 handle_signals () |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
115 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
116 signal (SIGHUP, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
117 signal (SIGINT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
118 signal (SIGQUIT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
119 signal (SIGILL, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
120 signal (SIGTRAP, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
121 #ifdef SIGABRT |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
122 signal (SIGABRT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
123 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
124 #ifdef SIGHWE |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
125 signal (SIGHWE, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
126 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
127 #ifdef SIGPRE |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
128 signal (SIGPRE, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
129 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
130 #ifdef SIGORE |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
131 signal (SIGORE, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
132 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
133 #ifdef SIGUME |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
134 signal (SIGUME, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
135 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
136 #ifdef SIGDLK |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
137 signal (SIGDLK, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
138 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
139 #ifdef SIGCPULIM |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
140 signal (SIGCPULIM, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
141 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
142 #ifdef SIGIOT |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
143 /* 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
|
144 signal (SIGIOT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
145 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
146 #ifdef SIGEMT |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
147 signal (SIGEMT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
148 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
149 signal (SIGFPE, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
150 #ifdef SIGBUS |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
151 signal (SIGBUS, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
152 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
153 signal (SIGSEGV, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
154 #ifdef SIGSYS |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
155 signal (SIGSYS, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
156 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
157 signal (SIGTERM, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
158 #ifdef SIGXCPU |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
159 signal (SIGXCPU, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
160 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
161 #ifdef SIGXFSZ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
162 signal (SIGXFSZ, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
163 #endif /* SIGXFSZ */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
164 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
165 #ifdef AIX |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
166 /* 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
|
167 signal (SIGXCPU, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
168 #ifndef _I386 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
169 signal (SIGIOINT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
170 #endif |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
171 signal (SIGGRANT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
172 signal (SIGRETRACT, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
173 signal (SIGSOUND, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
174 signal (SIGMSG, delete_socket); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
175 #endif /* AIX */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
176 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
177 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
178 /* 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
|
179 void |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
180 error (s1, s2) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
181 char *s1, *s2; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
182 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
183 fprintf (stderr, "%s: ", progname); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
184 fprintf (stderr, s1, s2); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
185 fprintf (stderr, "\n"); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
186 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
187 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
188 /* Print error message and exit. */ |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
189 void |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
190 fatal (s1, s2) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
191 char *s1, *s2; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
192 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
193 error (s1, s2); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
194 exit (1); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
195 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
196 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
197 /* 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
|
198 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
199 long * |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
200 xmalloc (size) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
201 unsigned int size; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
202 { |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
203 long *result = (long *) malloc (size); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
204 if (result == NULL) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
205 fatal ("virtual memory exhausted", 0); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
206 return result; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
207 } |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
208 |
15682
9f7228c75a4b
[__GNU_LIBRARY__]: Use size_t for fromlen.
Karl Heuer <kwzh@gnu.org>
parents:
15591
diff
changeset
|
209 int |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
210 main (argc, argv) |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
211 int argc; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
212 char **argv; |
204 | 213 { |
24083
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
214 char *system_name; |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
215 int system_name_length; |
16137
dc1387f877d4
(main): Declare `fromlen' as size_t, undo previous change.
Erik Naggum <erik@naggum.no>
parents:
16122
diff
changeset
|
216 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
|
217 #ifdef SOCKLEN_TYPE |
1151154e9ba4
(main): use SOCKLEN_TYPE for fromlen, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents:
16449
diff
changeset
|
218 SOCKLEN_TYPE fromlen; |
1151154e9ba4
(main): use SOCKLEN_TYPE for fromlen, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents:
16449
diff
changeset
|
219 #else |
16137
dc1387f877d4
(main): Declare `fromlen' as size_t, undo previous change.
Erik Naggum <erik@naggum.no>
parents:
16122
diff
changeset
|
220 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
|
221 #endif |
16137
dc1387f877d4
(main): Declare `fromlen' as size_t, undo previous change.
Erik Naggum <erik@naggum.no>
parents:
16122
diff
changeset
|
222 struct sockaddr_un server, fromunix; |
204 | 223 char *homedir; |
224 char *str, string[BUFSIZ], code[BUFSIZ]; | |
225 FILE *infile; | |
226 FILE **openfiles; | |
227 int openfiles_size; | |
13925
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
228 struct stat statbuf; |
204 | 229 |
8025
f25cb844c3dd
(main): Don't declare geteuid.
Richard M. Stallman <rms@gnu.org>
parents:
5856
diff
changeset
|
230 #ifndef convex |
204 | 231 char *getenv (); |
8025
f25cb844c3dd
(main): Don't declare geteuid.
Richard M. Stallman <rms@gnu.org>
parents:
5856
diff
changeset
|
232 #endif |
204 | 233 |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
234 progname = argv[0]; |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
235 |
204 | 236 openfiles_size = 20; |
237 openfiles = (FILE **) malloc (openfiles_size * sizeof (FILE *)); | |
238 if (openfiles == 0) | |
239 abort (); | |
240 | |
241 /* | |
242 * Open up an AF_UNIX socket in this person's home directory | |
243 */ | |
244 | |
245 if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) | |
246 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
247 perror_1 ("socket"); |
204 | 248 exit (1); |
249 } | |
250 server.sun_family = AF_UNIX; | |
25261
89be69860eeb
(main): Move the dynamic allocation of
Karl Heuer <kwzh@gnu.org>
parents:
24382
diff
changeset
|
251 |
24083
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
252 system_name_length = 32; |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
253 while (1) |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
254 { |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
255 system_name = (char *) xmalloc (system_name_length + 1); |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
256 |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
257 /* system_name must be null-terminated string. */ |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
258 system_name[system_name_length] = '\0'; |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
259 |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
260 if (gethostname (system_name, system_name_length) == 0) |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
261 break; |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
262 |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
263 free (system_name); |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
264 system_name_length *= 2; |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
265 } |
33b162fe4507
(main): Eliminate arbitrary limit on
Richard M. Stallman <rms@gnu.org>
parents:
23413
diff
changeset
|
266 |
25261
89be69860eeb
(main): Move the dynamic allocation of
Karl Heuer <kwzh@gnu.org>
parents:
24382
diff
changeset
|
267 #ifndef SERVER_HOME_DIR |
470 | 268 sprintf (server.sun_path, "/tmp/esrv%d-%s", geteuid (), system_name); |
269 | |
270 if (unlink (server.sun_path) == -1 && errno != ENOENT) | |
271 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
272 perror_1 ("unlink"); |
470 | 273 exit (1); |
274 } | |
275 #else | |
276 if ((homedir = getenv ("HOME")) == NULL) | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
277 fatal_error ("No home directory\n"); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
278 |
204 | 279 strcpy (server.sun_path, homedir); |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
280 strcat (server.sun_path, "/.emacs-server-"); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
281 strcat (server.sun_path, system_name); |
470 | 282 /* Delete anyone else's old server. */ |
283 unlink (server.sun_path); | |
204 | 284 #endif |
285 | |
16070
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
286 /* 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
|
287 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
|
288 strcpy (socket_name, server.sun_path); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
289 |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
290 handle_signals (); |
5aa311b84644
On fatal signal, delete socket-file:
Richard M. Stallman <rms@gnu.org>
parents:
15719
diff
changeset
|
291 |
3594
aacca1901f73
* emacsserver.c (main): When we're passing a `struct sockaddr_un'
Jim Blandy <jimb@redhat.com>
parents:
3393
diff
changeset
|
292 if (bind (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2) < 0) |
204 | 293 { |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
294 perror_1 ("bind"); |
204 | 295 exit (1); |
296 } | |
297 /* 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
|
298 if (stat (server.sun_path, &statbuf) < 0) |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
299 { |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
300 perror_1 ("bind"); |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
301 exit (1); |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
302 } |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
303 |
5baf69817438
(main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents:
12415
diff
changeset
|
304 chmod (server.sun_path, statbuf.st_mode & 0600); |
204 | 305 /* |
306 * Now, just wait for everything to come in.. | |
307 */ | |
308 if (listen (s, 5) < 0) | |
309 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
310 perror_1 ("listen"); |
204 | 311 exit (1); |
312 } | |
313 | |
314 /* Disable sigpipes in case luser kills client... */ | |
315 signal (SIGPIPE, SIG_IGN); | |
316 for (;;) | |
317 { | |
8811
7cd89ebbe641
(FD_*) [HAVE_SOCKETS & !HAVE_SYSVIPC]: If not already defined, use simple
Karl Heuer <kwzh@gnu.org>
parents:
8482
diff
changeset
|
318 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
|
319 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
|
320 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
|
321 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
|
322 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
|
323 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
|
324 if (FD_ISSET (s, &rmask)) /* client sends list of filenames */ |
204 | 325 { |
326 fromlen = sizeof (fromunix); | |
327 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
|
328 infd = accept (s, (struct sockaddr *) &fromunix, &fromlen); |
204 | 329 if (infd < 0) |
330 { | |
331 if (errno == EMFILE || errno == ENFILE) | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
332 fprintf (stderr, "Error: too many clients.\n"); |
204 | 333 else |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
334 perror_1 ("accept"); |
204 | 335 continue; |
336 } | |
337 | |
338 if (infd >= openfiles_size) | |
339 { | |
340 openfiles_size *= 2; | |
341 openfiles = (FILE **) realloc (openfiles, | |
342 openfiles_size * sizeof (FILE *)); | |
343 if (openfiles == 0) | |
344 abort (); | |
345 } | |
346 | |
347 infile = fdopen (infd, "r+"); /* open stream */ | |
348 if (infile == NULL) | |
349 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
350 fprintf (stderr, "Error: too many clients.\n"); |
204 | 351 write (infd, "Too many clients.\n", 18); |
352 close (infd); /* Prevent descriptor leak.. */ | |
353 continue; | |
354 } | |
355 str = fgets (string, BUFSIZ, infile); | |
356 if (str == NULL) | |
357 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
358 perror_1 ("fgets"); |
204 | 359 close (infd); /* Prevent descriptor leak.. */ |
360 continue; | |
361 } | |
362 openfiles[infd] = infile; | |
363 printf ("Client: %d %s", infd, string); | |
364 /* If what we read did not end in a newline, | |
365 it means there is more. Keep reading from the socket | |
366 and outputting to Emacs, until we get the newline. */ | |
367 while (string[strlen (string) - 1] != '\n') | |
368 { | |
369 if (fgets (string, BUFSIZ, infile) == 0) | |
370 break; | |
371 printf ("%s", string); | |
372 } | |
373 fflush (stdout); | |
374 fflush (infile); | |
375 continue; | |
376 } | |
9418
5d8165cdb0d8
[! SYSVIPC] (main): Fix uses of FD_* macros: fd_set arg is a pointer,
Roland McGrath <roland@gnu.org>
parents:
8811
diff
changeset
|
377 else if (FD_ISSET (0, &rmask)) /* emacs sends codeword, fd, and string message */ |
204 | 378 { |
379 /* Read command codeword and fd */ | |
380 clearerr (stdin); | |
381 scanf ("%s %d%*c", code, &infd); | |
382 if (ferror (stdin) || feof (stdin)) | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
383 fatal_error ("server: error reading from standard input\n"); |
204 | 384 |
385 /* Transfer text from Emacs to the client, up to a newline. */ | |
386 infile = openfiles[infd]; | |
15591
deab323dd651
(main) [HAVE_SOCKETS]: Call rewind before writing to infile.
Miles Bader <miles@gnu.org>
parents:
14186
diff
changeset
|
387 rewind (infile); |
204 | 388 while (1) |
389 { | |
390 if (fgets (string, BUFSIZ, stdin) == 0) | |
391 break; | |
392 fprintf (infile, "%s", string); | |
393 if (string[strlen (string) - 1] == '\n') | |
394 break; | |
395 } | |
396 fflush (infile); | |
397 | |
398 /* If command is close, close connection to client. */ | |
399 if (strncmp (code, "Close:", 6) == 0) | |
400 if (infd > 2) | |
401 { | |
402 fclose (infile); | |
403 close (infd); | |
404 } | |
405 continue; | |
406 } | |
407 } | |
408 } | |
409 | |
410 #else /* This is the SYSV IPC section */ | |
411 | |
412 #include <sys/types.h> | |
413 #include <sys/ipc.h> | |
414 #include <sys/msg.h> | |
415 #include <setjmp.h> | |
9593
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
416 #include <errno.h> |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
417 #include <sys/utsname.h> |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
418 |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
419 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
|
420 |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
421 #ifndef errno |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
422 extern int errno; |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
423 #endif |
204 | 424 |
425 jmp_buf msgenv; | |
426 | |
620 | 427 SIGTYPE |
204 | 428 msgcatch () |
429 { | |
430 longjmp (msgenv, 1); | |
431 } | |
432 | |
433 | |
434 /* "THIS has to be fixed. Remember, stderr may not exist...-rlk." | |
435 Incorrect. This program runs as an inferior of Emacs. | |
436 Its stderr always exists--rms. */ | |
437 #include <stdio.h> | |
438 | |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
439 int |
204 | 440 main () |
441 { | |
8482
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
442 int s, infd, fromlen, ioproc; |
204 | 443 key_t key; |
444 struct msgbuf * msgp = | |
445 (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ); | |
446 struct msqid_ds msg_st; | |
447 int p; | |
448 char *homedir, *getenv (); | |
449 char string[BUFSIZ]; | |
450 FILE *infile; | |
451 | |
452 /* | |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
453 * Create a message queue using ~/.emacs-server as the path for ftok |
204 | 454 */ |
455 if ((homedir = getenv ("HOME")) == NULL) | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
456 fatal_error ("No home directory\n"); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
457 |
204 | 458 strcpy (string, homedir); |
10123
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
459 #ifndef HAVE_LONG_FILE_NAMES |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
460 /* 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
|
461 strcat (string, "/.emacs-server"); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
462 #else |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
463 strcat (string, "/.emacs-server-"); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
464 uname (&system_name); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
465 strcat (string, system_name.nodename); |
bb3d25f73eaf
[HAVE_SYSVIPC]: Include sys/utsname.h.
Richard M. Stallman <rms@gnu.org>
parents:
9593
diff
changeset
|
466 #endif |
204 | 467 creat (string, 0600); |
468 key = ftok (string, 1); /* unlikely to be anyone else using it */ | |
469 s = msgget (key, 0600 | IPC_CREAT); | |
470 if (s == -1) | |
471 { | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
472 perror_1 ("msgget"); |
204 | 473 exit (1); |
474 } | |
475 | |
476 /* Fork so we can close connection even if parent dies */ | |
477 p = fork (); | |
478 if (setjmp (msgenv)) | |
479 { | |
480 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
|
481 if (p > 0) |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
482 kill (p, SIGKILL); |
204 | 483 exit (0); |
484 } | |
485 signal (SIGTERM, msgcatch); | |
486 signal (SIGINT, msgcatch); | |
9593
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
487 signal (SIGHUP, msgcatch); |
5856
16e98db8cc1b
(main) [HAVE_SYSVIPC]: Reverse test of fork value.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
488 if (p > 0) |
204 | 489 { |
5856
16e98db8cc1b
(main) [HAVE_SYSVIPC]: Reverse test of fork value.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
490 /* 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
|
491 /* Get pid of Emacs itself. */ |
204 | 492 p = getppid (); |
493 setpgrp (); /* Gnu kills process group on exit */ | |
494 while (1) | |
495 { | |
5856
16e98db8cc1b
(main) [HAVE_SYSVIPC]: Reverse test of fork value.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
496 /* Is Emacs still alive? */ |
204 | 497 if (kill (p, 0) < 0) |
498 { | |
499 msgctl (s, IPC_RMID, 0); | |
500 exit (0); | |
501 } | |
502 sleep (10); | |
503 } | |
504 } | |
505 | |
8482
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
506 /* 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
|
507 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
|
508 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
509 ioproc = fork (); |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
510 if (ioproc == 0) |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
511 { |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
512 /* 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
|
513 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
|
514 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
|
515 while (fgets (msgp->mtext, BUFSIZ, stdin)) |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
516 { |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
517 msgp->mtype = 1; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
518 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
|
519 } |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
520 exit (1); |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
521 } |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
522 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
523 /* In the process c1, |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
524 listen for messages from clients and pass them to Emacs. */ |
204 | 525 while (1) |
526 { | |
527 if ((fromlen = msgrcv (s, msgp, BUFSIZ - 1, 1, 0)) < 0) | |
528 { | |
9593
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
529 #ifdef EINTR |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
530 if (errno == EINTR) |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
531 continue; |
68882a46b5fc
[SYSV_IPC] (main): Catch SIGHUP as well. Don't
Richard M. Stallman <rms@gnu.org>
parents:
9418
diff
changeset
|
532 #endif |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
533 perror_1 ("msgrcv"); |
470 | 534 exit (1); |
204 | 535 } |
536 else | |
537 { | |
538 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
|
539 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
540 /* 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
|
541 ioproc. */ |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
542 if (msg_st.msg_lspid == ioproc) |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
543 { |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
544 char code[BUFSIZ]; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
545 int inproc; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
546 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
547 /* 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
|
548 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
|
549 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
|
550 msgp->mtype = inproc; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
551 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
|
552 continue; |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
553 } |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
554 |
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
555 /* 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
|
556 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
|
557 so server.el can tell us where to send the reply. */ |
204 | 558 strncpy (string, msgp->mtext, fromlen); |
559 string[fromlen] = 0; /* make sure */ | |
560 /* Newline is part of string.. */ | |
8482
ffbf38ae06d1
[SYSV_IPC] (main): Make a separate process
Richard M. Stallman <rms@gnu.org>
parents:
8410
diff
changeset
|
561 printf ("Client: %d %s", msg_st.msg_lspid, string); |
204 | 562 fflush (stdout); |
563 } | |
564 } | |
565 } | |
566 | |
567 #endif /* HAVE_SYSVIPC */ | |
568 | |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
569 |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
570 /* 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
|
571 |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
572 void |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
573 perror_1 (string) |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
574 char *string; |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
575 { |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
576 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
|
577 if (copy == 0) |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
578 fatal_error ("Virtual memory exhausted"); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
579 |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
580 strcpy (copy, "Error: "); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
581 strcat (copy, string); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
582 perror (copy); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
583 } |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
584 |
21388
1a8c44e38d9c
Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents:
19344
diff
changeset
|
585 void |
12415
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
586 fatal_error (string) |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
587 char *string; |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
588 { |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
589 fprintf (stderr, "%s", "Error: "); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
590 fprintf (stderr, string); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
591 exit (1); |
c07a5e8f40ae
Make all error messages start with `Error: '.
Richard M. Stallman <rms@gnu.org>
parents:
11368
diff
changeset
|
592 } |
24382
740c8322ca39
(perror_1, fatal_error): Don't compile unless needed.
Karl Heuer <kwzh@gnu.org>
parents:
24083
diff
changeset
|
593 #endif /* HAVE_SOCKETS or HAVE_SYSVIPC */ |