annotate lib-src/emacsserver.c @ 22758:dbd9ecc9dbac

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