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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 /* Communication subprocess for GNU Emacs acting as server.
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
3
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
5
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
620
88a29c720fa7 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 470
diff changeset
8 the Free Software Foundation; either version 2, or (at your option)
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9 any later version.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
15
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 /* The GNU Emacs edit server process is run as a subprocess of Emacs
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 under control of the file lisp/server.el.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
24 This program accepts communication from client (program emacsclient.c)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
25 and passes their commands (consisting of keyboard characters)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26 up to the Emacs which then executes them. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
31ffc80a329d Fix 1996-09-02 change.
Karl Heuer <kwzh@gnu.org>
parents: 16137
diff changeset
30 #include <signal.h>
3393
5ee985ad8340 #undef signal.
Richard M. Stallman <rms@gnu.org>
parents: 620
diff changeset
31 #undef signal
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
34 #include <stdio.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
35
21388
1a8c44e38d9c Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents: 19344
diff changeset
36 int
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
37 main ()
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
38 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
39 fprintf (stderr, "Sorry, the Emacs server is supported only on systems\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
40 fprintf (stderr, "with Berkeley sockets or System V IPC.\n");
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
41 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
42 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 #else /* HAVE_SOCKETS or HAVE_SYSVIPC */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 /* BSD code is very different from SYSV IPC code */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
53 #include <sys/file.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
54 #include <sys/socket.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
55 #include <sys/un.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
56 #include <stdio.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
57 #include <errno.h>
13925
5baf69817438 (main): Do chmod based on existing permission.
Karl Heuer <kwzh@gnu.org>
parents: 12415
diff changeset
58 #include <sys/stat.h>
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 char *homedir;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 char *str, string[BUFSIZ], code[BUFSIZ];
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
225 FILE *infile;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
226 FILE **openfiles;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
229
8025
f25cb844c3dd (main): Don't declare geteuid.
Richard M. Stallman <rms@gnu.org>
parents: 5856
diff changeset
230 #ifndef convex
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
231 char *getenv ();
8025
f25cb844c3dd (main): Don't declare geteuid.
Richard M. Stallman <rms@gnu.org>
parents: 5856
diff changeset
232 #endif
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 openfiles_size = 20;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 openfiles = (FILE **) malloc (openfiles_size * sizeof (FILE *));
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 if (openfiles == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 abort ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 /*
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 * Open up an AF_UNIX socket in this person's home directory
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 if ((s = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
268 sprintf (server.sun_path, "/tmp/esrv%d-%s", geteuid (), system_name);
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
269
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
270 if (unlink (server.sun_path) == -1 && errno != ENOENT)
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
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
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
273 exit (1);
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
274 }
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
275 #else
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
282 /* Delete anyone else's old server. */
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
283 unlink (server.sun_path);
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 #endif
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 /* 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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
305 /*
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 * Now, just wait for everything to come in..
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
308 if (listen (s, 5) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 /* Disable sigpipes in case luser kills client... */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 signal (SIGPIPE, SIG_IGN);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 for (;;)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 fromlen = sizeof (fromunix);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 if (infd < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
335 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
336 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
338 if (infd >= openfiles_size)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 openfiles_size *= 2;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 openfiles = (FILE **) realloc (openfiles,
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 openfiles_size * sizeof (FILE *));
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 if (openfiles == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 abort ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 infile = fdopen (infd, "r+"); /* open stream */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 if (infile == NULL)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351 write (infd, "Too many clients.\n", 18);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 close (infd); /* Prevent descriptor leak.. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 str = fgets (string, BUFSIZ, infile);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 if (str == NULL)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 close (infd); /* Prevent descriptor leak.. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
361 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362 openfiles[infd] = infile;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 printf ("Client: %d %s", infd, string);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 /* If what we read did not end in a newline,
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 it means there is more. Keep reading from the socket
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 and outputting to Emacs, until we get the newline. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 while (string[strlen (string) - 1] != '\n')
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 if (fgets (string, BUFSIZ, infile) == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 break;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 printf ("%s", string);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 fflush (stdout);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 fflush (infile);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 /* Read command codeword and fd */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 clearerr (stdin);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 scanf ("%s %d%*c", code, &infd);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385 /* Transfer text from Emacs to the client, up to a newline. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 while (1)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 if (fgets (string, BUFSIZ, stdin) == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 break;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 fprintf (infile, "%s", string);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 if (string[strlen (string) - 1] == '\n')
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 break;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 fflush (infile);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 /* If command is close, close connection to client. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 if (strncmp (code, "Close:", 6) == 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 if (infd > 2)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 fclose (infile);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 close (infd);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 continue;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 #else /* This is the SYSV IPC section */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 #include <sys/types.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 #include <sys/ipc.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 #include <sys/msg.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 jmp_buf msgenv;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426
620
88a29c720fa7 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 470
diff changeset
427 SIGTYPE
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 msgcatch ()
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 longjmp (msgenv, 1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 /* "THIS has to be fixed. Remember, stderr may not exist...-rlk."
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 Incorrect. This program runs as an inferior of Emacs.
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 Its stderr always exists--rms. */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 #include <stdio.h>
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438
21388
1a8c44e38d9c Include <unistd.h> if available.
Andreas Schwab <schwab@suse.de>
parents: 19344
diff changeset
439 int
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 main ()
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 key_t key;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 struct msgbuf * msgp =
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 (struct msgbuf *) malloc (sizeof *msgp + BUFSIZ);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 struct msqid_ds msg_st;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 int p;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 char *homedir, *getenv ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449 char string[BUFSIZ];
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 FILE *infile;
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 creat (string, 0600);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 key = ftok (string, 1); /* unlikely to be anyone else using it */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 s = msgget (key, 0600 | IPC_CREAT);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470 if (s == -1)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 exit (1);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 /* Fork so we can close connection even if parent dies */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 p = fork ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 if (setjmp (msgenv))
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 exit (0);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 signal (SIGTERM, msgcatch);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
492 p = getppid ();
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
493 setpgrp (); /* Gnu kills process group on exit */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
494 while (1)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
497 if (kill (p, 0) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
498 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
499 msgctl (s, IPC_RMID, 0);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
500 exit (0);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
501 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
502 sleep (10);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
503 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
504 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 while (1)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 if ((fromlen = msgrcv (s, msgp, BUFSIZ - 1, 1, 0)) < 0)
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
db84d8d9a1d9 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 204
diff changeset
534 exit (1);
204
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 else
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 {
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 strncpy (string, msgp->mtext, fromlen);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 string[fromlen] = 0; /* make sure */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 fflush (stdout);
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 }
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 #endif /* HAVE_SYSVIPC */
00dde7fa9e98 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
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 */