aboutsummaryrefslogtreecommitdiffstats
path: root/lib-src/emacsserver.c
diff options
context:
space:
mode:
authorRichard M. Stallman1996-09-02 05:39:36 +0000
committerRichard M. Stallman1996-09-02 05:39:36 +0000
commitd8888efa0fa0e65cd1b1978002551a24a2b6282e (patch)
treeb13d6bb0a01b2098f3dd476a616506abbf29d0eb /lib-src/emacsserver.c
parent2bf32c5d8ac9dab03029c6f2ed7054838f6a561e (diff)
downloademacs-d8888efa0fa0e65cd1b1978002551a24a2b6282e.tar.gz
emacs-d8888efa0fa0e65cd1b1978002551a24a2b6282e.zip
On fatal signal, delete socket-file:
Include signal.h. (xmalloc, fatal, error): New functions. (delete_socket, handle_signals): New functions. (progname, socket_name): New variables. [HAVE_SOCKETS] (main): Call handle_signals; set the new variables.
Diffstat (limited to 'lib-src/emacsserver.c')
-rw-r--r--lib-src/emacsserver.c131
1 files changed, 130 insertions, 1 deletions
diff --git a/lib-src/emacsserver.c b/lib-src/emacsserver.c
index e4ebd7d8be6..64b288cb496 100644
--- a/lib-src/emacsserver.c
+++ b/lib-src/emacsserver.c
@@ -26,6 +26,7 @@ Boston, MA 02111-1307, USA. */
26 up to the Emacs which then executes them. */ 26 up to the Emacs which then executes them. */
27 27
28#define NO_SHORTNAMES 28#define NO_SHORTNAMES
29#include <signal.h>
29#include <../src/config.h> 30#include <../src/config.h>
30#undef read 31#undef read
31#undef write 32#undef write
@@ -81,8 +82,128 @@ extern int errno;
81#define FD_ZERO(p) (*(p) = 0) 82#define FD_ZERO(p) (*(p) = 0)
82#endif /* no FD_SET */ 83#endif /* no FD_SET */
83 84
85/* This is the file name of the socket that we made. */
86
87char *socket_name;
88
89/* Name of this program. */
90
91char *progname;
92
93/* Handle fatal signals. */
94
95/* This is the handler. */
96
97SIGTYPE
98delete_socket (sig)
99 int sig;
100{
101 signal (sig, SIG_DFL);
102 unlink (socket_name);
103 kill (getpid (), sig);
104}
105
106/* Set up to handle all the signals. */
107
108handle_signals ()
109{
110 signal (SIGHUP, delete_socket);
111 signal (SIGINT, delete_socket);
112 signal (SIGQUIT, delete_socket);
113 signal (SIGILL, delete_socket);
114 signal (SIGTRAP, delete_socket);
115#ifdef SIGABRT
116 signal (SIGABRT, delete_socket);
117#endif
118#ifdef SIGHWE
119 signal (SIGHWE, delete_socket);
120#endif
121#ifdef SIGPRE
122 signal (SIGPRE, delete_socket);
123#endif
124#ifdef SIGORE
125 signal (SIGORE, delete_socket);
126#endif
127#ifdef SIGUME
128 signal (SIGUME, delete_socket);
129#endif
130#ifdef SIGDLK
131 signal (SIGDLK, delete_socket);
132#endif
133#ifdef SIGCPULIM
134 signal (SIGCPULIM, delete_socket);
135#endif
136#ifdef SIGIOT
137 /* This is missing on some systems - OS/2, for example. */
138 signal (SIGIOT, delete_socket);
139#endif
140#ifdef SIGEMT
141 signal (SIGEMT, delete_socket);
142#endif
143 signal (SIGFPE, delete_socket);
144#ifdef SIGBUS
145 signal (SIGBUS, delete_socket);
146#endif
147 signal (SIGSEGV, delete_socket);
148#ifdef SIGSYS
149 signal (SIGSYS, delete_socket);
150#endif
151 signal (SIGTERM, delete_socket);
152#ifdef SIGXCPU
153 signal (SIGXCPU, delete_socket);
154#endif
155#ifdef SIGXFSZ
156 signal (SIGXFSZ, delete_socket);
157#endif /* SIGXFSZ */
158
159#ifdef AIX
160/* 20 is SIGCHLD, 21 is SIGTTIN, 22 is SIGTTOU. */
161 signal (SIGXCPU, delete_socket);
162#ifndef _I386
163 signal (SIGIOINT, delete_socket);
164#endif
165 signal (SIGGRANT, delete_socket);
166 signal (SIGRETRACT, delete_socket);
167 signal (SIGSOUND, delete_socket);
168 signal (SIGMSG, delete_socket);
169#endif /* AIX */
170}
171
172/* Print error message. `s1' is printf control string, `s2' is arg for it. */
173void
174error (s1, s2)
175 char *s1, *s2;
176{
177 fprintf (stderr, "%s: ", progname);
178 fprintf (stderr, s1, s2);
179 fprintf (stderr, "\n");
180}
181
182/* Print error message and exit. */
183void
184fatal (s1, s2)
185 char *s1, *s2;
186{
187 error (s1, s2);
188 exit (1);
189}
190
191/* Like malloc but get fatal error if memory is exhausted. */
192
193long *
194xmalloc (size)
195 unsigned int size;
196{
197 long *result = (long *) malloc (size);
198 if (result == NULL)
199 fatal ("virtual memory exhausted", 0);
200 return result;
201}
202
84int 203int
85main () 204main (argc, argv)
205 int argc;
206 char **argv;
86{ 207{
87 char system_name[32]; 208 char system_name[32];
88 int s, infd, fromlen; 209 int s, infd, fromlen;
@@ -98,6 +219,8 @@ main ()
98 char *getenv (); 219 char *getenv ();
99#endif 220#endif
100 221
222 progname = argv[0];
223
101 openfiles_size = 20; 224 openfiles_size = 20;
102 openfiles = (FILE **) malloc (openfiles_size * sizeof (FILE *)); 225 openfiles = (FILE **) malloc (openfiles_size * sizeof (FILE *));
103 if (openfiles == 0) 226 if (openfiles == 0)
@@ -134,6 +257,12 @@ main ()
134 unlink (server.sun_path); 257 unlink (server.sun_path);
135#endif 258#endif
136 259
260 /* Save the socket name so we can delete it. */
261 socket_name = (char *) xmalloc (strlen (server.sun_path) + 1);
262 strcpy (socket_name, server.sun_path);
263
264 handle_signals ();
265
137 if (bind (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2) < 0) 266 if (bind (s, (struct sockaddr *) &server, strlen (server.sun_path) + 2) < 0)
138 { 267 {
139 perror_1 ("bind"); 268 perror_1 ("bind");