Mercurial > emacs
annotate src/process.c @ 25427:dde5fcbfa2af
(Info-tagify): Don't insert more than one newline before the tag table.
(Info-tagify): Start by widening.
Match node headers that don't list the file name,
and more kinds of page separations.
Strip properties during tagification.
Use start of node header line as tag's position.
Fix the "done" message.
(Info-validate): Save and restore match data around narrowing down.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Sun, 29 Aug 1999 19:19:00 +0000 |
| parents | 5db69f7aadca |
| children | a14111a2a100 |
| rev | line source |
|---|---|
| 578 | 1 /* Asynchronous subprocess control for GNU Emacs. |
| 20708 | 2 Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 96, 1998 |
|
14405
4aa693528ee3
(create_process): Set outchannel to be non-blocking.
Richard M. Stallman <rms@gnu.org>
parents:
14404
diff
changeset
|
3 Free Software Foundation, Inc. |
| 578 | 4 |
| 5 This file is part of GNU Emacs. | |
| 6 | |
| 7 GNU Emacs is free software; you can redistribute it and/or modify | |
| 8 it under the terms of the GNU General Public License as published by | |
|
1780
d01c59bac5c1
* frame.h (FRAME_SAMPLE_VISIBILITY): Make sure frame is marked as
Jim Blandy <jimb@redhat.com>
parents:
1683
diff
changeset
|
9 the Free Software Foundation; either version 2, or (at your option) |
| 578 | 10 any later version. |
| 11 | |
| 12 GNU Emacs is distributed in the hope that it will be useful, | |
| 13 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 15 GNU General Public License for more details. | |
| 16 | |
| 17 You should have received a copy of the GNU General Public License | |
| 18 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:
14131
diff
changeset
|
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
|
ee40177f6c68
Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents:
14131
diff
changeset
|
20 Boston, MA 02111-1307, USA. */ |
| 578 | 21 |
| 22 | |
| 23 #include <signal.h> | |
| 24 | |
|
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4682
diff
changeset
|
25 #include <config.h> |
| 578 | 26 |
| 588 | 27 /* This file is split into two parts by the following preprocessor |
| 28 conditional. The 'then' clause contains all of the support for | |
| 29 asynchronous subprocesses. The 'else' clause contains stub | |
| 30 versions of some of the asynchronous subprocess routines that are | |
| 31 often called elsewhere in Emacs, so we don't have to #ifdef the | |
| 32 sections that call them. */ | |
| 33 | |
| 34 | |
| 578 | 35 #ifdef subprocesses |
| 36 | |
| 37 #include <stdio.h> | |
| 38 #include <errno.h> | |
| 39 #include <setjmp.h> | |
| 40 #include <sys/types.h> /* some typedefs are used in sys/file.h */ | |
| 41 #include <sys/file.h> | |
| 42 #include <sys/stat.h> | |
| 6158 | 43 #ifdef HAVE_UNISTD_H |
| 44 #include <unistd.h> | |
| 45 #endif | |
| 578 | 46 |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
47 #ifdef WINDOWSNT |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
48 #include <stdlib.h> |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
49 #include <fcntl.h> |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
50 #endif /* not WINDOWSNT */ |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
51 |
| 578 | 52 #ifdef HAVE_SOCKETS /* TCP connection support, if kernel can do it */ |
| 53 #include <sys/socket.h> | |
| 54 #include <netdb.h> | |
| 55 #include <netinet/in.h> | |
| 56 #include <arpa/inet.h> | |
|
12749
ce48ec025b0a
Maybe include net/errno.h.
Richard M. Stallman <rms@gnu.org>
parents:
12648
diff
changeset
|
57 #ifdef NEED_NET_ERRNO_H |
|
ce48ec025b0a
Maybe include net/errno.h.
Richard M. Stallman <rms@gnu.org>
parents:
12648
diff
changeset
|
58 #include <net/errno.h> |
|
ce48ec025b0a
Maybe include net/errno.h.
Richard M. Stallman <rms@gnu.org>
parents:
12648
diff
changeset
|
59 #endif /* NEED_NET_ERRNO_H */ |
| 578 | 60 #endif /* HAVE_SOCKETS */ |
| 61 | |
|
4914
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
62 /* TERM is a poor-man's SLIP, used on Linux. */ |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
63 #ifdef TERM |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
64 #include <client.h> |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
65 #endif |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
66 |
|
7238
c9598edda1a2
(IN_ADDR, NUMERIC_ADDR_ERROR): Made conditional on HAVE_BROKEN_INET_ADDR.
Paul Reilly <pmr@pajato.com>
parents:
7220
diff
changeset
|
67 /* On some systems, e.g. DGUX, inet_addr returns a 'struct in_addr'. */ |
|
c9598edda1a2
(IN_ADDR, NUMERIC_ADDR_ERROR): Made conditional on HAVE_BROKEN_INET_ADDR.
Paul Reilly <pmr@pajato.com>
parents:
7220
diff
changeset
|
68 #ifdef HAVE_BROKEN_INET_ADDR |
|
4998
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
69 #define IN_ADDR struct in_addr |
|
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
70 #define NUMERIC_ADDR_ERROR (numeric_addr.s_addr == -1) |
|
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
71 #else |
|
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
72 #define IN_ADDR unsigned long |
|
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
73 #define NUMERIC_ADDR_ERROR (numeric_addr == -1) |
|
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
74 #endif |
|
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
75 |
|
16220
02044b05d8e0
Replaced symbol BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
16206
diff
changeset
|
76 #if defined(BSD_SYSTEM) || defined(STRIDE) |
| 578 | 77 #include <sys/ioctl.h> |
|
1012
a48ed1d416dd
* process.c (process_send_signal): Don't send SIGTSTP if the
Jim Blandy <jimb@redhat.com>
parents:
849
diff
changeset
|
78 #if !defined (O_NDELAY) && defined (HAVE_PTYS) && !defined(USG5) |
| 578 | 79 #include <fcntl.h> |
| 80 #endif /* HAVE_PTYS and no O_NDELAY */ | |
|
16220
02044b05d8e0
Replaced symbol BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
16206
diff
changeset
|
81 #endif /* BSD_SYSTEM || STRIDE */ |
| 578 | 82 |
|
5240
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
83 #ifdef BROKEN_O_NONBLOCK |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
84 #undef O_NONBLOCK |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
85 #endif /* BROKEN_O_NONBLOCK */ |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
86 |
| 578 | 87 #ifdef NEED_BSDTTY |
| 88 #include <bsdtty.h> | |
| 89 #endif | |
| 90 | |
| 91 #ifdef IRIS | |
| 92 #include <sys/sysmacros.h> /* for "minor" */ | |
| 93 #endif /* not IRIS */ | |
| 94 | |
| 95 #include "systime.h" | |
|
1047
1ab1ed32e82a
* process.c: Include "systty.h", not "systerm.h".
Jim Blandy <jimb@redhat.com>
parents:
1030
diff
changeset
|
96 #include "systty.h" |
| 578 | 97 |
| 98 #include "lisp.h" | |
| 99 #include "window.h" | |
| 100 #include "buffer.h" | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
101 #include "charset.h" |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
102 #include "coding.h" |
| 578 | 103 #include "process.h" |
| 104 #include "termhooks.h" | |
| 105 #include "termopts.h" | |
| 106 #include "commands.h" | |
|
1780
d01c59bac5c1
* frame.h (FRAME_SAMPLE_VISIBILITY): Make sure frame is marked as
Jim Blandy <jimb@redhat.com>
parents:
1683
diff
changeset
|
107 #include "frame.h" |
| 16780 | 108 #include "blockinput.h" |
| 21514 | 109 #include "keyboard.h" |
| 110 #include "dispextern.h" | |
| 578 | 111 |
|
18492
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
112 #define max(a, b) ((a) > (b) ? (a) : (b)) |
|
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
113 |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
114 Lisp_Object Qprocessp; |
| 578 | 115 Lisp_Object Qrun, Qstop, Qsignal, Qopen, Qclosed; |
|
8231
5226ed89c1a6
(Qlast_nonmenu_event): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8063
diff
changeset
|
116 Lisp_Object Qlast_nonmenu_event; |
| 578 | 117 /* Qexit is declared and initialized in eval.c. */ |
| 118 | |
| 119 /* a process object is a network connection when its childp field is neither | |
|
16058
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
120 Qt nor Qnil but is instead a cons cell (HOSTNAME PORTNUM). */ |
| 578 | 121 |
| 122 #ifdef HAVE_SOCKETS | |
|
16058
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
123 #define NETCONN_P(p) (GC_CONSP (XPROCESS (p)->childp)) |
| 578 | 124 #else |
| 125 #define NETCONN_P(p) 0 | |
| 126 #endif /* HAVE_SOCKETS */ | |
| 127 | |
| 128 /* Define first descriptor number available for subprocesses. */ | |
| 129 #ifdef VMS | |
| 130 #define FIRST_PROC_DESC 1 | |
| 131 #else /* Not VMS */ | |
| 132 #define FIRST_PROC_DESC 3 | |
| 133 #endif | |
| 134 | |
| 135 /* Define SIGCHLD as an alias for SIGCLD. There are many conditionals | |
| 136 testing SIGCHLD. */ | |
| 137 | |
| 138 #if !defined (SIGCHLD) && defined (SIGCLD) | |
| 139 #define SIGCHLD SIGCLD | |
| 140 #endif /* SIGCLD */ | |
| 141 | |
| 142 #include "syssignal.h" | |
| 143 | |
| 4639 | 144 #include "syswait.h" |
| 578 | 145 |
| 5543 | 146 extern int errno; |
| 147 extern char *strerror (); | |
| 148 #ifdef VMS | |
| 578 | 149 extern char *sys_errlist[]; |
| 5543 | 150 #endif |
| 578 | 151 |
|
8331
14ddb4c66461
[!HAVE_H_ERRNO]: Declare h_errno.
Richard M. Stallman <rms@gnu.org>
parents:
8287
diff
changeset
|
152 #ifndef HAVE_H_ERRNO |
|
14ddb4c66461
[!HAVE_H_ERRNO]: Declare h_errno.
Richard M. Stallman <rms@gnu.org>
parents:
8287
diff
changeset
|
153 extern int h_errno; |
|
14ddb4c66461
[!HAVE_H_ERRNO]: Declare h_errno.
Richard M. Stallman <rms@gnu.org>
parents:
8287
diff
changeset
|
154 #endif |
|
14ddb4c66461
[!HAVE_H_ERRNO]: Declare h_errno.
Richard M. Stallman <rms@gnu.org>
parents:
8287
diff
changeset
|
155 |
|
5891
ffe51baf2728
(sys_siglist): Protect decl with #ifndef SYS_SIGLIST_DECLARED.
Roland McGrath <roland@gnu.org>
parents:
5846
diff
changeset
|
156 #ifndef SYS_SIGLIST_DECLARED |
| 578 | 157 #ifndef VMS |
| 158 #ifndef BSD4_1 | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
159 #ifndef WINDOWSNT |
|
3023
cfd999700613
(create_process): Ignore retval from TIOCSTTY.
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
160 #ifndef LINUX |
| 578 | 161 extern char *sys_siglist[]; |
| 5534 | 162 #endif /* not LINUX */ |
| 163 #else /* BSD4_1 */ | |
| 578 | 164 char *sys_siglist[] = |
| 165 { | |
| 166 "bum signal!!", | |
| 167 "hangup", | |
| 168 "interrupt", | |
| 169 "quit", | |
| 170 "illegal instruction", | |
| 171 "trace trap", | |
| 172 "iot instruction", | |
| 173 "emt instruction", | |
| 174 "floating point exception", | |
| 175 "kill", | |
| 176 "bus error", | |
| 177 "segmentation violation", | |
| 178 "bad argument to system call", | |
| 179 "write on a pipe with no one to read it", | |
| 180 "alarm clock", | |
| 181 "software termination signal from kill", | |
| 182 "status signal", | |
| 183 "sendable stop signal not from tty", | |
| 184 "stop signal from tty", | |
| 185 "continue a stopped process", | |
| 186 "child status has changed", | |
| 187 "background read attempted from control tty", | |
| 188 "background write attempted from control tty", | |
| 189 "input record available at control tty", | |
| 190 "exceeded CPU time limit", | |
| 191 "exceeded file size limit" | |
| 192 }; | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
193 #endif /* not WINDOWSNT */ |
| 578 | 194 #endif |
| 195 #endif /* VMS */ | |
|
5891
ffe51baf2728
(sys_siglist): Protect decl with #ifndef SYS_SIGLIST_DECLARED.
Roland McGrath <roland@gnu.org>
parents:
5846
diff
changeset
|
196 #endif /* ! SYS_SIGLIST_DECLARED */ |
| 578 | 197 |
| 198 /* t means use pty, nil means use a pipe, | |
| 199 maybe other values to come. */ | |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
200 static Lisp_Object Vprocess_connection_type; |
| 578 | 201 |
| 202 #ifdef SKTPAIR | |
| 203 #ifndef HAVE_SOCKETS | |
| 204 #include <sys/socket.h> | |
| 205 #endif | |
| 206 #endif /* SKTPAIR */ | |
| 207 | |
|
10548
dcae4394587d
(process_tick, update_tick): Make non-static.
Karl Heuer <kwzh@gnu.org>
parents:
10527
diff
changeset
|
208 /* These next two vars are non-static since sysdep.c uses them in the |
|
dcae4394587d
(process_tick, update_tick): Make non-static.
Karl Heuer <kwzh@gnu.org>
parents:
10527
diff
changeset
|
209 emulation of `select'. */ |
| 578 | 210 /* Number of events of change of status of a process. */ |
|
10548
dcae4394587d
(process_tick, update_tick): Make non-static.
Karl Heuer <kwzh@gnu.org>
parents:
10527
diff
changeset
|
211 int process_tick; |
| 578 | 212 /* Number of events for which the user or sentinel has been notified. */ |
|
10548
dcae4394587d
(process_tick, update_tick): Make non-static.
Karl Heuer <kwzh@gnu.org>
parents:
10527
diff
changeset
|
213 int update_tick; |
| 578 | 214 |
|
10527
68b8191091a7
#include sysselect.h instead of defining things by hand.
Karl Heuer <kwzh@gnu.org>
parents:
10032
diff
changeset
|
215 #include "sysselect.h" |
| 578 | 216 |
|
13414
b035c6e41457
[HAVE_NTGUI] (POLL_FOR_INPUT): Define macro.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13159
diff
changeset
|
217 /* If we support a window system, turn on the code to poll periodically |
|
7486
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
218 to detect C-g. It isn't actually used when doing interrupt input. */ |
|
13414
b035c6e41457
[HAVE_NTGUI] (POLL_FOR_INPUT): Define macro.
Geoff Voelker <voelker@cs.washington.edu>
parents:
13159
diff
changeset
|
219 #ifdef HAVE_WINDOW_SYSTEM |
|
7486
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
220 #define POLL_FOR_INPUT |
|
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
221 #endif |
|
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
222 |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
223 /* Mask of bits indicating the descriptors that we wait for input on. */ |
| 578 | 224 |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
225 static SELECT_TYPE input_wait_mask; |
|
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
226 |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
227 /* Mask that excludes keyboard input descriptor (s). */ |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
228 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
229 static SELECT_TYPE non_keyboard_wait_mask; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
230 |
|
17224
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
231 /* Mask that excludes process input descriptor (s). */ |
|
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
232 |
|
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
233 static SELECT_TYPE non_process_wait_mask; |
|
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
234 |
|
7044
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
235 /* The largest descriptor currently in use for a process object. */ |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
236 static int max_process_desc; |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
237 |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
238 /* The largest descriptor currently in use for keyboard input. */ |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
239 static int max_keyboard_desc; |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
240 |
|
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
241 /* Nonzero means delete a process right away if it exits. */ |
|
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
242 static int delete_exited_processes; |
| 578 | 243 |
| 244 /* Indexed by descriptor, gives the process (if any) for that descriptor */ | |
|
6164
d047d5a48e0e
(chan_process, Vprocess_alist): No longer static.
Richard M. Stallman <rms@gnu.org>
parents:
6158
diff
changeset
|
245 Lisp_Object chan_process[MAXDESC]; |
| 578 | 246 |
| 247 /* Alist of elements (NAME . PROCESS) */ | |
|
6164
d047d5a48e0e
(chan_process, Vprocess_alist): No longer static.
Richard M. Stallman <rms@gnu.org>
parents:
6158
diff
changeset
|
248 Lisp_Object Vprocess_alist; |
| 578 | 249 |
| 250 /* Buffered-ahead input char from process, indexed by channel. | |
| 251 -1 means empty (no char is buffered). | |
| 252 Used on sys V where the only way to tell if there is any | |
| 253 output from the process is to read at least one char. | |
| 254 Always -1 on systems that support FIONREAD. */ | |
| 255 | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
256 /* Don't make static; need to access externally. */ |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
257 int proc_buffered_char[MAXDESC]; |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
258 |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
259 /* Table of `struct coding-system' for each process. */ |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
260 static struct coding_system *proc_decode_coding_system[MAXDESC]; |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
261 static struct coding_system *proc_encode_coding_system[MAXDESC]; |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
262 |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
263 static Lisp_Object get_process (); |
| 6158 | 264 |
|
14404
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
265 extern EMACS_TIME timer_check (); |
|
14785
e4a9806c1e83
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14758
diff
changeset
|
266 extern int timers_run; |
|
14404
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
267 |
| 6158 | 268 /* Maximum number of bytes to send to a pty without an eof. */ |
| 269 static int pty_max_bytes; | |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
270 |
|
21049
01e626b0a624
(Vdefault_file_name_coding_system): Extern it.
Kenichi Handa <handa@m17n.org>
parents:
20715
diff
changeset
|
271 extern Lisp_Object Vfile_name_coding_system, Vdefault_file_name_coding_system; |
|
19837
3bee81323f73
(create_process): Encode the new current dir.
Richard M. Stallman <rms@gnu.org>
parents:
19642
diff
changeset
|
272 |
|
11609
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
273 #ifdef HAVE_PTYS |
|
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
274 /* The file name of the pty opened by allocate_pty. */ |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
275 |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
276 static char pty_name[24]; |
|
11609
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
277 #endif |
| 578 | 278 |
| 279 /* Compute the Lisp form of the process status, p->status, from | |
| 280 the numeric status that was returned by `wait'. */ | |
| 281 | |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
282 Lisp_Object status_convert (); |
|
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
283 |
| 21514 | 284 void |
| 578 | 285 update_status (p) |
| 286 struct Lisp_Process *p; | |
| 287 { | |
| 288 union { int i; WAITTYPE wt; } u; | |
| 289 u.i = XFASTINT (p->raw_status_low) + (XFASTINT (p->raw_status_high) << 16); | |
| 290 p->status = status_convert (u.wt); | |
| 291 p->raw_status_low = Qnil; | |
| 292 p->raw_status_high = Qnil; | |
| 293 } | |
| 294 | |
| 3608 | 295 /* Convert a process status word in Unix format to |
| 578 | 296 the list that we use internally. */ |
| 297 | |
| 298 Lisp_Object | |
| 299 status_convert (w) | |
| 300 WAITTYPE w; | |
| 301 { | |
| 302 if (WIFSTOPPED (w)) | |
| 303 return Fcons (Qstop, Fcons (make_number (WSTOPSIG (w)), Qnil)); | |
| 304 else if (WIFEXITED (w)) | |
| 305 return Fcons (Qexit, Fcons (make_number (WRETCODE (w)), | |
| 306 WCOREDUMP (w) ? Qt : Qnil)); | |
| 307 else if (WIFSIGNALED (w)) | |
| 308 return Fcons (Qsignal, Fcons (make_number (WTERMSIG (w)), | |
| 309 WCOREDUMP (w) ? Qt : Qnil)); | |
| 310 else | |
| 311 return Qrun; | |
| 312 } | |
| 313 | |
| 314 /* Given a status-list, extract the three pieces of information | |
| 315 and store them individually through the three pointers. */ | |
| 316 | |
| 317 void | |
| 318 decode_status (l, symbol, code, coredump) | |
| 319 Lisp_Object l; | |
| 320 Lisp_Object *symbol; | |
| 321 int *code; | |
| 322 int *coredump; | |
| 323 { | |
| 324 Lisp_Object tem; | |
| 325 | |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
326 if (SYMBOLP (l)) |
| 578 | 327 { |
| 328 *symbol = l; | |
| 329 *code = 0; | |
| 330 *coredump = 0; | |
| 331 } | |
| 332 else | |
| 333 { | |
| 334 *symbol = XCONS (l)->car; | |
| 335 tem = XCONS (l)->cdr; | |
| 336 *code = XFASTINT (XCONS (tem)->car); | |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
337 tem = XCONS (tem)->cdr; |
| 578 | 338 *coredump = !NILP (tem); |
| 339 } | |
| 340 } | |
| 341 | |
| 342 /* Return a string describing a process status list. */ | |
| 343 | |
| 344 Lisp_Object | |
| 345 status_message (status) | |
| 346 Lisp_Object status; | |
| 347 { | |
| 348 Lisp_Object symbol; | |
| 349 int code, coredump; | |
| 350 Lisp_Object string, string2; | |
| 351 | |
| 352 decode_status (status, &symbol, &code, &coredump); | |
| 353 | |
| 354 if (EQ (symbol, Qsignal) || EQ (symbol, Qstop)) | |
| 355 { | |
|
5579
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
356 char *signame = 0; |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
357 if (code < NSIG) |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
358 { |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
359 #ifndef VMS |
|
9705
f7535deb913a
(status_message): Add a cast.
Richard M. Stallman <rms@gnu.org>
parents:
9697
diff
changeset
|
360 /* Cast to suppress warning if the table has const char *. */ |
|
f7535deb913a
(status_message): Add a cast.
Richard M. Stallman <rms@gnu.org>
parents:
9697
diff
changeset
|
361 signame = (char *) sys_siglist[code]; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
362 #else |
|
5579
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
363 signame = sys_errlist[code]; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
364 #endif |
|
5579
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
365 } |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
366 if (signame == 0) |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
367 signame = "unknown"; |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
368 string = build_string (signame); |
| 578 | 369 string2 = build_string (coredump ? " (core dumped)\n" : "\n"); |
| 370 XSTRING (string)->data[0] = DOWNCASE (XSTRING (string)->data[0]); | |
| 371 return concat2 (string, string2); | |
| 372 } | |
| 373 else if (EQ (symbol, Qexit)) | |
| 374 { | |
| 375 if (code == 0) | |
| 376 return build_string ("finished\n"); | |
|
2429
96b55f2f19cd
Rename int-to-string to number-to-string, since it can handle
Jim Blandy <jimb@redhat.com>
parents:
2357
diff
changeset
|
377 string = Fnumber_to_string (make_number (code)); |
| 578 | 378 string2 = build_string (coredump ? " (core dumped)\n" : "\n"); |
| 379 return concat2 (build_string ("exited abnormally with code "), | |
| 380 concat2 (string, string2)); | |
| 381 } | |
| 382 else | |
| 383 return Fcopy_sequence (Fsymbol_name (symbol)); | |
| 384 } | |
| 385 | |
| 386 #ifdef HAVE_PTYS | |
| 387 | |
|
11609
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
388 /* Open an available pty, returning a file descriptor. |
|
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
389 Return -1 on failure. |
|
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
390 The file name of the terminal corresponding to the pty |
|
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
391 is left in the variable pty_name. */ |
|
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
392 |
| 578 | 393 int |
| 394 allocate_pty () | |
| 395 { | |
| 396 struct stat stb; | |
| 21514 | 397 register int c, i; |
| 578 | 398 int fd; |
| 399 | |
| 624 | 400 /* Some systems name their pseudoterminals so that there are gaps in |
| 401 the usual sequence - for example, on HP9000/S700 systems, there | |
| 402 are no pseudoterminals with names ending in 'f'. So we wait for | |
| 403 three failures in a row before deciding that we've reached the | |
| 404 end of the ptys. */ | |
| 405 int failed_count = 0; | |
| 406 | |
| 578 | 407 #ifdef PTY_ITERATION |
| 408 PTY_ITERATION | |
| 409 #else | |
| 410 for (c = FIRST_PTY_LETTER; c <= 'z'; c++) | |
| 411 for (i = 0; i < 16; i++) | |
| 412 #endif | |
| 413 { | |
| 414 #ifdef PTY_NAME_SPRINTF | |
| 415 PTY_NAME_SPRINTF | |
| 416 #else | |
| 417 sprintf (pty_name, "/dev/pty%c%x", c, i); | |
| 418 #endif /* no PTY_NAME_SPRINTF */ | |
| 419 | |
|
822
c6e94e13926c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
808
diff
changeset
|
420 #ifdef PTY_OPEN |
|
c6e94e13926c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
808
diff
changeset
|
421 PTY_OPEN; |
|
c6e94e13926c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
808
diff
changeset
|
422 #else /* no PTY_OPEN */ |
| 624 | 423 #ifdef IRIS |
| 424 /* Unusual IRIS code */ | |
| 425 *ptyv = open ("/dev/ptc", O_RDWR | O_NDELAY, 0); | |
| 426 if (fd < 0) | |
| 427 return -1; | |
| 428 if (fstat (fd, &stb) < 0) | |
| 429 return -1; | |
|
822
c6e94e13926c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
808
diff
changeset
|
430 #else /* not IRIS */ |
| 578 | 431 if (stat (pty_name, &stb) < 0) |
| 624 | 432 { |
| 433 failed_count++; | |
| 434 if (failed_count >= 3) | |
| 435 return -1; | |
| 436 } | |
| 437 else | |
| 438 failed_count = 0; | |
| 578 | 439 #ifdef O_NONBLOCK |
| 440 fd = open (pty_name, O_RDWR | O_NONBLOCK, 0); | |
| 441 #else | |
| 442 fd = open (pty_name, O_RDWR | O_NDELAY, 0); | |
| 443 #endif | |
|
822
c6e94e13926c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
808
diff
changeset
|
444 #endif /* not IRIS */ |
|
c6e94e13926c
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
808
diff
changeset
|
445 #endif /* no PTY_OPEN */ |
| 578 | 446 |
| 447 if (fd >= 0) | |
| 448 { | |
| 449 /* check to make certain that both sides are available | |
| 450 this avoids a nasty yet stupid bug in rlogins */ | |
| 451 #ifdef PTY_TTY_NAME_SPRINTF | |
| 452 PTY_TTY_NAME_SPRINTF | |
| 453 #else | |
| 454 sprintf (pty_name, "/dev/tty%c%x", c, i); | |
| 455 #endif /* no PTY_TTY_NAME_SPRINTF */ | |
| 456 #ifndef UNIPLUS | |
| 457 if (access (pty_name, 6) != 0) | |
| 458 { | |
| 459 close (fd); | |
|
2887
0554478bfa71
* process.c [__sgi] (allocate_pty): Give up immediately if pty is
Jim Blandy <jimb@redhat.com>
parents:
2830
diff
changeset
|
460 #if !defined(IRIS) && !defined(__sgi) |
| 578 | 461 continue; |
| 462 #else | |
| 463 return -1; | |
| 464 #endif /* IRIS */ | |
| 465 } | |
| 466 #endif /* not UNIPLUS */ | |
| 467 setup_pty (fd); | |
| 468 return fd; | |
| 469 } | |
| 470 } | |
| 471 return -1; | |
| 472 } | |
| 473 #endif /* HAVE_PTYS */ | |
| 474 | |
| 475 Lisp_Object | |
| 476 make_process (name) | |
| 477 Lisp_Object name; | |
| 478 { | |
|
9969
007d93b04e1f
(make_process): Use allocate_vectorlike and VECSIZE.
Karl Heuer <kwzh@gnu.org>
parents:
9952
diff
changeset
|
479 struct Lisp_Vector *vec; |
| 578 | 480 register Lisp_Object val, tem, name1; |
| 481 register struct Lisp_Process *p; | |
| 482 char suffix[10]; | |
| 483 register int i; | |
| 484 | |
|
9969
007d93b04e1f
(make_process): Use allocate_vectorlike and VECSIZE.
Karl Heuer <kwzh@gnu.org>
parents:
9952
diff
changeset
|
485 vec = allocate_vectorlike ((EMACS_INT) VECSIZE (struct Lisp_Process)); |
|
007d93b04e1f
(make_process): Use allocate_vectorlike and VECSIZE.
Karl Heuer <kwzh@gnu.org>
parents:
9952
diff
changeset
|
486 for (i = 0; i < VECSIZE (struct Lisp_Process); i++) |
|
007d93b04e1f
(make_process): Use allocate_vectorlike and VECSIZE.
Karl Heuer <kwzh@gnu.org>
parents:
9952
diff
changeset
|
487 vec->contents[i] = Qnil; |
|
007d93b04e1f
(make_process): Use allocate_vectorlike and VECSIZE.
Karl Heuer <kwzh@gnu.org>
parents:
9952
diff
changeset
|
488 vec->size = VECSIZE (struct Lisp_Process); |
|
007d93b04e1f
(make_process): Use allocate_vectorlike and VECSIZE.
Karl Heuer <kwzh@gnu.org>
parents:
9952
diff
changeset
|
489 p = (struct Lisp_Process *)vec; |
|
007d93b04e1f
(make_process): Use allocate_vectorlike and VECSIZE.
Karl Heuer <kwzh@gnu.org>
parents:
9952
diff
changeset
|
490 |
|
9277
21f6120be5ba
(make_process, create_process, Fopen_network_stream, deactivate_process,
Karl Heuer <kwzh@gnu.org>
parents:
9115
diff
changeset
|
491 XSETINT (p->infd, -1); |
|
21f6120be5ba
(make_process, create_process, Fopen_network_stream, deactivate_process,
Karl Heuer <kwzh@gnu.org>
parents:
9115
diff
changeset
|
492 XSETINT (p->outfd, -1); |
|
9318
a14cc1712337
(make_process, list_processes_1, create_process, Faccept_process_output,
Karl Heuer <kwzh@gnu.org>
parents:
9277
diff
changeset
|
493 XSETFASTINT (p->pid, 0); |
|
a14cc1712337
(make_process, list_processes_1, create_process, Faccept_process_output,
Karl Heuer <kwzh@gnu.org>
parents:
9277
diff
changeset
|
494 XSETFASTINT (p->tick, 0); |
|
a14cc1712337
(make_process, list_processes_1, create_process, Faccept_process_output,
Karl Heuer <kwzh@gnu.org>
parents:
9277
diff
changeset
|
495 XSETFASTINT (p->update_tick, 0); |
| 578 | 496 p->raw_status_low = Qnil; |
| 497 p->raw_status_high = Qnil; | |
| 498 p->status = Qrun; | |
| 499 p->mark = Fmake_marker (); | |
| 500 | |
| 501 /* If name is already in use, modify it until it is unused. */ | |
| 502 | |
| 503 name1 = name; | |
| 504 for (i = 1; ; i++) | |
| 505 { | |
| 506 tem = Fget_process (name1); | |
| 507 if (NILP (tem)) break; | |
| 508 sprintf (suffix, "<%d>", i); | |
| 509 name1 = concat2 (name, build_string (suffix)); | |
| 510 } | |
| 511 name = name1; | |
| 512 p->name = name; | |
|
9969
007d93b04e1f
(make_process): Use allocate_vectorlike and VECSIZE.
Karl Heuer <kwzh@gnu.org>
parents:
9952
diff
changeset
|
513 XSETPROCESS (val, p); |
| 578 | 514 Vprocess_alist = Fcons (Fcons (name, val), Vprocess_alist); |
| 515 return val; | |
| 516 } | |
| 517 | |
| 21514 | 518 void |
| 578 | 519 remove_process (proc) |
| 520 register Lisp_Object proc; | |
| 521 { | |
| 522 register Lisp_Object pair; | |
| 523 | |
| 524 pair = Frassq (proc, Vprocess_alist); | |
| 525 Vprocess_alist = Fdelq (pair, Vprocess_alist); | |
| 526 | |
| 527 deactivate_process (proc); | |
| 528 } | |
| 529 | |
| 530 DEFUN ("processp", Fprocessp, Sprocessp, 1, 1, 0, | |
| 531 "Return t if OBJECT is a process.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
532 (object) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
533 Lisp_Object object; |
| 578 | 534 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
535 return PROCESSP (object) ? Qt : Qnil; |
| 578 | 536 } |
| 537 | |
| 538 DEFUN ("get-process", Fget_process, Sget_process, 1, 1, 0, | |
| 539 "Return the process named NAME, or nil if there is none.") | |
| 540 (name) | |
| 541 register Lisp_Object name; | |
| 542 { | |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
543 if (PROCESSP (name)) |
| 578 | 544 return name; |
| 545 CHECK_STRING (name, 0); | |
| 546 return Fcdr (Fassoc (name, Vprocess_alist)); | |
| 547 } | |
| 548 | |
| 549 DEFUN ("get-buffer-process", Fget_buffer_process, Sget_buffer_process, 1, 1, 0, | |
| 23405 | 550 "Return the (or a) process associated with BUFFER.\n\ |
| 578 | 551 BUFFER may be a buffer or the name of one.") |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
552 (buffer) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
553 register Lisp_Object buffer; |
| 578 | 554 { |
| 555 register Lisp_Object buf, tail, proc; | |
| 556 | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
557 if (NILP (buffer)) return Qnil; |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
558 buf = Fget_buffer (buffer); |
| 578 | 559 if (NILP (buf)) return Qnil; |
| 560 | |
| 561 for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail)) | |
| 562 { | |
| 563 proc = Fcdr (Fcar (tail)); | |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
564 if (PROCESSP (proc) && EQ (XPROCESS (proc)->buffer, buf)) |
| 578 | 565 return proc; |
| 566 } | |
| 567 return Qnil; | |
| 568 } | |
| 569 | |
| 808 | 570 /* This is how commands for the user decode process arguments. It |
| 571 accepts a process, a process name, a buffer, a buffer name, or nil. | |
| 572 Buffers denote the first process in the buffer, and nil denotes the | |
| 573 current buffer. */ | |
| 578 | 574 |
|
4994
4146a65b9f02
(get_process): Add `static' to definition.
Richard M. Stallman <rms@gnu.org>
parents:
4914
diff
changeset
|
575 static Lisp_Object |
| 578 | 576 get_process (name) |
| 577 register Lisp_Object name; | |
| 578 { | |
|
6313
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
579 register Lisp_Object proc, obj; |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
580 if (STRINGP (name)) |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
581 { |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
582 obj = Fget_process (name); |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
583 if (NILP (obj)) |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
584 obj = Fget_buffer (name); |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
585 if (NILP (obj)) |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
586 error ("Process %s does not exist", XSTRING (name)->data); |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
587 } |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
588 else if (NILP (name)) |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
589 obj = Fcurrent_buffer (); |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
590 else |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
591 obj = name; |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
592 |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
593 /* Now obj should be either a buffer object or a process object. |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
594 */ |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
595 if (BUFFERP (obj)) |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
596 { |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
597 proc = Fget_buffer_process (obj); |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
598 if (NILP (proc)) |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
599 error ("Buffer %s has no process", XSTRING (XBUFFER (obj)->name)->data); |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
600 } |
| 578 | 601 else |
| 602 { | |
|
6313
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
603 CHECK_PROCESS (obj, 0); |
|
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
604 proc = obj; |
| 578 | 605 } |
|
6313
9a6531e6de5d
(get_process): Allow arg to be a buffer object.
Karl Heuer <kwzh@gnu.org>
parents:
6253
diff
changeset
|
606 return proc; |
| 578 | 607 } |
| 608 | |
| 609 DEFUN ("delete-process", Fdelete_process, Sdelete_process, 1, 1, 0, | |
| 610 "Delete PROCESS: kill it and forget about it immediately.\n\ | |
| 808 | 611 PROCESS may be a process, a buffer, the name of a process or buffer, or\n\ |
| 612 nil, indicating the current buffer's process.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
613 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
614 register Lisp_Object process; |
| 578 | 615 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
616 process = get_process (process); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
617 XPROCESS (process)->raw_status_low = Qnil; |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
618 XPROCESS (process)->raw_status_high = Qnil; |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
619 if (NETCONN_P (process)) |
| 578 | 620 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
621 XPROCESS (process)->status = Fcons (Qexit, Fcons (make_number (0), Qnil)); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
622 XSETINT (XPROCESS (process)->tick, ++process_tick); |
| 578 | 623 } |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
624 else if (XINT (XPROCESS (process)->infd) >= 0) |
| 578 | 625 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
626 Fkill_process (process, Qnil); |
| 578 | 627 /* Do this now, since remove_process will make sigchld_handler do nothing. */ |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
628 XPROCESS (process)->status |
| 578 | 629 = Fcons (Qsignal, Fcons (make_number (SIGKILL), Qnil)); |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
630 XSETINT (XPROCESS (process)->tick, ++process_tick); |
| 578 | 631 status_notify (); |
| 632 } | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
633 remove_process (process); |
| 578 | 634 return Qnil; |
| 635 } | |
| 636 | |
| 637 DEFUN ("process-status", Fprocess_status, Sprocess_status, 1, 1, 0, | |
| 23405 | 638 "Return the status of PROCESS.\n\ |
| 639 The returned value is one of the following symbols:\n\ | |
| 578 | 640 run -- for a process that is running.\n\ |
| 641 stop -- for a process stopped but continuable.\n\ | |
| 642 exit -- for a process that has exited.\n\ | |
| 643 signal -- for a process that has got a fatal signal.\n\ | |
| 644 open -- for a network stream connection that is open.\n\ | |
| 645 closed -- for a network stream connection that is closed.\n\ | |
| 808 | 646 nil -- if arg is a process name and no such process exists.\n\ |
| 23661 | 647 PROCESS may be a process, a buffer, the name of a process, or\n\ |
| 808 | 648 nil, indicating the current buffer's process.") |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
649 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
650 register Lisp_Object process; |
| 578 | 651 { |
| 652 register struct Lisp_Process *p; | |
| 653 register Lisp_Object status; | |
|
7937
bf963799d8be
(Fprocess_status): Return nil for process name that has no process.
Richard M. Stallman <rms@gnu.org>
parents:
7893
diff
changeset
|
654 |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
655 if (STRINGP (process)) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
656 process = Fget_process (process); |
|
7937
bf963799d8be
(Fprocess_status): Return nil for process name that has no process.
Richard M. Stallman <rms@gnu.org>
parents:
7893
diff
changeset
|
657 else |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
658 process = get_process (process); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
659 |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
660 if (NILP (process)) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
661 return process; |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
662 |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
663 p = XPROCESS (process); |
| 578 | 664 if (!NILP (p->raw_status_low)) |
| 665 update_status (p); | |
| 666 status = p->status; | |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
667 if (CONSP (status)) |
| 578 | 668 status = XCONS (status)->car; |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
669 if (NETCONN_P (process)) |
| 578 | 670 { |
| 671 if (EQ (status, Qrun)) | |
| 672 status = Qopen; | |
| 673 else if (EQ (status, Qexit)) | |
| 674 status = Qclosed; | |
| 675 } | |
| 676 return status; | |
| 677 } | |
| 678 | |
| 679 DEFUN ("process-exit-status", Fprocess_exit_status, Sprocess_exit_status, | |
| 680 1, 1, 0, | |
| 681 "Return the exit status of PROCESS or the signal number that killed it.\n\ | |
| 682 If PROCESS has not yet exited or died, return 0.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
683 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
684 register Lisp_Object process; |
| 578 | 685 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
686 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
687 if (!NILP (XPROCESS (process)->raw_status_low)) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
688 update_status (XPROCESS (process)); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
689 if (CONSP (XPROCESS (process)->status)) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
690 return XCONS (XCONS (XPROCESS (process)->status)->cdr)->car; |
| 578 | 691 return make_number (0); |
| 692 } | |
| 693 | |
| 694 DEFUN ("process-id", Fprocess_id, Sprocess_id, 1, 1, 0, | |
| 695 "Return the process id of PROCESS.\n\ | |
| 696 This is the pid of the Unix process which PROCESS uses or talks to.\n\ | |
| 697 For a network connection, this value is nil.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
698 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
699 register Lisp_Object process; |
| 578 | 700 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
701 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
702 return XPROCESS (process)->pid; |
| 578 | 703 } |
| 704 | |
| 705 DEFUN ("process-name", Fprocess_name, Sprocess_name, 1, 1, 0, | |
| 706 "Return the name of PROCESS, as a string.\n\ | |
| 707 This is the name of the program invoked in PROCESS,\n\ | |
| 708 possibly modified to make it unique among process names.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
709 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
710 register Lisp_Object process; |
| 578 | 711 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
712 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
713 return XPROCESS (process)->name; |
| 578 | 714 } |
| 715 | |
| 716 DEFUN ("process-command", Fprocess_command, Sprocess_command, 1, 1, 0, | |
| 717 "Return the command that was executed to start PROCESS.\n\ | |
| 718 This is a list of strings, the first string being the program executed\n\ | |
| 719 and the rest of the strings being the arguments given to it.\n\ | |
| 720 For a non-child channel, this is nil.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
721 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
722 register Lisp_Object process; |
| 578 | 723 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
724 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
725 return XPROCESS (process)->command; |
| 578 | 726 } |
| 727 | |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
728 DEFUN ("process-tty-name", Fprocess_tty_name, Sprocess_tty_name, 1, 1, 0, |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
729 "Return the name of the terminal PROCESS uses, or nil if none.\n\ |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
730 This is the terminal that the process itself reads and writes on,\n\ |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
731 not the name of the pty that Emacs uses to talk with that terminal.") |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
732 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
733 register Lisp_Object process; |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
734 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
735 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
736 return XPROCESS (process)->tty_name; |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
737 } |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
738 |
| 578 | 739 DEFUN ("set-process-buffer", Fset_process_buffer, Sset_process_buffer, |
| 740 2, 2, 0, | |
| 741 "Set buffer associated with PROCESS to BUFFER (a buffer, or nil).") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
742 (process, buffer) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
743 register Lisp_Object process, buffer; |
| 578 | 744 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
745 CHECK_PROCESS (process, 0); |
| 578 | 746 if (!NILP (buffer)) |
| 747 CHECK_BUFFER (buffer, 1); | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
748 XPROCESS (process)->buffer = buffer; |
| 578 | 749 return buffer; |
| 750 } | |
| 751 | |
| 752 DEFUN ("process-buffer", Fprocess_buffer, Sprocess_buffer, | |
| 753 1, 1, 0, | |
| 754 "Return the buffer PROCESS is associated with.\n\ | |
| 23405 | 755 Output from PROCESS is inserted in this buffer unless PROCESS has a filter.") |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
756 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
757 register Lisp_Object process; |
| 578 | 758 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
759 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
760 return XPROCESS (process)->buffer; |
| 578 | 761 } |
| 762 | |
| 763 DEFUN ("process-mark", Fprocess_mark, Sprocess_mark, | |
| 764 1, 1, 0, | |
| 765 "Return the marker for the end of the last output from PROCESS.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
766 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
767 register Lisp_Object process; |
| 578 | 768 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
769 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
770 return XPROCESS (process)->mark; |
| 578 | 771 } |
| 772 | |
| 773 DEFUN ("set-process-filter", Fset_process_filter, Sset_process_filter, | |
| 774 2, 2, 0, | |
| 775 "Give PROCESS the filter function FILTER; nil means no filter.\n\ | |
|
4870
c53deda13fa9
(status_notify): Don't read from process if filter is t.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
776 t means stop accepting output from the process.\n\ |
| 578 | 777 When a process has a filter, each time it does output\n\ |
| 778 the entire string of output is passed to the filter.\n\ | |
| 779 The filter gets two arguments: the process and the string of output.\n\ | |
| 780 If the process has a filter, its buffer is not used for output.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
781 (process, filter) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
782 register Lisp_Object process, filter; |
| 578 | 783 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
784 CHECK_PROCESS (process, 0); |
|
4870
c53deda13fa9
(status_notify): Don't read from process if filter is t.
Richard M. Stallman <rms@gnu.org>
parents:
4696
diff
changeset
|
785 if (EQ (filter, Qt)) |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
786 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
787 FD_CLR (XINT (XPROCESS (process)->infd), &input_wait_mask); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
788 FD_CLR (XINT (XPROCESS (process)->infd), &non_keyboard_wait_mask); |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
789 } |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
790 else if (EQ (XPROCESS (process)->filter, Qt)) |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
791 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
792 FD_SET (XINT (XPROCESS (process)->infd), &input_wait_mask); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
793 FD_SET (XINT (XPROCESS (process)->infd), &non_keyboard_wait_mask); |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
794 } |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
795 XPROCESS (process)->filter = filter; |
| 578 | 796 return filter; |
| 797 } | |
| 798 | |
| 799 DEFUN ("process-filter", Fprocess_filter, Sprocess_filter, | |
| 800 1, 1, 0, | |
| 801 "Returns the filter function of PROCESS; nil if none.\n\ | |
| 802 See `set-process-filter' for more info on filter functions.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
803 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
804 register Lisp_Object process; |
| 578 | 805 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
806 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
807 return XPROCESS (process)->filter; |
| 578 | 808 } |
| 809 | |
| 810 DEFUN ("set-process-sentinel", Fset_process_sentinel, Sset_process_sentinel, | |
| 811 2, 2, 0, | |
| 812 "Give PROCESS the sentinel SENTINEL; nil for none.\n\ | |
| 813 The sentinel is called as a function when the process changes state.\n\ | |
| 814 It gets two arguments: the process, and a string describing the change.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
815 (process, sentinel) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
816 register Lisp_Object process, sentinel; |
| 578 | 817 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
818 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
819 XPROCESS (process)->sentinel = sentinel; |
| 578 | 820 return sentinel; |
| 821 } | |
| 822 | |
| 823 DEFUN ("process-sentinel", Fprocess_sentinel, Sprocess_sentinel, | |
| 824 1, 1, 0, | |
| 825 "Return the sentinel of PROCESS; nil if none.\n\ | |
| 826 See `set-process-sentinel' for more info on sentinels.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
827 (process) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
828 register Lisp_Object process; |
| 578 | 829 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
830 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
831 return XPROCESS (process)->sentinel; |
| 578 | 832 } |
| 833 | |
|
6830
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
834 DEFUN ("set-process-window-size", Fset_process_window_size, |
|
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
835 Sset_process_window_size, 3, 3, 0, |
|
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
836 "Tell PROCESS that it has logical window size HEIGHT and WIDTH.") |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
837 (process, height, width) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
838 register Lisp_Object process, height, width; |
|
6830
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
839 { |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
840 CHECK_PROCESS (process, 0); |
|
6830
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
841 CHECK_NATNUM (height, 0); |
|
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
842 CHECK_NATNUM (width, 0); |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
843 if (set_window_size (XINT (XPROCESS (process)->infd), |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
844 XINT (height), XINT (width)) <= 0) |
|
6830
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
845 return Qnil; |
|
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
846 else |
|
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
847 return Qt; |
|
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
848 } |
|
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
849 |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
850 DEFUN ("set-process-inherit-coding-system-flag", |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
851 Fset_process_inherit_coding_system_flag, |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
852 Sset_process_inherit_coding_system_flag, 2, 2, 0, |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
853 "Determine whether buffer of PROCESS will inherit coding-system.\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
854 If the second argument FLAG is non-nil, then the variable\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
855 `buffer-file-coding-system' of the buffer associated with PROCESS\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
856 will be bound to the value of the coding system used to decode\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
857 the process output.\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
858 \n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
859 This is useful when the coding system specified for the process buffer\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
860 leaves either the character code conversion or the end-of-line conversion\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
861 unspecified, or if the coding system used to decode the process output\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
862 is more appropriate for saving the process buffer.\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
863 \n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
864 Binding the variable `inherit-process-coding-system' to non-nil before\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
865 starting the process is an alternative way of setting the inherit flag\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
866 for the process which will run.") |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
867 (process, flag) |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
868 register Lisp_Object process, flag; |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
869 { |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
870 CHECK_PROCESS (process, 0); |
|
21848
050ea21cec87
(Fset_process_inherit_coding_system_flag, Fstart_process):
Richard M. Stallman <rms@gnu.org>
parents:
21798
diff
changeset
|
871 XPROCESS (process)->inherit_coding_system_flag = flag; |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
872 return flag; |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
873 } |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
874 |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
875 DEFUN ("process-inherit-coding-system-flag", |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
876 Fprocess_inherit_coding_system_flag, Sprocess_inherit_coding_system_flag, |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
877 1, 1, 0, |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
878 "Return the value of inherit-coding-system flag for PROCESS.\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
879 If this flag is t, `buffer-file-coding-system' of the buffer\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
880 associated with PROCESS will inherit the coding system used to decode\n\ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
881 the process output.") |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
882 (process) |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
883 register Lisp_Object process; |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
884 { |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
885 CHECK_PROCESS (process, 0); |
|
21848
050ea21cec87
(Fset_process_inherit_coding_system_flag, Fstart_process):
Richard M. Stallman <rms@gnu.org>
parents:
21798
diff
changeset
|
886 return XPROCESS (process)->inherit_coding_system_flag; |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
887 } |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
888 |
| 578 | 889 DEFUN ("process-kill-without-query", Fprocess_kill_without_query, |
| 890 Sprocess_kill_without_query, 1, 2, 0, | |
| 891 "Say no query needed if PROCESS is running when Emacs is exited.\n\ | |
|
5846
1322c4daeda2
(Fprocess_kill_without_query): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
5579
diff
changeset
|
892 Optional second argument if non-nil says to require a query.\n\ |
| 578 | 893 Value is t if a query was formerly required.") |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
894 (process, value) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
895 register Lisp_Object process, value; |
| 578 | 896 { |
| 897 Lisp_Object tem; | |
| 898 | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
899 CHECK_PROCESS (process, 0); |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
900 tem = XPROCESS (process)->kill_without_query; |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
901 XPROCESS (process)->kill_without_query = Fnull (value); |
| 578 | 902 |
| 903 return Fnull (tem); | |
| 904 } | |
|
4231
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
905 |
|
16058
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
906 DEFUN ("process-contact", Fprocess_contact, Sprocess_contact, |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
907 1, 1, 0, |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
908 "Return the contact info of PROCESS; t for a real child.\n\ |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
909 For a net connection, the value is a cons cell of the form (HOST SERVICE).") |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
910 (process) |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
911 register Lisp_Object process; |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
912 { |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
913 CHECK_PROCESS (process, 0); |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
914 return XPROCESS (process)->childp; |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
915 } |
|
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
916 |
|
4231
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
917 #if 0 /* Turned off because we don't currently record this info |
|
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
918 in the process. Perhaps add it. */ |
|
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
919 DEFUN ("process-connection", Fprocess_connection, Sprocess_connection, 1, 1, 0, |
| 23405 | 920 "Return the connection type of PROCESS.\n\ |
| 921 The value is nil for a pipe, t or `pty' for a pty, or `stream' for\n\ | |
| 922 a socket connection.") | |
|
4231
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
923 (process) |
|
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
924 Lisp_Object process; |
|
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
925 { |
|
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
926 return XPROCESS (process)->type; |
|
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
927 } |
|
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
928 #endif |
| 578 | 929 |
| 930 Lisp_Object | |
| 931 list_processes_1 () | |
| 932 { | |
| 933 register Lisp_Object tail, tem; | |
| 934 Lisp_Object proc, minspace, tem1; | |
| 935 register struct buffer *old = current_buffer; | |
| 936 register struct Lisp_Process *p; | |
| 937 register int state; | |
| 938 char tembuf[80]; | |
| 939 | |
|
9318
a14cc1712337
(make_process, list_processes_1, create_process, Faccept_process_output,
Karl Heuer <kwzh@gnu.org>
parents:
9277
diff
changeset
|
940 XSETFASTINT (minspace, 1); |
| 578 | 941 |
| 942 set_buffer_internal (XBUFFER (Vstandard_output)); | |
| 943 Fbuffer_disable_undo (Vstandard_output); | |
| 944 | |
| 945 current_buffer->truncate_lines = Qt; | |
| 946 | |
| 947 write_string ("\ | |
|
9697
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
948 Proc Status Buffer Tty Command\n\ |
|
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
949 ---- ------ ------ --- -------\n", -1); |
| 578 | 950 |
| 951 for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail)) | |
| 952 { | |
| 953 Lisp_Object symbol; | |
| 954 | |
| 955 proc = Fcdr (Fcar (tail)); | |
| 956 p = XPROCESS (proc); | |
| 957 if (NILP (p->childp)) | |
| 958 continue; | |
| 959 | |
| 960 Finsert (1, &p->name); | |
| 961 Findent_to (make_number (13), minspace); | |
| 962 | |
| 963 if (!NILP (p->raw_status_low)) | |
| 964 update_status (p); | |
| 965 symbol = p->status; | |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
966 if (CONSP (p->status)) |
| 578 | 967 symbol = XCONS (p->status)->car; |
| 968 | |
| 969 | |
| 970 if (EQ (symbol, Qsignal)) | |
| 971 { | |
| 972 Lisp_Object tem; | |
| 973 tem = Fcar (Fcdr (p->status)); | |
| 974 #ifdef VMS | |
| 975 if (XINT (tem) < NSIG) | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
976 write_string (sys_errlist [XINT (tem)], -1); |
| 578 | 977 else |
| 978 #endif | |
| 979 Fprinc (symbol, Qnil); | |
| 980 } | |
| 981 else if (NETCONN_P (proc)) | |
| 982 { | |
| 983 if (EQ (symbol, Qrun)) | |
| 984 write_string ("open", -1); | |
| 985 else if (EQ (symbol, Qexit)) | |
| 986 write_string ("closed", -1); | |
| 987 else | |
| 988 Fprinc (symbol, Qnil); | |
| 989 } | |
| 990 else | |
| 991 Fprinc (symbol, Qnil); | |
| 992 | |
| 993 if (EQ (symbol, Qexit)) | |
| 994 { | |
| 995 Lisp_Object tem; | |
| 996 tem = Fcar (Fcdr (p->status)); | |
| 997 if (XFASTINT (tem)) | |
| 998 { | |
|
11695
0f9b9c375416
(list_processes_1): Cast XFASTINT for passing to sprintf.
Richard M. Stallman <rms@gnu.org>
parents:
11609
diff
changeset
|
999 sprintf (tembuf, " %d", (int) XFASTINT (tem)); |
| 578 | 1000 write_string (tembuf, -1); |
| 1001 } | |
| 1002 } | |
| 1003 | |
| 1004 if (EQ (symbol, Qsignal) || EQ (symbol, Qexit)) | |
| 1005 remove_process (proc); | |
| 1006 | |
| 1007 Findent_to (make_number (22), minspace); | |
| 1008 if (NILP (p->buffer)) | |
| 1009 insert_string ("(none)"); | |
| 1010 else if (NILP (XBUFFER (p->buffer)->name)) | |
| 1011 insert_string ("(Killed)"); | |
| 1012 else | |
| 1013 Finsert (1, &XBUFFER (p->buffer)->name); | |
| 1014 | |
| 1015 Findent_to (make_number (37), minspace); | |
| 1016 | |
|
9697
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
1017 if (STRINGP (p->tty_name)) |
|
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
1018 Finsert (1, &p->tty_name); |
|
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
1019 else |
|
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
1020 insert_string ("(none)"); |
|
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
1021 |
|
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
1022 Findent_to (make_number (49), minspace); |
|
328b8bc31f73
(list_processes_1): Print tty name.
Karl Heuer <kwzh@gnu.org>
parents:
9686
diff
changeset
|
1023 |
| 578 | 1024 if (NETCONN_P (proc)) |
| 1025 { | |
| 1026 sprintf (tembuf, "(network stream connection to %s)\n", | |
|
16058
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
1027 XSTRING (XCONS (p->childp)->car)->data); |
| 578 | 1028 insert_string (tembuf); |
| 1029 } | |
| 1030 else | |
| 1031 { | |
| 1032 tem = p->command; | |
| 1033 while (1) | |
| 1034 { | |
| 1035 tem1 = Fcar (tem); | |
| 1036 Finsert (1, &tem1); | |
| 1037 tem = Fcdr (tem); | |
| 1038 if (NILP (tem)) | |
| 1039 break; | |
| 1040 insert_string (" "); | |
| 1041 } | |
| 1042 insert_string ("\n"); | |
| 1043 } | |
| 1044 } | |
| 1045 return Qnil; | |
| 1046 } | |
| 1047 | |
| 1048 DEFUN ("list-processes", Flist_processes, Slist_processes, 0, 0, "", | |
| 1049 "Display a list of all processes.\n\ | |
| 23405 | 1050 Any process listed as exited or signaled is actually eliminated\n\ |
| 1051 after the listing is made.") | |
| 578 | 1052 () |
| 1053 { | |
| 1054 internal_with_output_to_temp_buffer ("*Process List*", | |
| 1055 list_processes_1, Qnil); | |
| 1056 return Qnil; | |
| 1057 } | |
| 1058 | |
| 1059 DEFUN ("process-list", Fprocess_list, Sprocess_list, 0, 0, 0, | |
| 1060 "Return a list of all processes.") | |
| 1061 () | |
| 1062 { | |
| 1063 return Fmapcar (Qcdr, Vprocess_alist); | |
| 1064 } | |
| 1065 | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1066 /* Starting asynchronous inferior processes. */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1067 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1068 static Lisp_Object start_process_unwind (); |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1069 |
| 578 | 1070 DEFUN ("start-process", Fstart_process, Sstart_process, 3, MANY, 0, |
| 1071 "Start a program in a subprocess. Return the process object for it.\n\ | |
| 1072 Args are NAME BUFFER PROGRAM &rest PROGRAM-ARGS\n\ | |
| 1073 NAME is name for process. It is modified if necessary to make it unique.\n\ | |
| 1074 BUFFER is the buffer or (buffer-name) to associate with the process.\n\ | |
| 1075 Process output goes at end of that buffer, unless you specify\n\ | |
| 1076 an output stream or filter function to handle the output.\n\ | |
| 1077 BUFFER may be also nil, meaning that this process is not associated\n\ | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
1078 with any buffer.\n\ |
|
21177
73f8ae8312c8
(exec_sentinel, read_process_output): Fstore_match_data => Fset_match_data.
Richard M. Stallman <rms@gnu.org>
parents:
21049
diff
changeset
|
1079 Third arg is program file name. It is searched for in PATH.\n\ |
| 578 | 1080 Remaining arguments are strings to give program as arguments.") |
| 1081 (nargs, args) | |
| 1082 int nargs; | |
| 1083 register Lisp_Object *args; | |
| 1084 { | |
|
1683
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1085 Lisp_Object buffer, name, program, proc, current_dir, tem; |
| 578 | 1086 #ifdef VMS |
| 1087 register unsigned char *new_argv; | |
| 1088 int len; | |
| 1089 #else | |
| 1090 register unsigned char **new_argv; | |
| 1091 #endif | |
| 1092 register int i; | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1093 int count = specpdl_ptr - specpdl; |
| 578 | 1094 |
| 1095 buffer = args[1]; | |
| 1096 if (!NILP (buffer)) | |
| 1097 buffer = Fget_buffer_create (buffer); | |
| 1098 | |
|
1683
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1099 /* Make sure that the child will be able to chdir to the current |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1100 buffer's current directory, or its unhandled equivalent. We |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1101 can't just have the child check for an error when it does the |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1102 chdir, since it's in a vfork. |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1103 |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1104 We have to GCPRO around this because Fexpand_file_name and |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1105 Funhandled_file_name_directory might call a file name handling |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1106 function. The argument list is protected by the caller, so all |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1107 we really have to worry about is buffer. */ |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1108 { |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1109 struct gcpro gcpro1, gcpro2; |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1110 |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1111 current_dir = current_buffer->directory; |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1112 |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1113 GCPRO2 (buffer, current_dir); |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1114 |
|
10744
54a76e0b97ec
(Fstart_process): Make process marker point into proc buf.
Richard M. Stallman <rms@gnu.org>
parents:
10548
diff
changeset
|
1115 current_dir |
|
54a76e0b97ec
(Fstart_process): Make process marker point into proc buf.
Richard M. Stallman <rms@gnu.org>
parents:
10548
diff
changeset
|
1116 = expand_and_dir_to_file (Funhandled_file_name_directory (current_dir), |
|
54a76e0b97ec
(Fstart_process): Make process marker point into proc buf.
Richard M. Stallman <rms@gnu.org>
parents:
10548
diff
changeset
|
1117 Qnil); |
|
1683
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1118 if (NILP (Ffile_accessible_directory_p (current_dir))) |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1119 report_file_error ("Setting current directory", |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1120 Fcons (current_buffer->directory, Qnil)); |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1121 |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1122 UNGCPRO; |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1123 } |
|
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1124 |
| 578 | 1125 name = args[0]; |
| 1126 CHECK_STRING (name, 0); | |
| 1127 | |
| 1128 program = args[2]; | |
| 1129 | |
| 1130 CHECK_STRING (program, 2); | |
| 1131 | |
| 1132 #ifdef VMS | |
| 1133 /* Make a one member argv with all args concatenated | |
| 1134 together separated by a blank. */ | |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
1135 len = STRING_BYTES (XSTRING (program)) + 2; |
| 578 | 1136 for (i = 3; i < nargs; i++) |
| 1137 { | |
| 1138 tem = args[i]; | |
| 1139 CHECK_STRING (tem, i); | |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
1140 len += STRING_BYTES (XSTRING (tem)) + 1; /* count the blank */ |
| 578 | 1141 } |
| 1142 new_argv = (unsigned char *) alloca (len); | |
| 1143 strcpy (new_argv, XSTRING (program)->data); | |
| 1144 for (i = 3; i < nargs; i++) | |
| 1145 { | |
| 1146 tem = args[i]; | |
| 1147 CHECK_STRING (tem, i); | |
| 1148 strcat (new_argv, " "); | |
| 1149 strcat (new_argv, XSTRING (tem)->data); | |
| 1150 } | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1151 /* Need to add code here to check for program existence on VMS */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1152 |
| 578 | 1153 #else /* not VMS */ |
| 1154 new_argv = (unsigned char **) alloca ((nargs - 1) * sizeof (char *)); | |
| 1155 | |
|
6390
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1156 /* If program file name is not absolute, search our path for it */ |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1157 if (!IS_DIRECTORY_SEP (XSTRING (program)->data[0]) |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1158 && !(XSTRING (program)->size > 1 |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1159 && IS_DEVICE_SEP (XSTRING (program)->data[1]))) |
|
6390
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1160 { |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1161 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1162 |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1163 tem = Qnil; |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1164 GCPRO4 (name, program, buffer, current_dir); |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1165 openp (Vexec_path, program, EXEC_SUFFIXES, &tem, 1); |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1166 UNGCPRO; |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1167 if (NILP (tem)) |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1168 report_file_error ("Searching for program", Fcons (program, Qnil)); |
|
12648
98aba238cf62
(Fstart_process): Don't expand the file name before trying openp.
Richard M. Stallman <rms@gnu.org>
parents:
12541
diff
changeset
|
1169 tem = Fexpand_file_name (tem, Qnil); |
|
6390
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1170 new_argv[0] = XSTRING (tem)->data; |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1171 } |
|
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1172 else |
|
12491
4ad7be34ece1
(Fstart_process): Expand PROGRAM.
Richard M. Stallman <rms@gnu.org>
parents:
12378
diff
changeset
|
1173 { |
|
4ad7be34ece1
(Fstart_process): Expand PROGRAM.
Richard M. Stallman <rms@gnu.org>
parents:
12378
diff
changeset
|
1174 if (!NILP (Ffile_directory_p (program))) |
|
4ad7be34ece1
(Fstart_process): Expand PROGRAM.
Richard M. Stallman <rms@gnu.org>
parents:
12378
diff
changeset
|
1175 error ("Specified program for new process is a directory"); |
|
4ad7be34ece1
(Fstart_process): Expand PROGRAM.
Richard M. Stallman <rms@gnu.org>
parents:
12378
diff
changeset
|
1176 |
|
4ad7be34ece1
(Fstart_process): Expand PROGRAM.
Richard M. Stallman <rms@gnu.org>
parents:
12378
diff
changeset
|
1177 new_argv[0] = XSTRING (program)->data; |
|
4ad7be34ece1
(Fstart_process): Expand PROGRAM.
Richard M. Stallman <rms@gnu.org>
parents:
12378
diff
changeset
|
1178 } |
|
6390
9f8ce71435de
(Fstart_process): GCPRO some things.
Karl Heuer <kwzh@gnu.org>
parents:
6345
diff
changeset
|
1179 |
| 578 | 1180 for (i = 3; i < nargs; i++) |
| 1181 { | |
| 1182 tem = args[i]; | |
| 1183 CHECK_STRING (tem, i); | |
| 1184 new_argv[i - 2] = XSTRING (tem)->data; | |
| 1185 } | |
| 1186 new_argv[i - 2] = 0; | |
| 1187 #endif /* not VMS */ | |
| 1188 | |
| 1189 proc = make_process (name); | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1190 /* If an error occurs and we can't start the process, we want to |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1191 remove it from the process list. This means that each error |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1192 check in create_process doesn't need to call remove_process |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1193 itself; it's all taken care of here. */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1194 record_unwind_protect (start_process_unwind, proc); |
| 578 | 1195 |
| 1196 XPROCESS (proc)->childp = Qt; | |
| 1197 XPROCESS (proc)->command_channel_p = Qnil; | |
| 1198 XPROCESS (proc)->buffer = buffer; | |
| 1199 XPROCESS (proc)->sentinel = Qnil; | |
| 1200 XPROCESS (proc)->filter = Qnil; | |
| 1201 XPROCESS (proc)->command = Flist (nargs - 2, args + 2); | |
| 1202 | |
|
10744
54a76e0b97ec
(Fstart_process): Make process marker point into proc buf.
Richard M. Stallman <rms@gnu.org>
parents:
10548
diff
changeset
|
1203 /* Make the process marker point into the process buffer (if any). */ |
|
54a76e0b97ec
(Fstart_process): Make process marker point into proc buf.
Richard M. Stallman <rms@gnu.org>
parents:
10548
diff
changeset
|
1204 if (!NILP (buffer)) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
1205 set_marker_both (XPROCESS (proc)->mark, buffer, |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
1206 BUF_ZV (XBUFFER (buffer)), |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
1207 BUF_ZV_BYTE (XBUFFER (buffer))); |
|
10744
54a76e0b97ec
(Fstart_process): Make process marker point into proc buf.
Richard M. Stallman <rms@gnu.org>
parents:
10548
diff
changeset
|
1208 |
|
22019
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1209 { |
|
22614
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1210 /* Decide coding systems for communicating with the process. Here |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1211 we don't setup the structure coding_system nor pay attention to |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1212 unibyte mode. They are done in create_process. */ |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1213 |
|
22019
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1214 /* Qt denotes we have not yet called Ffind_operation_coding_system. */ |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1215 Lisp_Object coding_systems = Qt; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1216 Lisp_Object val, *args2; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1217 struct gcpro gcpro1; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1218 |
|
22614
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1219 val = Vcoding_system_for_read; |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1220 if (NILP (val)) |
|
22019
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1221 { |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1222 args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof *args2); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1223 args2[0] = Qstart_process; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1224 for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1225 GCPRO1 (proc); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1226 coding_systems = Ffind_operation_coding_system (nargs + 1, args2); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1227 UNGCPRO; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1228 if (CONSP (coding_systems)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1229 val = XCONS (coding_systems)->car; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1230 else if (CONSP (Vdefault_process_coding_system)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1231 val = XCONS (Vdefault_process_coding_system)->car; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1232 } |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1233 XPROCESS (proc)->decode_coding_system = val; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1234 |
|
22614
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1235 val = Vcoding_system_for_write; |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1236 if (NILP (val)) |
|
22019
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1237 { |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1238 if (EQ (coding_systems, Qt)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1239 { |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1240 args2 = (Lisp_Object *) alloca ((nargs + 1) * sizeof args2); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1241 args2[0] = Qstart_process; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1242 for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1243 GCPRO1 (proc); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1244 coding_systems = Ffind_operation_coding_system (nargs + 1, args2); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1245 UNGCPRO; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1246 } |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1247 if (CONSP (coding_systems)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1248 val = XCONS (coding_systems)->cdr; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1249 else if (CONSP (Vdefault_process_coding_system)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1250 val = XCONS (Vdefault_process_coding_system)->cdr; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1251 } |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1252 XPROCESS (proc)->encode_coding_system = val; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
1253 } |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
1254 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
1255 XPROCESS (proc)->decoding_buf = make_uninit_string (0); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1256 XPROCESS (proc)->decoding_carryover = make_number (0); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
1257 XPROCESS (proc)->encoding_buf = make_uninit_string (0); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1258 XPROCESS (proc)->encoding_carryover = make_number (0); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
1259 |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
1260 XPROCESS (proc)->inherit_coding_system_flag |
|
21848
050ea21cec87
(Fset_process_inherit_coding_system_flag, Fstart_process):
Richard M. Stallman <rms@gnu.org>
parents:
21798
diff
changeset
|
1261 = (NILP (buffer) || !inherit_process_coding_system |
|
050ea21cec87
(Fset_process_inherit_coding_system_flag, Fstart_process):
Richard M. Stallman <rms@gnu.org>
parents:
21798
diff
changeset
|
1262 ? Qnil : Qt); |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
1263 |
|
20382
dbad9367d232
(create_process, deactivate_process, close_process_descs):
Andreas Schwab <schwab@suse.de>
parents:
20225
diff
changeset
|
1264 create_process (proc, (char **) new_argv, current_dir); |
| 578 | 1265 |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1266 return unbind_to (count, proc); |
| 578 | 1267 } |
| 1268 | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1269 /* This function is the unwind_protect form for Fstart_process. If |
| 14036 | 1270 PROC doesn't have its pid set, then we know someone has signaled |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1271 an error and the process wasn't started successfully, so we should |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1272 remove it from the process list. */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1273 static Lisp_Object |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1274 start_process_unwind (proc) |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1275 Lisp_Object proc; |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1276 { |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
1277 if (!PROCESSP (proc)) |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1278 abort (); |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1279 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1280 /* Was PROC started successfully? */ |
|
3685
47d7fda8a609
(start_process_unwind): Use XINT.
Richard M. Stallman <rms@gnu.org>
parents:
3666
diff
changeset
|
1281 if (XINT (XPROCESS (proc)->pid) <= 0) |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1282 remove_process (proc); |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1283 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1284 return Qnil; |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1285 } |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1286 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
1287 |
| 578 | 1288 SIGTYPE |
| 1289 create_process_1 (signo) | |
| 1290 int signo; | |
| 1291 { | |
|
16116
80a67b8f39e9
(create_process_1, sigchld_handler) [POSIX_SIGNALS]:
Richard M. Stallman <rms@gnu.org>
parents:
16076
diff
changeset
|
1292 #if defined (USG) && !defined (POSIX_SIGNALS) |
| 578 | 1293 /* USG systems forget handlers when they are used; |
| 1294 must reestablish each time */ | |
| 1295 signal (signo, create_process_1); | |
| 1296 #endif /* USG */ | |
| 1297 } | |
| 1298 | |
| 1299 #if 0 /* This doesn't work; see the note before sigchld_handler. */ | |
| 1300 #ifdef USG | |
| 1301 #ifdef SIGCHLD | |
| 1302 /* Mimic blocking of signals on system V, which doesn't really have it. */ | |
| 1303 | |
| 1304 /* Nonzero means we got a SIGCHLD when it was supposed to be blocked. */ | |
| 1305 int sigchld_deferred; | |
| 1306 | |
| 1307 SIGTYPE | |
| 1308 create_process_sigchld () | |
| 1309 { | |
| 1310 signal (SIGCHLD, create_process_sigchld); | |
| 1311 | |
| 1312 sigchld_deferred = 1; | |
| 1313 } | |
| 1314 #endif | |
| 1315 #endif | |
| 1316 #endif | |
| 1317 | |
| 1318 #ifndef VMS /* VMS version of this function is in vmsproc.c. */ | |
|
20382
dbad9367d232
(create_process, deactivate_process, close_process_descs):
Andreas Schwab <schwab@suse.de>
parents:
20225
diff
changeset
|
1319 void |
|
1683
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1320 create_process (process, new_argv, current_dir) |
| 578 | 1321 Lisp_Object process; |
| 1322 char **new_argv; | |
|
1683
a0a41de51400
Give subprocess creation a way to find a valid current directory
Jim Blandy <jimb@redhat.com>
parents:
1655
diff
changeset
|
1323 Lisp_Object current_dir; |
| 578 | 1324 { |
|
11926
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
1325 int pid, inchannel, outchannel; |
| 578 | 1326 int sv[2]; |
|
13709
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1327 #ifdef POSIX_SIGNALS |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1328 sigset_t procmask; |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1329 sigset_t blocked; |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1330 struct sigaction sigint_action; |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1331 struct sigaction sigquit_action; |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1332 #ifdef AIX |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1333 struct sigaction sighup_action; |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1334 #endif |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1335 #else /* !POSIX_SIGNALS */ |
| 578 | 1336 #ifdef SIGCHLD |
| 1337 SIGTYPE (*sigchld)(); | |
| 1338 #endif | |
|
13709
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1339 #endif /* !POSIX_SIGNALS */ |
|
11926
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
1340 /* Use volatile to protect variables from being clobbered by longjmp. */ |
|
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
1341 volatile int forkin, forkout; |
|
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
1342 volatile int pty_flag = 0; |
| 578 | 1343 extern char **environ; |
|
22614
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1344 Lisp_Object buffer = XPROCESS (process)->buffer; |
| 578 | 1345 |
| 1346 inchannel = outchannel = -1; | |
| 1347 | |
| 1348 #ifdef HAVE_PTYS | |
|
7748
9a9c8372af80
(create_process): Get a pty for any non-nil Vprocess_connection_type value.
Richard M. Stallman <rms@gnu.org>
parents:
7605
diff
changeset
|
1349 if (!NILP (Vprocess_connection_type)) |
| 578 | 1350 outchannel = inchannel = allocate_pty (); |
| 1351 | |
| 1352 if (inchannel >= 0) | |
| 1353 { | |
| 1354 #ifndef USG | |
| 1355 /* On USG systems it does not work to open the pty's tty here | |
| 1356 and then close and reopen it in the child. */ | |
| 1357 #ifdef O_NOCTTY | |
| 1358 /* Don't let this terminal become our controlling terminal | |
| 1359 (in case we don't have one). */ | |
| 1360 forkout = forkin = open (pty_name, O_RDWR | O_NOCTTY, 0); | |
| 1361 #else | |
| 1362 forkout = forkin = open (pty_name, O_RDWR, 0); | |
| 1363 #endif | |
| 1364 if (forkin < 0) | |
| 1365 report_file_error ("Opening pty", Qnil); | |
| 1366 #else | |
| 1367 forkin = forkout = -1; | |
| 1368 #endif /* not USG */ | |
| 1369 pty_flag = 1; | |
| 1370 } | |
| 1371 else | |
| 1372 #endif /* HAVE_PTYS */ | |
| 1373 #ifdef SKTPAIR | |
| 1374 { | |
| 1375 if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) < 0) | |
| 1376 report_file_error ("Opening socketpair", Qnil); | |
| 1377 outchannel = inchannel = sv[0]; | |
| 1378 forkout = forkin = sv[1]; | |
| 1379 } | |
| 1380 #else /* not SKTPAIR */ | |
| 1381 { | |
|
25129
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1382 int tem; |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1383 tem = pipe (sv); |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1384 if (tem < 0) |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1385 report_file_error ("Creating pipe", Qnil); |
| 578 | 1386 inchannel = sv[0]; |
| 1387 forkout = sv[1]; | |
|
25129
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1388 tem = pipe (sv); |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1389 if (tem < 0) |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1390 { |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1391 close (inchannel); |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1392 close (forkout); |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1393 report_file_error ("Creating pipe", Qnil); |
|
4f3c8f1cec96
(create_process): Detect failure of `pipe'.
Karl Heuer <kwzh@gnu.org>
parents:
25009
diff
changeset
|
1394 } |
| 578 | 1395 outchannel = sv[1]; |
| 1396 forkin = sv[0]; | |
| 1397 } | |
| 1398 #endif /* not SKTPAIR */ | |
| 1399 | |
| 1400 #if 0 | |
| 1401 /* Replaced by close_process_descs */ | |
| 1402 set_exclusive_use (inchannel); | |
| 1403 set_exclusive_use (outchannel); | |
| 1404 #endif | |
| 1405 | |
| 1406 /* Stride people say it's a mystery why this is needed | |
| 1407 as well as the O_NDELAY, but that it fails without this. */ | |
| 1408 #if defined (STRIDE) || (defined (pfa) && defined (HAVE_PTYS)) | |
| 1409 { | |
| 1410 int one = 1; | |
| 1411 ioctl (inchannel, FIONBIO, &one); | |
| 1412 } | |
| 1413 #endif | |
| 1414 | |
| 1415 #ifdef O_NONBLOCK | |
| 1416 fcntl (inchannel, F_SETFL, O_NONBLOCK); | |
|
14405
4aa693528ee3
(create_process): Set outchannel to be non-blocking.
Richard M. Stallman <rms@gnu.org>
parents:
14404
diff
changeset
|
1417 fcntl (outchannel, F_SETFL, O_NONBLOCK); |
| 578 | 1418 #else |
| 1419 #ifdef O_NDELAY | |
| 1420 fcntl (inchannel, F_SETFL, O_NDELAY); | |
|
14405
4aa693528ee3
(create_process): Set outchannel to be non-blocking.
Richard M. Stallman <rms@gnu.org>
parents:
14404
diff
changeset
|
1421 fcntl (outchannel, F_SETFL, O_NDELAY); |
| 578 | 1422 #endif |
| 1423 #endif | |
| 1424 | |
| 1425 /* Record this as an active process, with its channels. | |
| 1426 As a result, child_setup will close Emacs's side of the pipes. */ | |
| 1427 chan_process[inchannel] = process; | |
|
9277
21f6120be5ba
(make_process, create_process, Fopen_network_stream, deactivate_process,
Karl Heuer <kwzh@gnu.org>
parents:
9115
diff
changeset
|
1428 XSETINT (XPROCESS (process)->infd, inchannel); |
|
21f6120be5ba
(make_process, create_process, Fopen_network_stream, deactivate_process,
Karl Heuer <kwzh@gnu.org>
parents:
9115
diff
changeset
|
1429 XSETINT (XPROCESS (process)->outfd, outchannel); |
| 578 | 1430 /* Record the tty descriptor used in the subprocess. */ |
| 1431 if (forkin < 0) | |
| 1432 XPROCESS (process)->subtty = Qnil; | |
| 1433 else | |
|
9318
a14cc1712337
(make_process, list_processes_1, create_process, Faccept_process_output,
Karl Heuer <kwzh@gnu.org>
parents:
9277
diff
changeset
|
1434 XSETFASTINT (XPROCESS (process)->subtty, forkin); |
| 578 | 1435 XPROCESS (process)->pty_flag = (pty_flag ? Qt : Qnil); |
| 1436 XPROCESS (process)->status = Qrun; | |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
1437 if (!proc_decode_coding_system[inchannel]) |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
1438 proc_decode_coding_system[inchannel] |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
1439 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
1440 setup_coding_system (XPROCESS (process)->decode_coding_system, |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
1441 proc_decode_coding_system[inchannel]); |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
1442 if (!proc_encode_coding_system[outchannel]) |
| 22848 | 1443 proc_encode_coding_system[outchannel] |
| 1444 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
1445 setup_coding_system (XPROCESS (process)->encode_coding_system, |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
1446 proc_encode_coding_system[outchannel]); |
| 578 | 1447 |
|
22614
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1448 if (!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters) |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1449 || (NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters))) |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1450 { |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1451 /* In unibyte mode, character code conversion should not take |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1452 place but EOL conversion should. So, setup raw-text or one |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1453 of the subsidiary according to the information just setup. */ |
|
24933
b43a8099ffb7
(create_process): If the output goes to a unibyte
Richard M. Stallman <rms@gnu.org>
parents:
24867
diff
changeset
|
1454 if (!NILP (XPROCESS (process)->decode_coding_system)) |
|
22614
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1455 setup_raw_text_coding_system (proc_decode_coding_system[inchannel]); |
|
24933
b43a8099ffb7
(create_process): If the output goes to a unibyte
Richard M. Stallman <rms@gnu.org>
parents:
24867
diff
changeset
|
1456 if (!NILP (XPROCESS (process)->encode_coding_system)) |
|
22864
da331c0f1092
(create_process): For outchannel, set up
Richard M. Stallman <rms@gnu.org>
parents:
22848
diff
changeset
|
1457 setup_raw_text_coding_system (proc_encode_coding_system[outchannel]); |
|
22614
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1458 } |
|
83990ce5f58c
(Fstart_process): Check process-coding-system-alist
Kenichi Handa <handa@m17n.org>
parents:
22536
diff
changeset
|
1459 |
|
20225
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1460 if (CODING_REQUIRE_ENCODING (proc_encode_coding_system[outchannel])) |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1461 { |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1462 /* Here we encode arguments by the coding system used for |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1463 sending data to the process. We don't support using |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1464 different coding systems for encoding arguments and for |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1465 encoding data sent to the process. */ |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1466 struct gcpro gcpro1; |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1467 int i = 1; |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1468 struct coding_system *coding = proc_encode_coding_system[outchannel]; |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1469 |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1470 coding->mode |= CODING_MODE_LAST_BLOCK; |
|
20225
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1471 GCPRO1 (process); |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1472 while (new_argv[i] != 0) |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1473 { |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1474 int len = strlen (new_argv[i]); |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1475 int size = encoding_buffer_size (coding, len); |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1476 unsigned char *buf = (unsigned char *) alloca (size); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1477 |
|
21950
c66b85d05dd8
(create_process): Add cast when calling encode_coding
Richard M. Stallman <rms@gnu.org>
parents:
21848
diff
changeset
|
1478 encode_coding (coding, (unsigned char *)new_argv[i], buf, len, size); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1479 buf[coding->produced] = 0; |
|
20225
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1480 /* We don't have to free new_argv[i] because it points to a |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1481 Lisp string given as an argument to `start-process'. */ |
|
21950
c66b85d05dd8
(create_process): Add cast when calling encode_coding
Richard M. Stallman <rms@gnu.org>
parents:
21848
diff
changeset
|
1482 new_argv[i++] = (char *) buf; |
|
20225
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1483 } |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1484 UNGCPRO; |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
1485 coding->mode &= ~CODING_MODE_LAST_BLOCK; |
|
20225
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1486 } |
|
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
1487 |
| 578 | 1488 /* Delay interrupts until we have a chance to store |
| 1489 the new fork's pid in its process structure */ | |
|
13709
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1490 #ifdef POSIX_SIGNALS |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1491 sigemptyset (&blocked); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1492 #ifdef SIGCHLD |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1493 sigaddset (&blocked, SIGCHLD); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1494 #endif |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1495 #ifdef HAVE_VFORK |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1496 /* On many hosts (e.g. Solaris 2.4), if a vforked child calls `signal', |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1497 this sets the parent's signal handlers as well as the child's. |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1498 So delay all interrupts whose handlers the child might munge, |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1499 and record the current handlers so they can be restored later. */ |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1500 sigaddset (&blocked, SIGINT ); sigaction (SIGINT , 0, &sigint_action ); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1501 sigaddset (&blocked, SIGQUIT); sigaction (SIGQUIT, 0, &sigquit_action); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1502 #ifdef AIX |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1503 sigaddset (&blocked, SIGHUP ); sigaction (SIGHUP , 0, &sighup_action ); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1504 #endif |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1505 #endif /* HAVE_VFORK */ |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1506 sigprocmask (SIG_BLOCK, &blocked, &procmask); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1507 #else /* !POSIX_SIGNALS */ |
| 578 | 1508 #ifdef SIGCHLD |
| 1509 #ifdef BSD4_1 | |
| 1510 sighold (SIGCHLD); | |
| 1511 #else /* not BSD4_1 */ | |
|
16220
02044b05d8e0
Replaced symbol BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
16206
diff
changeset
|
1512 #if defined (BSD_SYSTEM) || defined (UNIPLUS) || defined (HPUX) |
| 578 | 1513 sigsetmask (sigmask (SIGCHLD)); |
| 1514 #else /* ordinary USG */ | |
| 1515 #if 0 | |
| 1516 sigchld_deferred = 0; | |
| 1517 sigchld = signal (SIGCHLD, create_process_sigchld); | |
| 1518 #endif | |
| 1519 #endif /* ordinary USG */ | |
| 1520 #endif /* not BSD4_1 */ | |
| 1521 #endif /* SIGCHLD */ | |
|
13709
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1522 #endif /* !POSIX_SIGNALS */ |
| 578 | 1523 |
|
7893
e54617027a47
(create_process): Set input_wait_mask before forking.
Karl Heuer <kwzh@gnu.org>
parents:
7884
diff
changeset
|
1524 FD_SET (inchannel, &input_wait_mask); |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
1525 FD_SET (inchannel, &non_keyboard_wait_mask); |
|
7893
e54617027a47
(create_process): Set input_wait_mask before forking.
Karl Heuer <kwzh@gnu.org>
parents:
7884
diff
changeset
|
1526 if (inchannel > max_process_desc) |
|
e54617027a47
(create_process): Set input_wait_mask before forking.
Karl Heuer <kwzh@gnu.org>
parents:
7884
diff
changeset
|
1527 max_process_desc = inchannel; |
|
e54617027a47
(create_process): Set input_wait_mask before forking.
Karl Heuer <kwzh@gnu.org>
parents:
7884
diff
changeset
|
1528 |
| 578 | 1529 /* Until we store the proper pid, enable sigchld_handler |
| 1530 to recognize an unknown pid as standing for this process. | |
| 1531 It is very important not to let this `marker' value stay | |
| 1532 in the table after this function has returned; if it does | |
| 1533 it might cause call-process to hang and subsequent asynchronous | |
| 1534 processes to get their return values scrambled. */ | |
| 1535 XSETINT (XPROCESS (process)->pid, -1); | |
| 1536 | |
| 16780 | 1537 BLOCK_INPUT; |
| 1538 | |
| 578 | 1539 { |
| 1540 /* child_setup must clobber environ on systems with true vfork. | |
| 1541 Protect it from permanent change. */ | |
| 1542 char **save_environ = environ; | |
| 1543 | |
|
21049
01e626b0a624
(Vdefault_file_name_coding_system): Extern it.
Kenichi Handa <handa@m17n.org>
parents:
20715
diff
changeset
|
1544 current_dir = ENCODE_FILE (current_dir); |
|
19837
3bee81323f73
(create_process): Encode the new current dir.
Richard M. Stallman <rms@gnu.org>
parents:
19642
diff
changeset
|
1545 |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1546 #ifndef WINDOWSNT |
| 578 | 1547 pid = vfork (); |
| 1548 if (pid == 0) | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1549 #endif /* not WINDOWSNT */ |
| 578 | 1550 { |
| 1551 int xforkin = forkin; | |
| 1552 int xforkout = forkout; | |
| 1553 | |
| 1554 #if 0 /* This was probably a mistake--it duplicates code later on, | |
| 1555 but fails to handle all the cases. */ | |
| 1556 /* Make sure SIGCHLD is not blocked in the child. */ | |
| 1557 sigsetmask (SIGEMPTYMASK); | |
| 1558 #endif | |
| 1559 | |
| 1560 /* Make the pty be the controlling terminal of the process. */ | |
| 1561 #ifdef HAVE_PTYS | |
| 1562 /* First, disconnect its current controlling terminal. */ | |
| 1563 #ifdef HAVE_SETSID | |
|
7266
f87808bd90e9
(create_process): Undo April 19 setsid change.
Richard M. Stallman <rms@gnu.org>
parents:
7238
diff
changeset
|
1564 /* We tried doing setsid only if pty_flag, but it caused |
|
f87808bd90e9
(create_process): Undo April 19 setsid change.
Richard M. Stallman <rms@gnu.org>
parents:
7238
diff
changeset
|
1565 process_set_signal to fail on SGI when using a pipe. */ |
|
f87808bd90e9
(create_process): Undo April 19 setsid change.
Richard M. Stallman <rms@gnu.org>
parents:
7238
diff
changeset
|
1566 setsid (); |
|
1030
9934251d8219
(WCOREDUMP): Define only if not defined.
Richard M. Stallman <rms@gnu.org>
parents:
1012
diff
changeset
|
1567 /* Make the pty's terminal the controlling terminal. */ |
|
3023
cfd999700613
(create_process): Ignore retval from TIOCSTTY.
Richard M. Stallman <rms@gnu.org>
parents:
2961
diff
changeset
|
1568 if (pty_flag) |
|
6975
b7411e378b65
(create_process): Call setsid only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
6947
diff
changeset
|
1569 { |
|
b7411e378b65
(create_process): Call setsid only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
6947
diff
changeset
|
1570 #ifdef TIOCSCTTY |
|
b7411e378b65
(create_process): Call setsid only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
6947
diff
changeset
|
1571 /* We ignore the return value |
|
b7411e378b65
(create_process): Call setsid only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
6947
diff
changeset
|
1572 because faith@cs.unc.edu says that is necessary on Linux. */ |
|
b7411e378b65
(create_process): Call setsid only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
6947
diff
changeset
|
1573 ioctl (xforkin, TIOCSCTTY, 0); |
|
1030
9934251d8219
(WCOREDUMP): Define only if not defined.
Richard M. Stallman <rms@gnu.org>
parents:
1012
diff
changeset
|
1574 #endif |
|
6975
b7411e378b65
(create_process): Call setsid only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
6947
diff
changeset
|
1575 } |
| 578 | 1576 #else /* not HAVE_SETSID */ |
|
5181
31874690939f
(create_process): Do setpgrp for USG regardless of IRIX.
Richard M. Stallman <rms@gnu.org>
parents:
5161
diff
changeset
|
1577 #ifdef USG |
|
5347
21bffe027a7d
(create_process) [NTTYDISC]: Set the tty line discipline.
Richard M. Stallman <rms@gnu.org>
parents:
5332
diff
changeset
|
1578 /* It's very important to call setpgrp here and no time |
| 578 | 1579 afterwards. Otherwise, we lose our controlling tty which |
| 1580 is set when we open the pty. */ | |
| 1581 setpgrp (); | |
| 1582 #endif /* USG */ | |
| 1583 #endif /* not HAVE_SETSID */ | |
|
7116
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1584 #if defined (HAVE_TERMIOS) && defined (LDISC1) |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1585 if (pty_flag && xforkin >= 0) |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1586 { |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1587 struct termios t; |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1588 tcgetattr (xforkin, &t); |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1589 t.c_lflag = LDISC1; |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1590 if (tcsetattr (xforkin, TCSANOW, &t) < 0) |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1591 write (1, "create_process/tcsetattr LDISC1 failed\n", 39); |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1592 } |
|
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1593 #else |
|
6947
c5f990fad6bb
(create_process): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
6928
diff
changeset
|
1594 #if defined (NTTYDISC) && defined (TIOCSETD) |
|
6393
7de1d288460e
(create_process): Skip the ioctl if fd is -1.
Karl Heuer <kwzh@gnu.org>
parents:
6390
diff
changeset
|
1595 if (pty_flag && xforkin >= 0) |
|
5548
36d2fd17f833
(create_process): Set line discipline only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
5543
diff
changeset
|
1596 { |
|
36d2fd17f833
(create_process): Set line discipline only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
5543
diff
changeset
|
1597 /* Use new line discipline. */ |
|
36d2fd17f833
(create_process): Set line discipline only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
5543
diff
changeset
|
1598 int ldisc = NTTYDISC; |
|
7605
53186c2698e5
(create_process): Don't complain about error from TIOCSETD.
Richard M. Stallman <rms@gnu.org>
parents:
7486
diff
changeset
|
1599 ioctl (xforkin, TIOCSETD, &ldisc); |
|
5548
36d2fd17f833
(create_process): Set line discipline only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
5543
diff
changeset
|
1600 } |
|
5347
21bffe027a7d
(create_process) [NTTYDISC]: Set the tty line discipline.
Richard M. Stallman <rms@gnu.org>
parents:
5332
diff
changeset
|
1601 #endif |
|
7116
d35b11eed89f
(create_process) [HAVE_TERMIOS && LDISC1]: Use tcsetattr.
Karl Heuer <kwzh@gnu.org>
parents:
7059
diff
changeset
|
1602 #endif |
| 578 | 1603 #ifdef TIOCNOTTY |
| 1604 /* In 4.3BSD, the TIOCSPGRP bug has been fixed, and now you | |
| 1605 can do TIOCSPGRP only to the process's controlling tty. */ | |
| 1606 if (pty_flag) | |
| 1607 { | |
| 1608 /* I wonder: would just ioctl (0, TIOCNOTTY, 0) work here? | |
| 1609 I can't test it since I don't have 4.3. */ | |
| 1610 int j = open ("/dev/tty", O_RDWR, 0); | |
| 1611 ioctl (j, TIOCNOTTY, 0); | |
| 1612 close (j); | |
|
3826
647bef18618f
Changes for Irix 4.0, tested this time:
Jim Blandy <jimb@redhat.com>
parents:
3810
diff
changeset
|
1613 #ifndef USG |
| 578 | 1614 /* In order to get a controlling terminal on some versions |
| 1615 of BSD, it is necessary to put the process in pgrp 0 | |
| 1616 before it opens the terminal. */ | |
|
16127
8d6d35b486c0
(create_process): Test HAVE_SETPGID for using setpgid.
Richard M. Stallman <rms@gnu.org>
parents:
16116
diff
changeset
|
1617 #ifdef HAVE_SETPGID |
|
9882
ccc5562a7194
(create_process) [OSF1]: Use setpgid, not setpgrp.
Richard M. Stallman <rms@gnu.org>
parents:
9793
diff
changeset
|
1618 setpgid (0, 0); |
|
ccc5562a7194
(create_process) [OSF1]: Use setpgid, not setpgrp.
Richard M. Stallman <rms@gnu.org>
parents:
9793
diff
changeset
|
1619 #else |
| 578 | 1620 setpgrp (0, 0); |
| 1621 #endif | |
|
9882
ccc5562a7194
(create_process) [OSF1]: Use setpgid, not setpgrp.
Richard M. Stallman <rms@gnu.org>
parents:
9793
diff
changeset
|
1622 #endif |
| 578 | 1623 } |
| 1624 #endif /* TIOCNOTTY */ | |
| 1625 | |
|
16076
5d1e0290bbd0
(create_process): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
16058
diff
changeset
|
1626 #if !defined (RTU) && !defined (UNIPLUS) && !defined (DONT_REOPEN_PTY) |
| 578 | 1627 /*** There is a suggestion that this ought to be a |
|
16076
5d1e0290bbd0
(create_process): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
16058
diff
changeset
|
1628 conditional on TIOCSPGRP, |
|
5d1e0290bbd0
(create_process): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
16058
diff
changeset
|
1629 or !(defined (HAVE_SETSID) && defined (TIOCSCTTY)). |
|
5d1e0290bbd0
(create_process): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
16058
diff
changeset
|
1630 Trying the latter gave the wrong results on Debian GNU/Linux 1.1; |
|
5d1e0290bbd0
(create_process): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
16058
diff
changeset
|
1631 that system does seem to need this code, even though |
|
5d1e0290bbd0
(create_process): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
16058
diff
changeset
|
1632 both HAVE_SETSID and TIOCSCTTY are defined. */ |
| 578 | 1633 /* Now close the pty (if we had it open) and reopen it. |
| 1634 This makes the pty the controlling terminal of the subprocess. */ | |
| 1635 if (pty_flag) | |
| 1636 { | |
|
5240
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
1637 #ifdef SET_CHILD_PTY_PGRP |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
1638 int pgrp = getpid (); |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
1639 #endif |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
1640 |
| 578 | 1641 /* I wonder if close (open (pty_name, ...)) would work? */ |
| 1642 if (xforkin >= 0) | |
| 1643 close (xforkin); | |
| 1644 xforkout = xforkin = open (pty_name, O_RDWR, 0); | |
| 1645 | |
|
11514
321726163a65
(create_process): Don't abort if can't reopen
Richard M. Stallman <rms@gnu.org>
parents:
11376
diff
changeset
|
1646 if (xforkin < 0) |
|
321726163a65
(create_process): Don't abort if can't reopen
Richard M. Stallman <rms@gnu.org>
parents:
11376
diff
changeset
|
1647 { |
|
321726163a65
(create_process): Don't abort if can't reopen
Richard M. Stallman <rms@gnu.org>
parents:
11376
diff
changeset
|
1648 write (1, "Couldn't open the pty terminal ", 31); |
|
321726163a65
(create_process): Don't abort if can't reopen
Richard M. Stallman <rms@gnu.org>
parents:
11376
diff
changeset
|
1649 write (1, pty_name, strlen (pty_name)); |
|
321726163a65
(create_process): Don't abort if can't reopen
Richard M. Stallman <rms@gnu.org>
parents:
11376
diff
changeset
|
1650 write (1, "\n", 1); |
|
321726163a65
(create_process): Don't abort if can't reopen
Richard M. Stallman <rms@gnu.org>
parents:
11376
diff
changeset
|
1651 _exit (1); |
|
321726163a65
(create_process): Don't abort if can't reopen
Richard M. Stallman <rms@gnu.org>
parents:
11376
diff
changeset
|
1652 } |
|
321726163a65
(create_process): Don't abort if can't reopen
Richard M. Stallman <rms@gnu.org>
parents:
11376
diff
changeset
|
1653 |
|
5240
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
1654 #ifdef SET_CHILD_PTY_PGRP |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
1655 ioctl (xforkin, TIOCSPGRP, &pgrp); |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
1656 ioctl (xforkout, TIOCSPGRP, &pgrp); |
|
eed870591987
(Fprocess_status): Use get_process, not Fget_process.
Richard M. Stallman <rms@gnu.org>
parents:
5239
diff
changeset
|
1657 #endif |
| 578 | 1658 } |
|
16076
5d1e0290bbd0
(create_process): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
16058
diff
changeset
|
1659 #endif /* not UNIPLUS and not RTU and not DONT_REOPEN_PTY */ |
|
15368
6229fb866493
(create_process): Add DONT_OPEN_PTY conditional.
Richard M. Stallman <rms@gnu.org>
parents:
15355
diff
changeset
|
1660 |
| 578 | 1661 #ifdef SETUP_SLAVE_PTY |
|
7058
1855e568a9b8
(create_process): Use SETUP_SLAVE_PTY only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
7044
diff
changeset
|
1662 if (pty_flag) |
|
1855e568a9b8
(create_process): Use SETUP_SLAVE_PTY only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
7044
diff
changeset
|
1663 { |
|
1855e568a9b8
(create_process): Use SETUP_SLAVE_PTY only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
7044
diff
changeset
|
1664 SETUP_SLAVE_PTY; |
|
1855e568a9b8
(create_process): Use SETUP_SLAVE_PTY only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
7044
diff
changeset
|
1665 } |
| 578 | 1666 #endif /* SETUP_SLAVE_PTY */ |
| 1667 #ifdef AIX | |
| 1668 /* On AIX, we've disabled SIGHUP above once we start a child on a pty. | |
| 1669 Now reenable it in the child, so it will die when we want it to. */ | |
| 1670 if (pty_flag) | |
| 1671 signal (SIGHUP, SIG_DFL); | |
| 1672 #endif | |
| 1673 #endif /* HAVE_PTYS */ | |
| 1674 | |
|
13709
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1675 signal (SIGINT, SIG_DFL); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1676 signal (SIGQUIT, SIG_DFL); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1677 |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1678 /* Stop blocking signals in the child. */ |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1679 #ifdef POSIX_SIGNALS |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1680 sigprocmask (SIG_SETMASK, &procmask, 0); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1681 #else /* !POSIX_SIGNALS */ |
| 578 | 1682 #ifdef SIGCHLD |
| 1683 #ifdef BSD4_1 | |
| 1684 sigrelse (SIGCHLD); | |
| 1685 #else /* not BSD4_1 */ | |
|
16220
02044b05d8e0
Replaced symbol BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
16206
diff
changeset
|
1686 #if defined (BSD_SYSTEM) || defined (UNIPLUS) || defined (HPUX) |
| 578 | 1687 sigsetmask (SIGEMPTYMASK); |
| 1688 #else /* ordinary USG */ | |
|
1207
af619d68a576
* process.c [SIGCHLD && !BSD && !UNIPLUS && !HPUX]
Jim Blandy <jimb@redhat.com>
parents:
1180
diff
changeset
|
1689 #if 0 |
| 578 | 1690 signal (SIGCHLD, sigchld); |
|
1207
af619d68a576
* process.c [SIGCHLD && !BSD && !UNIPLUS && !HPUX]
Jim Blandy <jimb@redhat.com>
parents:
1180
diff
changeset
|
1691 #endif |
| 578 | 1692 #endif /* ordinary USG */ |
| 1693 #endif /* not BSD4_1 */ | |
| 1694 #endif /* SIGCHLD */ | |
|
13709
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1695 #endif /* !POSIX_SIGNALS */ |
|
8390
ee13e8728666
(create_process): Set default handling for SIGINT, etc.
Richard M. Stallman <rms@gnu.org>
parents:
8354
diff
changeset
|
1696 |
|
7059
6a55de48ade5
(create_process): Use child_setup_tty only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
7058
diff
changeset
|
1697 if (pty_flag) |
|
6a55de48ade5
(create_process): Use child_setup_tty only if pty_flag.
Richard M. Stallman <rms@gnu.org>
parents:
7058
diff
changeset
|
1698 child_setup_tty (xforkout); |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1699 #ifdef WINDOWSNT |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1700 pid = child_setup (xforkin, xforkout, xforkout, |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1701 new_argv, 1, current_dir); |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1702 #else /* not WINDOWSNT */ |
| 578 | 1703 child_setup (xforkin, xforkout, xforkout, |
| 638 | 1704 new_argv, 1, current_dir); |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1705 #endif /* not WINDOWSNT */ |
| 578 | 1706 } |
| 1707 environ = save_environ; | |
| 1708 } | |
| 1709 | |
| 16780 | 1710 UNBLOCK_INPUT; |
| 1711 | |
|
14131
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1712 /* This runs in the Emacs process. */ |
| 578 | 1713 if (pid < 0) |
|
7157
3f4fc9d682b4
(create_process): If vfork fails, close forkin and forkout.
Richard M. Stallman <rms@gnu.org>
parents:
7116
diff
changeset
|
1714 { |
|
3f4fc9d682b4
(create_process): If vfork fails, close forkin and forkout.
Richard M. Stallman <rms@gnu.org>
parents:
7116
diff
changeset
|
1715 if (forkin >= 0) |
|
3f4fc9d682b4
(create_process): If vfork fails, close forkin and forkout.
Richard M. Stallman <rms@gnu.org>
parents:
7116
diff
changeset
|
1716 close (forkin); |
|
3f4fc9d682b4
(create_process): If vfork fails, close forkin and forkout.
Richard M. Stallman <rms@gnu.org>
parents:
7116
diff
changeset
|
1717 if (forkin != forkout && forkout >= 0) |
|
3f4fc9d682b4
(create_process): If vfork fails, close forkin and forkout.
Richard M. Stallman <rms@gnu.org>
parents:
7116
diff
changeset
|
1718 close (forkout); |
|
3f4fc9d682b4
(create_process): If vfork fails, close forkin and forkout.
Richard M. Stallman <rms@gnu.org>
parents:
7116
diff
changeset
|
1719 } |
|
14131
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1720 else |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1721 { |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1722 /* vfork succeeded. */ |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1723 XSETFASTINT (XPROCESS (process)->pid, pid); |
| 578 | 1724 |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1725 #ifdef WINDOWSNT |
|
14131
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1726 register_child (pid, inchannel); |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1727 #endif /* WINDOWSNT */ |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
1728 |
|
14131
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1729 /* If the subfork execv fails, and it exits, |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1730 this close hangs. I don't know why. |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1731 So have an interrupt jar it loose. */ |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1732 stop_polling (); |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1733 signal (SIGALRM, create_process_1); |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1734 alarm (1); |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1735 XPROCESS (process)->subtty = Qnil; |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1736 if (forkin >= 0) |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1737 close (forkin); |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1738 alarm (0); |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1739 start_polling (); |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1740 if (forkin != forkout && forkout >= 0) |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1741 close (forkout); |
| 578 | 1742 |
|
11609
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
1743 #ifdef HAVE_PTYS |
|
14131
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1744 if (pty_flag) |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1745 XPROCESS (process)->tty_name = build_string (pty_name); |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1746 else |
|
11609
3b2dacb1bfe9
(create_process): Don't reference pty_name if !HAVE_PTYS.
Karl Heuer <kwzh@gnu.org>
parents:
11514
diff
changeset
|
1747 #endif |
|
14131
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1748 XPROCESS (process)->tty_name = Qnil; |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1749 } |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1750 |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1751 /* Restore the signal state whether vfork succeeded or not. |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1752 (We will signal an error, below, if it failed.) */ |
|
13709
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1753 #ifdef POSIX_SIGNALS |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1754 #ifdef HAVE_VFORK |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1755 /* Restore the parent's signal handlers. */ |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1756 sigaction (SIGINT, &sigint_action, 0); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1757 sigaction (SIGQUIT, &sigquit_action, 0); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1758 #ifdef AIX |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1759 sigaction (SIGHUP, &sighup_action, 0); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1760 #endif |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1761 #endif /* HAVE_VFORK */ |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1762 /* Stop blocking signals in the parent. */ |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1763 sigprocmask (SIG_SETMASK, &procmask, 0); |
|
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1764 #else /* !POSIX_SIGNALS */ |
| 578 | 1765 #ifdef SIGCHLD |
| 1766 #ifdef BSD4_1 | |
| 1767 sigrelse (SIGCHLD); | |
| 1768 #else /* not BSD4_1 */ | |
|
16220
02044b05d8e0
Replaced symbol BSD with BSD_SYSTEM.
Karl Heuer <kwzh@gnu.org>
parents:
16206
diff
changeset
|
1769 #if defined (BSD_SYSTEM) || defined (UNIPLUS) || defined (HPUX) |
| 578 | 1770 sigsetmask (SIGEMPTYMASK); |
| 1771 #else /* ordinary USG */ | |
| 1772 #if 0 | |
| 1773 signal (SIGCHLD, sigchld); | |
| 1774 /* Now really handle any of these signals | |
| 1775 that came in during this function. */ | |
| 1776 if (sigchld_deferred) | |
| 1777 kill (getpid (), SIGCHLD); | |
| 1778 #endif | |
| 1779 #endif /* ordinary USG */ | |
| 1780 #endif /* not BSD4_1 */ | |
| 1781 #endif /* SIGCHLD */ | |
|
13709
d16f31ae8adf
(create_process): Use Posix signal handling to
Karl Heuer <kwzh@gnu.org>
parents:
13414
diff
changeset
|
1782 #endif /* !POSIX_SIGNALS */ |
|
14131
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1783 |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1784 /* Now generate the error if vfork failed. */ |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1785 if (pid < 0) |
|
7717b68abd2e
(create_process): Restore the signal state
Karl Heuer <kwzh@gnu.org>
parents:
14085
diff
changeset
|
1786 report_file_error ("Doing vfork", Qnil); |
| 578 | 1787 } |
| 1788 #endif /* not VMS */ | |
| 1789 | |
| 1790 #ifdef HAVE_SOCKETS | |
| 1791 | |
| 1792 /* open a TCP network connection to a given HOST/SERVICE. Treated | |
| 1793 exactly like a normal process when reading and writing. Only | |
| 1794 differences are in status display and process deletion. A network | |
| 1795 connection has no PID; you cannot signal it. All you can do is | |
| 1796 deactivate and close it via delete-process */ | |
| 1797 | |
| 1798 DEFUN ("open-network-stream", Fopen_network_stream, Sopen_network_stream, | |
| 1799 4, 4, 0, | |
| 1800 "Open a TCP connection for a service to a host.\n\ | |
| 1801 Returns a subprocess-object to represent the connection.\n\ | |
| 1802 Input and output work as for subprocesses; `delete-process' closes it.\n\ | |
| 1803 Args are NAME BUFFER HOST SERVICE.\n\ | |
| 1804 NAME is name for process. It is modified if necessary to make it unique.\n\ | |
| 1805 BUFFER is the buffer (or buffer-name) to associate with the process.\n\ | |
| 1806 Process output goes at end of that buffer, unless you specify\n\ | |
| 1807 an output stream or filter function to handle the output.\n\ | |
| 1808 BUFFER may be also nil, meaning that this process is not associated\n\ | |
| 1809 with any buffer\n\ | |
| 1810 Third arg is name of the host to connect to, or its IP address.\n\ | |
| 1811 Fourth arg SERVICE is name of the service desired, or an integer\n\ | |
| 1812 specifying a port number to connect to.") | |
| 1813 (name, buffer, host, service) | |
| 1814 Lisp_Object name, buffer, host, service; | |
| 1815 { | |
| 1816 Lisp_Object proc; | |
| 1817 register int i; | |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1818 |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1819 #ifndef HAVE_GETADDRINFO |
| 578 | 1820 struct sockaddr_in address; |
| 1821 struct servent *svc_info; | |
| 1822 struct hostent *host_info_ptr, host_info; | |
| 1823 char *(addr_list[2]); | |
|
4998
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
1824 IN_ADDR numeric_addr; |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1825 struct hostent host_info_fixed; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1826 int port; |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1827 #else /* HAVE_GETADDRINFO */ |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1828 struct addrinfo hints, *res, *lres; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1829 int ret = 0; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1830 int xerrno = 0; |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1831 char *portstring, portbuf[128]; |
|
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1832 #endif /* HAVE_GETADDRINFO */ |
|
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1833 int s = -1, outch, inch; |
| 578 | 1834 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; |
|
7220
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
1835 int retry = 0; |
|
7486
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
1836 int count = specpdl_ptr - specpdl; |
| 578 | 1837 |
|
15355
6bb377ef707f
(Fopen_network_stream)[WINDOWSNT]: Ensure Windows
Richard M. Stallman <rms@gnu.org>
parents:
15092
diff
changeset
|
1838 #ifdef WINDOWSNT |
|
6bb377ef707f
(Fopen_network_stream)[WINDOWSNT]: Ensure Windows
Richard M. Stallman <rms@gnu.org>
parents:
15092
diff
changeset
|
1839 /* Ensure socket support is loaded if available. */ |
|
6bb377ef707f
(Fopen_network_stream)[WINDOWSNT]: Ensure Windows
Richard M. Stallman <rms@gnu.org>
parents:
15092
diff
changeset
|
1840 init_winsock (TRUE); |
|
6bb377ef707f
(Fopen_network_stream)[WINDOWSNT]: Ensure Windows
Richard M. Stallman <rms@gnu.org>
parents:
15092
diff
changeset
|
1841 #endif |
|
6bb377ef707f
(Fopen_network_stream)[WINDOWSNT]: Ensure Windows
Richard M. Stallman <rms@gnu.org>
parents:
15092
diff
changeset
|
1842 |
| 578 | 1843 GCPRO4 (name, buffer, host, service); |
| 1844 CHECK_STRING (name, 0); | |
| 1845 CHECK_STRING (host, 0); | |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1846 |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1847 #ifdef HAVE_GETADDRINFO |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1848 /* |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1849 * SERVICE can either be a string or int. |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1850 * Convert to a C string for later use by getaddrinfo. |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1851 */ |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1852 if (INTEGERP (service)) |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1853 { |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1854 sprintf (portbuf, "%d", XINT (service)); |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1855 portstring = portbuf; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1856 } |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1857 else |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1858 { |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1859 CHECK_STRING (service, 0); |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1860 portstring = XSTRING (service)->data; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1861 } |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1862 #else /* ! HAVE_GETADDRINFO */ |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
1863 if (INTEGERP (service)) |
| 578 | 1864 port = htons ((unsigned short) XINT (service)); |
| 1865 else | |
| 1866 { | |
| 1867 CHECK_STRING (service, 0); | |
| 1868 svc_info = getservbyname (XSTRING (service)->data, "tcp"); | |
| 1869 if (svc_info == 0) | |
| 1870 error ("Unknown service \"%s\"", XSTRING (service)->data); | |
| 1871 port = svc_info->s_port; | |
| 1872 } | |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1873 #endif /* ! HAVE_GETADDRINFO */ |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1874 |
| 578 | 1875 |
|
13777
5e0cbd5fcb46
(Fopen_network_stream): Call bind_polling_period earlier.
Karl Heuer <kwzh@gnu.org>
parents:
13709
diff
changeset
|
1876 /* Slow down polling to every ten seconds. |
|
5e0cbd5fcb46
(Fopen_network_stream): Call bind_polling_period earlier.
Karl Heuer <kwzh@gnu.org>
parents:
13709
diff
changeset
|
1877 Some kernels have a bug which causes retrying connect to fail |
|
5e0cbd5fcb46
(Fopen_network_stream): Call bind_polling_period earlier.
Karl Heuer <kwzh@gnu.org>
parents:
13709
diff
changeset
|
1878 after a connect. Polling can interfere with gethostbyname too. */ |
|
5e0cbd5fcb46
(Fopen_network_stream): Call bind_polling_period earlier.
Karl Heuer <kwzh@gnu.org>
parents:
13709
diff
changeset
|
1879 #ifdef POLL_FOR_INPUT |
|
5e0cbd5fcb46
(Fopen_network_stream): Call bind_polling_period earlier.
Karl Heuer <kwzh@gnu.org>
parents:
13709
diff
changeset
|
1880 bind_polling_period (10); |
|
5e0cbd5fcb46
(Fopen_network_stream): Call bind_polling_period earlier.
Karl Heuer <kwzh@gnu.org>
parents:
13709
diff
changeset
|
1881 #endif |
|
5e0cbd5fcb46
(Fopen_network_stream): Call bind_polling_period earlier.
Karl Heuer <kwzh@gnu.org>
parents:
13709
diff
changeset
|
1882 |
|
4914
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
1883 #ifndef TERM |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1884 #ifdef HAVE_GETADDRINFO |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1885 { |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1886 immediate_quit = 1; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1887 QUIT; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1888 memset (&hints, 0, sizeof (hints)); |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1889 hints.ai_flags = 0; |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1890 hints.ai_family = AF_UNSPEC; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1891 hints.ai_socktype = SOCK_STREAM; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1892 hints.ai_protocol = 0; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1893 ret = getaddrinfo (XSTRING (host)->data, portstring, &hints, &res); |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1894 if (ret) |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1895 { |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1896 error ("%s/%s %s", XSTRING (host)->data, portstring, |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1897 gai_strerror (ret)); |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1898 } |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1899 immediate_quit = 0; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1900 } |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1901 |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1902 for (lres = res; lres; lres = lres->ai_next) |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1903 { |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1904 s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol); |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1905 if (s < 0) |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1906 continue; |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1907 |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1908 /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR) |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1909 when connect is interrupted. So let's not let it get interrupted. |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1910 Note we do not turn off polling, because polling is only used |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1911 when not interrupt_input, and thus not normally used on the systems |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1912 which have this bug. On systems which use polling, there's no way |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1913 to quit if polling is turned off. */ |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1914 if (interrupt_input) |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1915 unrequest_sigio (); |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1916 |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1917 immediate_quit = 1; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1918 QUIT; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1919 |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1920 ret = connect (s, lres->ai_addr, lres->ai_addrlen); |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1921 if (ret == 0) |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1922 break; |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1923 close (s); |
|
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1924 s = -1; |
|
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1925 } |
|
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1926 |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1927 freeaddrinfo (res); |
|
25262
ccf83ed7326a
(Fopen_network_stream): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
25248
diff
changeset
|
1928 if (s < 0) |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1929 { |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1930 if (interrupt_input) |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1931 request_sigio (); |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1932 |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1933 errno = xerrno; |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1934 report_file_error ("connection failed", |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1935 Fcons (host, Fcons (name, Qnil))); |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1936 } |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1937 #else /* ! HAVE_GETADDRINFO */ |
|
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
1938 |
|
8287
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1939 while (1) |
|
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1940 { |
|
8331
14ddb4c66461
[!HAVE_H_ERRNO]: Declare h_errno.
Richard M. Stallman <rms@gnu.org>
parents:
8287
diff
changeset
|
1941 #ifdef TRY_AGAIN |
|
14ddb4c66461
[!HAVE_H_ERRNO]: Declare h_errno.
Richard M. Stallman <rms@gnu.org>
parents:
8287
diff
changeset
|
1942 h_errno = 0; |
|
14ddb4c66461
[!HAVE_H_ERRNO]: Declare h_errno.
Richard M. Stallman <rms@gnu.org>
parents:
8287
diff
changeset
|
1943 #endif |
|
14758
849458c13c0c
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14736
diff
changeset
|
1944 immediate_quit = 1; |
|
849458c13c0c
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14736
diff
changeset
|
1945 QUIT; |
|
8287
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1946 host_info_ptr = gethostbyname (XSTRING (host)->data); |
|
14758
849458c13c0c
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14736
diff
changeset
|
1947 immediate_quit = 0; |
|
8287
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1948 #ifdef TRY_AGAIN |
|
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1949 if (! (host_info_ptr == 0 && h_errno == TRY_AGAIN)) |
|
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1950 #endif |
|
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1951 break; |
|
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1952 Fsleep_for (make_number (1), Qnil); |
|
97c2535b7f37
(Fopen_network_stream): Retry gethostbyname after TRY_AGAIN failure.
Richard M. Stallman <rms@gnu.org>
parents:
8231
diff
changeset
|
1953 } |
| 578 | 1954 if (host_info_ptr == 0) |
| 1955 /* Attempt to interpret host as numeric inet address */ | |
| 1956 { | |
|
4883
a806d71f58f6
(Fopen_netwrok_stream): Cast arg to inet_addr to (char *).
Brian Fox <bfox@gnu.org>
parents:
4870
diff
changeset
|
1957 numeric_addr = inet_addr ((char *) XSTRING (host)->data); |
|
4998
3cd3a39f98f4
(IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
Richard M. Stallman <rms@gnu.org>
parents:
4994
diff
changeset
|
1958 if (NUMERIC_ADDR_ERROR) |
| 578 | 1959 error ("Unknown host \"%s\"", XSTRING (host)->data); |
| 1960 | |
| 1961 host_info_ptr = &host_info; | |
| 1962 host_info.h_name = 0; | |
| 1963 host_info.h_aliases = 0; | |
| 1964 host_info.h_addrtype = AF_INET; | |
|
2944
f66a150d3fb9
* process.c (Fopen_network_stream): Deal with older systems, which
Jim Blandy <jimb@redhat.com>
parents:
2917
diff
changeset
|
1965 #ifdef h_addr |
|
f66a150d3fb9
* process.c (Fopen_network_stream): Deal with older systems, which
Jim Blandy <jimb@redhat.com>
parents:
2917
diff
changeset
|
1966 /* Older machines have only one address slot called h_addr. |
|
f66a150d3fb9
* process.c (Fopen_network_stream): Deal with older systems, which
Jim Blandy <jimb@redhat.com>
parents:
2917
diff
changeset
|
1967 Newer machines have h_addr_list, but #define h_addr to |
|
f66a150d3fb9
* process.c (Fopen_network_stream): Deal with older systems, which
Jim Blandy <jimb@redhat.com>
parents:
2917
diff
changeset
|
1968 be its first element. */ |
|
f66a150d3fb9
* process.c (Fopen_network_stream): Deal with older systems, which
Jim Blandy <jimb@redhat.com>
parents:
2917
diff
changeset
|
1969 host_info.h_addr_list = &(addr_list[0]); |
|
f66a150d3fb9
* process.c (Fopen_network_stream): Deal with older systems, which
Jim Blandy <jimb@redhat.com>
parents:
2917
diff
changeset
|
1970 #endif |
|
f66a150d3fb9
* process.c (Fopen_network_stream): Deal with older systems, which
Jim Blandy <jimb@redhat.com>
parents:
2917
diff
changeset
|
1971 host_info.h_addr = (char*)(&numeric_addr); |
| 578 | 1972 addr_list[1] = 0; |
|
14544
ef07b51330af
(Fopen_network_stream): Use sizeof, not strlen, for numeric_addr.
Richard M. Stallman <rms@gnu.org>
parents:
14513
diff
changeset
|
1973 /* numeric_addr isn't null-terminated; it has fixed length. */ |
|
ef07b51330af
(Fopen_network_stream): Use sizeof, not strlen, for numeric_addr.
Richard M. Stallman <rms@gnu.org>
parents:
14513
diff
changeset
|
1974 host_info.h_length = sizeof (numeric_addr); |
| 578 | 1975 } |
| 1976 | |
| 1977 bzero (&address, sizeof address); | |
| 1978 bcopy (host_info_ptr->h_addr, (char *) &address.sin_addr, | |
| 1979 host_info_ptr->h_length); | |
| 1980 address.sin_family = host_info_ptr->h_addrtype; | |
| 1981 address.sin_port = port; | |
| 1982 | |
| 1983 s = socket (host_info_ptr->h_addrtype, SOCK_STREAM, 0); | |
| 1984 if (s < 0) | |
| 1985 report_file_error ("error creating socket", Fcons (name, Qnil)); | |
| 1986 | |
|
5332
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1987 /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR) |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1988 when connect is interrupted. So let's not let it get interrupted. |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1989 Note we do not turn off polling, because polling is only used |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1990 when not interrupt_input, and thus not normally used on the systems |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1991 which have this bug. On systems which use polling, there's no way |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1992 to quit if polling is turned off. */ |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1993 if (interrupt_input) |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1994 unrequest_sigio (); |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
1995 |
| 578 | 1996 loop: |
|
14671
0493e857a13b
(Fopen_network_stream): Set immediate_quit for the connect.
Richard M. Stallman <rms@gnu.org>
parents:
14613
diff
changeset
|
1997 |
|
0493e857a13b
(Fopen_network_stream): Set immediate_quit for the connect.
Richard M. Stallman <rms@gnu.org>
parents:
14613
diff
changeset
|
1998 immediate_quit = 1; |
|
0493e857a13b
(Fopen_network_stream): Set immediate_quit for the connect.
Richard M. Stallman <rms@gnu.org>
parents:
14613
diff
changeset
|
1999 QUIT; |
|
0493e857a13b
(Fopen_network_stream): Set immediate_quit for the connect.
Richard M. Stallman <rms@gnu.org>
parents:
14613
diff
changeset
|
2000 |
|
7220
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2001 if (connect (s, (struct sockaddr *) &address, sizeof address) == -1 |
|
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2002 && errno != EISCONN) |
| 578 | 2003 { |
| 2004 int xerrno = errno; | |
|
7220
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2005 |
|
14671
0493e857a13b
(Fopen_network_stream): Set immediate_quit for the connect.
Richard M. Stallman <rms@gnu.org>
parents:
14613
diff
changeset
|
2006 immediate_quit = 0; |
|
0493e857a13b
(Fopen_network_stream): Set immediate_quit for the connect.
Richard M. Stallman <rms@gnu.org>
parents:
14613
diff
changeset
|
2007 |
| 578 | 2008 if (errno == EINTR) |
| 2009 goto loop; | |
|
7220
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2010 if (errno == EADDRINUSE && retry < 20) |
|
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2011 { |
|
12378
3171d5da8a86
(Fopen_network_stream): Sleep 1 sec before connect retry.
Richard M. Stallman <rms@gnu.org>
parents:
12324
diff
changeset
|
2012 /* A delay here is needed on some FreeBSD systems, |
|
3171d5da8a86
(Fopen_network_stream): Sleep 1 sec before connect retry.
Richard M. Stallman <rms@gnu.org>
parents:
12324
diff
changeset
|
2013 and it is harmless, since this retrying takes time anyway |
|
3171d5da8a86
(Fopen_network_stream): Sleep 1 sec before connect retry.
Richard M. Stallman <rms@gnu.org>
parents:
12324
diff
changeset
|
2014 and should be infrequent. */ |
|
3171d5da8a86
(Fopen_network_stream): Sleep 1 sec before connect retry.
Richard M. Stallman <rms@gnu.org>
parents:
12324
diff
changeset
|
2015 Fsleep_for (make_number (1), Qnil); |
|
7220
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2016 retry++; |
|
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2017 goto loop; |
|
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2018 } |
|
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
2019 |
| 578 | 2020 close (s); |
|
5332
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
2021 |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
2022 if (interrupt_input) |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
2023 request_sigio (); |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
2024 |
| 578 | 2025 errno = xerrno; |
| 2026 report_file_error ("connection failed", | |
| 2027 Fcons (host, Fcons (name, Qnil))); | |
| 2028 } | |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
2029 #endif /* ! HAVE_GETADDRINFO */ |
|
5332
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
2030 |
|
14671
0493e857a13b
(Fopen_network_stream): Set immediate_quit for the connect.
Richard M. Stallman <rms@gnu.org>
parents:
14613
diff
changeset
|
2031 immediate_quit = 0; |
|
0493e857a13b
(Fopen_network_stream): Set immediate_quit for the connect.
Richard M. Stallman <rms@gnu.org>
parents:
14613
diff
changeset
|
2032 |
|
7486
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
2033 #ifdef POLL_FOR_INPUT |
|
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
2034 unbind_to (count, Qnil); |
|
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
2035 #endif |
|
cfe4840ffde9
(Fopen_network_stream): Call bind_polling_period; later unbind the binding.
Richard M. Stallman <rms@gnu.org>
parents:
7454
diff
changeset
|
2036 |
|
5332
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
2037 if (interrupt_input) |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
2038 request_sigio (); |
|
c559b3d1b9e4
(Fopen_network_stream): Turn off SIGIO while connecting.
Richard M. Stallman <rms@gnu.org>
parents:
5240
diff
changeset
|
2039 |
|
4914
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
2040 #else /* TERM */ |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
2041 s = connect_server (0); |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
2042 if (s < 0) |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
2043 report_file_error ("error creating socket", Fcons (name, Qnil)); |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
2044 send_command (s, C_PORT, 0, "%s:%d", XSTRING (host)->data, ntohs (port)); |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
2045 send_command (s, C_DUMB, 1, 0); |
|
56bc426b1eb4
[TERM]: Include client.h.
Richard M. Stallman <rms@gnu.org>
parents:
4883
diff
changeset
|
2046 #endif /* TERM */ |
| 578 | 2047 |
| 2048 inch = s; | |
|
17247
351006378b51
(Fopen_network_stream): Use same socket for in and out.
Richard M. Stallman <rms@gnu.org>
parents:
17224
diff
changeset
|
2049 outch = s; |
| 578 | 2050 |
| 2051 if (!NILP (buffer)) | |
| 2052 buffer = Fget_buffer_create (buffer); | |
| 2053 proc = make_process (name); | |
| 2054 | |
| 2055 chan_process[inch] = proc; | |
| 2056 | |
| 2057 #ifdef O_NONBLOCK | |
| 2058 fcntl (inch, F_SETFL, O_NONBLOCK); | |
| 2059 #else | |
| 2060 #ifdef O_NDELAY | |
| 2061 fcntl (inch, F_SETFL, O_NDELAY); | |
| 2062 #endif | |
| 2063 #endif | |
| 2064 | |
|
16058
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
2065 XPROCESS (proc)->childp = Fcons (host, Fcons (service, Qnil)); |
| 578 | 2066 XPROCESS (proc)->command_channel_p = Qnil; |
| 2067 XPROCESS (proc)->buffer = buffer; | |
| 2068 XPROCESS (proc)->sentinel = Qnil; | |
| 2069 XPROCESS (proc)->filter = Qnil; | |
| 2070 XPROCESS (proc)->command = Qnil; | |
| 2071 XPROCESS (proc)->pid = Qnil; | |
|
15092
5372670fbe59
(Fopen_network_stream): Set process infd to inch.
Richard M. Stallman <rms@gnu.org>
parents:
15064
diff
changeset
|
2072 XSETINT (XPROCESS (proc)->infd, inch); |
|
9277
21f6120be5ba
(make_process, create_process, Fopen_network_stream, deactivate_process,
Karl Heuer <kwzh@gnu.org>
parents:
9115
diff
changeset
|
2073 XSETINT (XPROCESS (proc)->outfd, outch); |
| 578 | 2074 XPROCESS (proc)->status = Qrun; |
| 2075 FD_SET (inch, &input_wait_mask); | |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2076 FD_SET (inch, &non_keyboard_wait_mask); |
|
7044
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2077 if (inch > max_process_desc) |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2078 max_process_desc = inch; |
| 578 | 2079 |
|
22019
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2080 { |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2081 /* Setup coding systems for communicating with the network stream. */ |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2082 struct gcpro gcpro1; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2083 /* Qt denotes we have not yet called Ffind_operation_coding_system. */ |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2084 Lisp_Object coding_systems = Qt; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2085 Lisp_Object args[5], val; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2086 |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2087 if (!NILP (Vcoding_system_for_read)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2088 val = Vcoding_system_for_read; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2089 else if (!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2090 || NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2091 /* We dare not decode end-of-line format by setting VAL to |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2092 Qraw_text, because the existing Emacs Lisp libraries |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2093 assume that they receive bare code including a sequene of |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2094 CR LF. */ |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2095 val = Qnil; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2096 else |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2097 { |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2098 args[0] = Qopen_network_stream, args[1] = name, |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2099 args[2] = buffer, args[3] = host, args[4] = service; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2100 GCPRO1 (proc); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2101 coding_systems = Ffind_operation_coding_system (5, args); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2102 UNGCPRO; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2103 if (CONSP (coding_systems)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2104 val = XCONS (coding_systems)->car; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2105 else if (CONSP (Vdefault_process_coding_system)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2106 val = XCONS (Vdefault_process_coding_system)->car; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2107 else |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2108 val = Qnil; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2109 } |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2110 XPROCESS (proc)->decode_coding_system = val; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2111 |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2112 if (!NILP (Vcoding_system_for_write)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2113 val = Vcoding_system_for_write; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2114 else if (NILP (current_buffer->enable_multibyte_characters)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2115 val = Qnil; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2116 else |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2117 { |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2118 if (EQ (coding_systems, Qt)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2119 { |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2120 args[0] = Qopen_network_stream, args[1] = name, |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2121 args[2] = buffer, args[3] = host, args[4] = service; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2122 GCPRO1 (proc); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2123 coding_systems = Ffind_operation_coding_system (5, args); |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2124 UNGCPRO; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2125 } |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2126 if (CONSP (coding_systems)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2127 val = XCONS (coding_systems)->cdr; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2128 else if (CONSP (Vdefault_process_coding_system)) |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2129 val = XCONS (Vdefault_process_coding_system)->cdr; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2130 else |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2131 val = Qnil; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2132 } |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2133 XPROCESS (proc)->encode_coding_system = val; |
|
bb9dd4758e7e
(Fstart_process): Remove the special case for
Richard M. Stallman <rms@gnu.org>
parents:
21978
diff
changeset
|
2134 } |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2135 |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2136 if (!proc_decode_coding_system[inch]) |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2137 proc_decode_coding_system[inch] |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2138 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2139 setup_coding_system (XPROCESS (proc)->decode_coding_system, |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2140 proc_decode_coding_system[inch]); |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2141 if (!proc_encode_coding_system[outch]) |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2142 proc_encode_coding_system[outch] |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2143 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2144 setup_coding_system (XPROCESS (proc)->encode_coding_system, |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2145 proc_encode_coding_system[outch]); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2146 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2147 XPROCESS (proc)->decoding_buf = make_uninit_string (0); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2148 XPROCESS (proc)->decoding_carryover = make_number (0); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2149 XPROCESS (proc)->encoding_buf = make_uninit_string (0); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2150 XPROCESS (proc)->encoding_carryover = make_number (0); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2151 |
|
21848
050ea21cec87
(Fset_process_inherit_coding_system_flag, Fstart_process):
Richard M. Stallman <rms@gnu.org>
parents:
21798
diff
changeset
|
2152 XPROCESS (proc)->inherit_coding_system_flag |
|
050ea21cec87
(Fset_process_inherit_coding_system_flag, Fstart_process):
Richard M. Stallman <rms@gnu.org>
parents:
21798
diff
changeset
|
2153 = (NILP (buffer) || !inherit_process_coding_system |
|
050ea21cec87
(Fset_process_inherit_coding_system_flag, Fstart_process):
Richard M. Stallman <rms@gnu.org>
parents:
21798
diff
changeset
|
2154 ? Qnil : Qt); |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
2155 |
| 578 | 2156 UNGCPRO; |
| 2157 return proc; | |
| 2158 } | |
| 2159 #endif /* HAVE_SOCKETS */ | |
| 2160 | |
|
20382
dbad9367d232
(create_process, deactivate_process, close_process_descs):
Andreas Schwab <schwab@suse.de>
parents:
20225
diff
changeset
|
2161 void |
| 578 | 2162 deactivate_process (proc) |
| 2163 Lisp_Object proc; | |
| 2164 { | |
| 2165 register int inchannel, outchannel; | |
| 2166 register struct Lisp_Process *p = XPROCESS (proc); | |
| 2167 | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2168 inchannel = XINT (p->infd); |
|
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2169 outchannel = XINT (p->outfd); |
|
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2170 |
|
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2171 if (inchannel >= 0) |
| 578 | 2172 { |
| 2173 /* Beware SIGCHLD hereabouts. */ | |
| 2174 flush_pending_output (inchannel); | |
| 2175 #ifdef VMS | |
| 2176 { | |
| 2177 VMS_PROC_STUFF *get_vms_process_pointer (), *vs; | |
| 2178 sys$dassgn (outchannel); | |
|
2357
9faa3a02ea97
* process.c [VMS] (DCL_PROMPT): Remove hack.
Jim Blandy <jimb@redhat.com>
parents:
2290
diff
changeset
|
2179 vs = get_vms_process_pointer (p->pid); |
| 578 | 2180 if (vs) |
| 2181 give_back_vms_process_stuff (vs); | |
| 2182 } | |
| 2183 #else | |
| 2184 close (inchannel); | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2185 if (outchannel >= 0 && outchannel != inchannel) |
| 578 | 2186 close (outchannel); |
| 2187 #endif | |
| 2188 | |
|
9277
21f6120be5ba
(make_process, create_process, Fopen_network_stream, deactivate_process,
Karl Heuer <kwzh@gnu.org>
parents:
9115
diff
changeset
|
2189 XSETINT (p->infd, -1); |
|
21f6120be5ba
(make_process, create_process, Fopen_network_stream, deactivate_process,
Karl Heuer <kwzh@gnu.org>
parents:
9115
diff
changeset
|
2190 XSETINT (p->outfd, -1); |
| 578 | 2191 chan_process[inchannel] = Qnil; |
| 2192 FD_CLR (inchannel, &input_wait_mask); | |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2193 FD_CLR (inchannel, &non_keyboard_wait_mask); |
|
7044
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2194 if (inchannel == max_process_desc) |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2195 { |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2196 int i; |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2197 /* We just closed the highest-numbered process input descriptor, |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2198 so recompute the highest-numbered one now. */ |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2199 max_process_desc = 0; |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2200 for (i = 0; i < MAXDESC; i++) |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2201 if (!NILP (chan_process[i])) |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2202 max_process_desc = i; |
|
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
2203 } |
| 578 | 2204 } |
| 2205 } | |
| 2206 | |
| 2207 /* Close all descriptors currently in use for communication | |
| 2208 with subprocess. This is used in a newly-forked subprocess | |
| 2209 to get rid of irrelevant descriptors. */ | |
| 2210 | |
|
20382
dbad9367d232
(create_process, deactivate_process, close_process_descs):
Andreas Schwab <schwab@suse.de>
parents:
20225
diff
changeset
|
2211 void |
| 578 | 2212 close_process_descs () |
| 2213 { | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
2214 #ifndef WINDOWSNT |
| 578 | 2215 int i; |
| 2216 for (i = 0; i < MAXDESC; i++) | |
| 2217 { | |
| 2218 Lisp_Object process; | |
| 2219 process = chan_process[i]; | |
| 2220 if (!NILP (process)) | |
| 2221 { | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2222 int in = XINT (XPROCESS (process)->infd); |
|
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2223 int out = XINT (XPROCESS (process)->outfd); |
|
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2224 if (in >= 0) |
| 578 | 2225 close (in); |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2226 if (out >= 0 && in != out) |
| 578 | 2227 close (out); |
| 2228 } | |
| 2229 } | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
2230 #endif |
| 578 | 2231 } |
| 2232 | |
| 2233 DEFUN ("accept-process-output", Faccept_process_output, Saccept_process_output, | |
| 2234 0, 3, 0, | |
| 2235 "Allow any pending output from subprocesses to be read by Emacs.\n\ | |
| 2236 It is read into the process' buffers or given to their filter functions.\n\ | |
| 2237 Non-nil arg PROCESS means do not return until some output has been received\n\ | |
| 2238 from PROCESS.\n\ | |
| 2239 Non-nil second arg TIMEOUT and third arg TIMEOUT-MSECS are number of\n\ | |
| 2240 seconds and microseconds to wait; return after that much time whether\n\ | |
| 2241 or not there is input.\n\ | |
| 2242 Return non-nil iff we received any output before the timeout expired.") | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
2243 (process, timeout, timeout_msecs) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
2244 register Lisp_Object process, timeout, timeout_msecs; |
| 578 | 2245 { |
| 2246 int seconds; | |
| 2247 int useconds; | |
| 2248 | |
|
24598
078d53377010
(Faccept_process_output): Check validity of PROCESS.
Richard M. Stallman <rms@gnu.org>
parents:
24352
diff
changeset
|
2249 if (! NILP (process)) |
|
078d53377010
(Faccept_process_output): Check validity of PROCESS.
Richard M. Stallman <rms@gnu.org>
parents:
24352
diff
changeset
|
2250 CHECK_PROCESS (process, 0); |
|
078d53377010
(Faccept_process_output): Check validity of PROCESS.
Richard M. Stallman <rms@gnu.org>
parents:
24352
diff
changeset
|
2251 |
| 578 | 2252 if (! NILP (timeout_msecs)) |
| 2253 { | |
| 2254 CHECK_NUMBER (timeout_msecs, 2); | |
| 2255 useconds = XINT (timeout_msecs); | |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
2256 if (!INTEGERP (timeout)) |
|
9277
21f6120be5ba
(make_process, create_process, Fopen_network_stream, deactivate_process,
Karl Heuer <kwzh@gnu.org>
parents:
9115
diff
changeset
|
2257 XSETINT (timeout, 0); |
| 578 | 2258 |
| 2259 { | |
| 2260 int carry = useconds / 1000000; | |
| 2261 | |
| 2262 XSETINT (timeout, XINT (timeout) + carry); | |
| 2263 useconds -= carry * 1000000; | |
| 2264 | |
| 2265 /* I think this clause is necessary because C doesn't | |
| 2266 guarantee a particular rounding direction for negative | |
| 2267 integers. */ | |
| 2268 if (useconds < 0) | |
| 2269 { | |
| 2270 XSETINT (timeout, XINT (timeout) - 1); | |
| 2271 useconds += 1000000; | |
| 2272 } | |
| 2273 } | |
| 2274 } | |
|
1180
9bf82484415d
(Faccept_process_output): Initialize useconds.
Richard M. Stallman <rms@gnu.org>
parents:
1047
diff
changeset
|
2275 else |
|
9bf82484415d
(Faccept_process_output): Initialize useconds.
Richard M. Stallman <rms@gnu.org>
parents:
1047
diff
changeset
|
2276 useconds = 0; |
| 578 | 2277 |
| 2278 if (! NILP (timeout)) | |
| 2279 { | |
| 2280 CHECK_NUMBER (timeout, 1); | |
| 2281 seconds = XINT (timeout); | |
|
14605
80196bfd8b94
(Faccept_process_output): Accept sub-second timeouts.
Erik Naggum <erik@naggum.no>
parents:
14544
diff
changeset
|
2282 if (seconds < 0 || (seconds == 0 && useconds == 0)) |
| 578 | 2283 seconds = -1; |
| 2284 } | |
| 2285 else | |
| 2286 { | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
2287 if (NILP (process)) |
| 578 | 2288 seconds = -1; |
| 2289 else | |
| 2290 seconds = 0; | |
| 2291 } | |
| 2292 | |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
2293 if (NILP (process)) |
|
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
2294 XSETFASTINT (process, 0); |
| 650 | 2295 |
| 578 | 2296 return |
|
14085
85ce7bab31dc
(Fprocessp, Fget_buffer_process, Fdelete_process, Fprocess_status,
Erik Naggum <erik@naggum.no>
parents:
14036
diff
changeset
|
2297 (wait_reading_process_input (seconds, useconds, process, 0) |
| 578 | 2298 ? Qt : Qnil); |
| 2299 } | |
| 2300 | |
| 2301 /* This variable is different from waiting_for_input in keyboard.c. | |
| 2302 It is used to communicate to a lisp process-filter/sentinel (via the | |
| 2303 function Fwaiting_for_user_input_p below) whether emacs was waiting | |
| 2304 for user-input when that process-filter was called. | |
| 2305 waiting_for_input cannot be used as that is by definition 0 when | |
|
8570
dd3dfde8f973
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
8390
diff
changeset
|
2306 lisp code is being evalled. |
|
dd3dfde8f973
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
8390
diff
changeset
|
2307 This is also used in record_asynch_buffer_change. |
|
dd3dfde8f973
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
8390
diff
changeset
|
2308 For that purpose, this must be 0 |
|
dd3dfde8f973
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
8390
diff
changeset
|
2309 when not inside wait_reading_process_input. */ |
| 578 | 2310 static int waiting_for_user_input_p; |
| 2311 | |
|
14890
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2312 /* This is here so breakpoints can be put on it. */ |
| 21514 | 2313 static void |
|
14890
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2314 wait_reading_process_input_1 () |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2315 { |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2316 } |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2317 |
| 578 | 2318 /* Read and dispose of subprocess output while waiting for timeout to |
| 2319 elapse and/or keyboard input to be available. | |
| 2320 | |
|
3953
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2321 TIME_LIMIT is: |
| 578 | 2322 timeout in seconds, or |
| 2323 zero for no limit, or | |
| 2324 -1 means gobble data immediately available but don't wait for any. | |
| 2325 | |
|
3953
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2326 MICROSECS is: |
|
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2327 an additional duration to wait, measured in microseconds. |
|
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2328 If this is nonzero and time_limit is 0, then the timeout |
|
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2329 consists of MICROSECS only. |
|
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2330 |
|
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2331 READ_KBD is a lisp value: |
| 578 | 2332 0 to ignore keyboard input, or |
| 2333 1 to return when input is available, or | |
|
2200
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2334 -1 meaning caller will actually read the input, so don't throw to |
| 578 | 2335 the quit handler, or |
| 6569 | 2336 a cons cell, meaning wait until its car is non-nil |
|
3953
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2337 (and gobble terminal input into the buffer if any arrives), or |
| 650 | 2338 a process object, meaning wait until something arrives from that |
| 2339 process. The return value is true iff we read some input from | |
| 2340 that process. | |
| 578 | 2341 |
|
3953
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2342 DO_DISPLAY != 0 means redisplay should be done to show subprocess |
| 578 | 2343 output that arrives. |
| 2344 | |
|
3953
d0c23febc08c
(wait_reading_process_input): Do include the keyboard
Richard M. Stallman <rms@gnu.org>
parents:
3915
diff
changeset
|
2345 If READ_KBD is a pointer to a struct Lisp_Process, then the |
| 578 | 2346 function returns true iff we received input from that process |
| 2347 before the timeout elapsed. | |
|
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3510
diff
changeset
|
2348 Otherwise, return true iff we received input from any process. */ |
| 578 | 2349 |
| 21514 | 2350 int |
| 578 | 2351 wait_reading_process_input (time_limit, microsecs, read_kbd, do_display) |
| 650 | 2352 int time_limit, microsecs; |
| 2353 Lisp_Object read_kbd; | |
| 2354 int do_display; | |
| 578 | 2355 { |
| 2356 register int channel, nfds, m; | |
| 2357 static SELECT_TYPE Available; | |
| 2358 int xerrno; | |
| 2359 Lisp_Object proc; | |
| 2360 EMACS_TIME timeout, end_time, garbage; | |
| 2361 SELECT_TYPE Atemp; | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2362 int wait_channel = -1; |
| 578 | 2363 struct Lisp_Process *wait_proc = 0; |
| 2364 int got_some_input = 0; | |
|
2200
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2365 Lisp_Object *wait_for_cell = 0; |
| 578 | 2366 |
| 2367 FD_ZERO (&Available); | |
| 2368 | |
| 650 | 2369 /* If read_kbd is a process to watch, set wait_proc and wait_channel |
| 2370 accordingly. */ | |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
2371 if (PROCESSP (read_kbd)) |
| 578 | 2372 { |
| 650 | 2373 wait_proc = XPROCESS (read_kbd); |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2374 wait_channel = XINT (wait_proc->infd); |
|
9318
a14cc1712337
(make_process, list_processes_1, create_process, Faccept_process_output,
Karl Heuer <kwzh@gnu.org>
parents:
9277
diff
changeset
|
2375 XSETFASTINT (read_kbd, 0); |
| 578 | 2376 } |
| 2377 | |
|
2200
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2378 /* If waiting for non-nil in a cell, record where. */ |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
2379 if (CONSP (read_kbd)) |
|
2200
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2380 { |
|
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2381 wait_for_cell = &XCONS (read_kbd)->car; |
|
9318
a14cc1712337
(make_process, list_processes_1, create_process, Faccept_process_output,
Karl Heuer <kwzh@gnu.org>
parents:
9277
diff
changeset
|
2382 XSETFASTINT (read_kbd, 0); |
|
2200
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2383 } |
|
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2384 |
| 650 | 2385 waiting_for_user_input_p = XINT (read_kbd); |
| 578 | 2386 |
| 2387 /* Since we may need to wait several times, | |
| 2388 compute the absolute time to return at. */ | |
| 2389 if (time_limit || microsecs) | |
| 2390 { | |
| 2391 EMACS_GET_TIME (end_time); | |
| 2392 EMACS_SET_SECS_USECS (timeout, time_limit, microsecs); | |
| 2393 EMACS_ADD_TIME (end_time, end_time, timeout); | |
| 2394 } | |
|
15661
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2395 #ifdef hpux |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2396 /* AlainF 5-Jul-1996 |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2397 HP-UX 10.10 seem to have problems with signals coming in |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2398 Causes "poll: interrupted system call" messages when Emacs is run |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2399 in an X window |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2400 Turn off periodic alarms (in case they are in use) */ |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2401 stop_polling (); |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2402 #endif |
| 578 | 2403 |
| 2404 while (1) | |
| 2405 { | |
|
14458
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2406 int timeout_reduced_for_timers = 0; |
|
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2407 |
|
25009
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2408 #ifdef HAVE_X_WINDOWS |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2409 if (display_busy_cursor_p) |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2410 Fx_hide_busy_cursor (Qnil); |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2411 #endif |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2412 |
| 578 | 2413 /* If calling from keyboard input, do not quit |
| 2414 since we want to return C-g as an input character. | |
| 2415 Otherwise, do pending quit if requested. */ | |
| 650 | 2416 if (XINT (read_kbd) >= 0) |
| 578 | 2417 QUIT; |
| 2418 | |
| 4639 | 2419 /* Exit now if the cell we're waiting for became non-nil. */ |
| 2420 if (wait_for_cell && ! NILP (*wait_for_cell)) | |
| 2421 break; | |
| 2422 | |
| 578 | 2423 /* Compute time from now till when time limit is up */ |
| 2424 /* Exit if already run out */ | |
| 2425 if (time_limit == -1) | |
| 2426 { | |
| 2427 /* -1 specified for timeout means | |
| 2428 gobble output available now | |
| 2429 but don't wait at all. */ | |
| 2430 | |
| 2431 EMACS_SET_SECS_USECS (timeout, 0, 0); | |
| 2432 } | |
| 2433 else if (time_limit || microsecs) | |
| 2434 { | |
| 2435 EMACS_GET_TIME (timeout); | |
| 2436 EMACS_SUB_TIME (timeout, end_time, timeout); | |
| 2437 if (EMACS_TIME_NEG_P (timeout)) | |
| 2438 break; | |
| 2439 } | |
| 2440 else | |
| 2441 { | |
| 2442 EMACS_SET_SECS_USECS (timeout, 100000, 0); | |
| 2443 } | |
| 2444 | |
|
15064
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2445 /* Normally we run timers here. |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2446 But not if wait_for_cell; in those cases, |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2447 the wait is supposed to be short, |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2448 and those callers cannot handle running arbitrary Lisp code here. */ |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2449 if (! wait_for_cell) |
|
14404
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
2450 { |
|
14458
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2451 EMACS_TIME timer_delay; |
|
14890
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2452 int old_timers_run; |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2453 |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2454 retry: |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2455 old_timers_run = timers_run; |
|
14458
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2456 timer_delay = timer_check (1); |
|
14785
e4a9806c1e83
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14758
diff
changeset
|
2457 if (timers_run != old_timers_run && do_display) |
|
14890
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2458 { |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2459 redisplay_preserve_echo_area (); |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2460 /* We must retry, since a timer may have requeued itself |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2461 and that could alter the time_delay. */ |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2462 goto retry; |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2463 } |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2464 |
|
18230
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2465 /* If there is unread keyboard input, also return. */ |
|
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2466 if (XINT (read_kbd) != 0 |
|
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2467 && requeued_events_pending_p ()) |
|
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2468 break; |
|
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2469 |
|
14458
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2470 if (! EMACS_TIME_NEG_P (timer_delay) && time_limit != -1) |
|
14404
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
2471 { |
|
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
2472 EMACS_TIME difference; |
|
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
2473 EMACS_SUB_TIME (difference, timer_delay, timeout); |
|
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
2474 if (EMACS_TIME_NEG_P (difference)) |
|
14458
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2475 { |
|
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2476 timeout = timer_delay; |
|
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2477 timeout_reduced_for_timers = 1; |
|
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2478 } |
|
14404
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
2479 } |
|
14935
3e0dc64a5cb8
(wait_reading_process_input): Don't call
Richard M. Stallman <rms@gnu.org>
parents:
14890
diff
changeset
|
2480 /* If time_limit is -1, we are not going to wait at all. */ |
|
3e0dc64a5cb8
(wait_reading_process_input): Don't call
Richard M. Stallman <rms@gnu.org>
parents:
14890
diff
changeset
|
2481 else if (time_limit != -1) |
|
14890
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2482 { |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2483 /* This is so a breakpoint can be put here. */ |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2484 wait_reading_process_input_1 (); |
|
71c2cf461805
(wait_reading_process_input_1): New (empty) function.
Richard M. Stallman <rms@gnu.org>
parents:
14863
diff
changeset
|
2485 } |
|
14404
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
2486 } |
|
cba05f90ee57
(wait_reading_process_input): Call timer_check
Richard M. Stallman <rms@gnu.org>
parents:
14278
diff
changeset
|
2487 |
|
2894
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2488 /* Cause C-g and alarm signals to take immediate action, |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2489 and cause input available signals to zero out timeout. |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2490 |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2491 It is important that we do this before checking for process |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2492 activity. If we get a SIGCHLD after the explicit checks for |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2493 process activity, timeout is the only way we will know. */ |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2494 if (XINT (read_kbd) < 0) |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2495 set_waiting_for_input (&timeout); |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2496 |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2497 /* If status of something has changed, and no input is |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2498 available, notify the user of the change right away. After |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2499 this explicit check, we'll let the SIGCHLD handler zap |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2500 timeout to get our attention. */ |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2501 if (update_tick != process_tick && do_display) |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2502 { |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2503 Atemp = input_wait_mask; |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2504 EMACS_SET_SECS_USECS (timeout, 0, 0); |
|
18492
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
2505 if ((select (max (max_process_desc, max_keyboard_desc) + 1, |
|
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
2506 &Atemp, (SELECT_TYPE *)0, (SELECT_TYPE *)0, |
|
11926
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
2507 &timeout) |
|
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
2508 <= 0)) |
|
2894
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2509 { |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2510 /* It's okay for us to do this and then continue with |
| 5534 | 2511 the loop, since timeout has already been zeroed out. */ |
|
2894
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2512 clear_waiting_for_input (); |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2513 status_notify (); |
|
646c5beae647
* process.c (wait_reading_process_input): Undo change of April
Jim Blandy <jimb@redhat.com>
parents:
2893
diff
changeset
|
2514 } |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2515 } |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2516 |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2517 /* Don't wait for output from a non-running process. */ |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2518 if (wait_proc != 0 && !NILP (wait_proc->raw_status_low)) |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2519 update_status (wait_proc); |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2520 if (wait_proc != 0 |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2521 && ! EQ (wait_proc->status, Qrun)) |
|
2893
4df57953d5d0
* process.c (wait_reading_process_input): Don't forget to call
Jim Blandy <jimb@redhat.com>
parents:
2887
diff
changeset
|
2522 { |
|
18946
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2523 int nread, total_nread = 0; |
|
18267
29c37882ee1f
(wait_reading_process_input): When exiting because
Richard M. Stallman <rms@gnu.org>
parents:
18230
diff
changeset
|
2524 |
|
2893
4df57953d5d0
* process.c (wait_reading_process_input): Don't forget to call
Jim Blandy <jimb@redhat.com>
parents:
2887
diff
changeset
|
2525 clear_waiting_for_input (); |
|
18267
29c37882ee1f
(wait_reading_process_input): When exiting because
Richard M. Stallman <rms@gnu.org>
parents:
18230
diff
changeset
|
2526 XSETPROCESS (proc, wait_proc); |
|
29c37882ee1f
(wait_reading_process_input): When exiting because
Richard M. Stallman <rms@gnu.org>
parents:
18230
diff
changeset
|
2527 |
|
29c37882ee1f
(wait_reading_process_input): When exiting because
Richard M. Stallman <rms@gnu.org>
parents:
18230
diff
changeset
|
2528 /* Read data from the process, until we exhaust it. */ |
|
18276
3835d79f8978
(wait_reading_process_input): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
18267
diff
changeset
|
2529 while (XINT (wait_proc->infd) >= 0 |
|
18292
3a85989b7e2c
Further fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
18276
diff
changeset
|
2530 && (nread |
|
3a85989b7e2c
Further fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
18276
diff
changeset
|
2531 = read_process_output (proc, XINT (wait_proc->infd)))) |
|
18946
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2532 { |
|
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2533 if (0 < nread) |
|
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2534 total_nread += nread; |
|
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2535 #ifdef EIO |
|
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2536 else if (nread == -1 && EIO == errno) |
|
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2537 break; |
|
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2538 #endif |
|
84b78d90cd45
(wait_reading_process_input): Initialize total_read.
Richard M. Stallman <rms@gnu.org>
parents:
18739
diff
changeset
|
2539 } |
|
18267
29c37882ee1f
(wait_reading_process_input): When exiting because
Richard M. Stallman <rms@gnu.org>
parents:
18230
diff
changeset
|
2540 if (total_nread > 0 && do_display) |
|
29c37882ee1f
(wait_reading_process_input): When exiting because
Richard M. Stallman <rms@gnu.org>
parents:
18230
diff
changeset
|
2541 redisplay_preserve_echo_area (); |
|
29c37882ee1f
(wait_reading_process_input): When exiting because
Richard M. Stallman <rms@gnu.org>
parents:
18230
diff
changeset
|
2542 |
|
2893
4df57953d5d0
* process.c (wait_reading_process_input): Don't forget to call
Jim Blandy <jimb@redhat.com>
parents:
2887
diff
changeset
|
2543 break; |
|
4df57953d5d0
* process.c (wait_reading_process_input): Don't forget to call
Jim Blandy <jimb@redhat.com>
parents:
2887
diff
changeset
|
2544 } |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
2545 |
| 578 | 2546 /* Wait till there is something to do */ |
| 2547 | |
|
17224
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
2548 if (wait_for_cell) |
|
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
2549 Available = non_process_wait_mask; |
|
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
2550 else if (! XINT (read_kbd)) |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2551 Available = non_keyboard_wait_mask; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2552 else |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2553 Available = input_wait_mask; |
| 578 | 2554 |
| 765 | 2555 /* If frame size has changed or the window is newly mapped, |
| 648 | 2556 redisplay now, before we start to wait. There is a race |
| 2557 condition here; if a SIGIO arrives between now and the select | |
|
1655
05e84e6c7d04
Tue Dec 1 23:42:25 1992 Jim Blandy (jimb@totoro.cs.oberlin.edu)
Jim Blandy <jimb@redhat.com>
parents:
1594
diff
changeset
|
2558 and indicates that a frame is trashed, the select may block |
|
05e84e6c7d04
Tue Dec 1 23:42:25 1992 Jim Blandy (jimb@totoro.cs.oberlin.edu)
Jim Blandy <jimb@redhat.com>
parents:
1594
diff
changeset
|
2559 displaying a trashed screen. */ |
|
6429
1dbe24a029fd
(wait_reading_process_input, both versions): Don't call
Richard M. Stallman <rms@gnu.org>
parents:
6393
diff
changeset
|
2560 if (frame_garbaged && do_display) |
|
11728
affed1766d34
(wait_reading_process_input): Don't call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
11695
diff
changeset
|
2561 { |
|
affed1766d34
(wait_reading_process_input): Don't call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
11695
diff
changeset
|
2562 clear_waiting_for_input (); |
|
affed1766d34
(wait_reading_process_input): Don't call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
11695
diff
changeset
|
2563 redisplay_preserve_echo_area (); |
|
affed1766d34
(wait_reading_process_input): Don't call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
11695
diff
changeset
|
2564 if (XINT (read_kbd) < 0) |
|
11744
52a2c8e81bb7
(wait_reading_process_input): Pass arg in new call to set_waiting_for_input.
Richard M. Stallman <rms@gnu.org>
parents:
11728
diff
changeset
|
2565 set_waiting_for_input (&timeout); |
|
11728
affed1766d34
(wait_reading_process_input): Don't call prepare_menu_bars.
Richard M. Stallman <rms@gnu.org>
parents:
11695
diff
changeset
|
2566 } |
| 648 | 2567 |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
2568 if (XINT (read_kbd) && detect_input_pending ()) |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
2569 { |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
2570 nfds = 0; |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
2571 FD_ZERO (&Available); |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
2572 } |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
2573 else |
|
18492
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
2574 nfds = select (max (max_process_desc, max_keyboard_desc) + 1, |
|
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
2575 &Available, (SELECT_TYPE *)0, (SELECT_TYPE *)0, |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
2576 &timeout); |
| 588 | 2577 |
| 578 | 2578 xerrno = errno; |
| 2579 | |
| 2580 /* Make C-g and alarm signals set flags again */ | |
| 2581 clear_waiting_for_input (); | |
| 2582 | |
| 2583 /* If we woke up due to SIGWINCH, actually change size now. */ | |
|
25356
5db69f7aadca
Call change_frame_size and do_pending_window_change with
Gerd Moellmann <gerd@gnu.org>
parents:
25262
diff
changeset
|
2584 do_pending_window_change (0); |
| 578 | 2585 |
|
14458
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2586 if (time_limit && nfds == 0 && ! timeout_reduced_for_timers) |
|
2bb4652305c1
(wait_reading_process_input): If select times out,
Richard M. Stallman <rms@gnu.org>
parents:
14405
diff
changeset
|
2587 /* We wanted the full specified time, so return now. */ |
| 578 | 2588 break; |
| 2589 if (nfds < 0) | |
| 2590 { | |
| 2591 if (xerrno == EINTR) | |
| 2592 FD_ZERO (&Available); | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
2593 #ifdef ultrix |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
2594 /* Ultrix select seems to return ENOMEM when it is |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
2595 interrupted. Treat it just like EINTR. Bleah. Note |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
2596 that we want to test for the "ultrix" CPP symbol, not |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
2597 "__ultrix__"; the latter is only defined under GCC, but |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
2598 not by DEC's bundled CC. -JimB */ |
|
1323
25b5b55a3916
* process.c (wait_reading_process_input): If the select returns
Jim Blandy <jimb@redhat.com>
parents:
1207
diff
changeset
|
2599 else if (xerrno == ENOMEM) |
|
25b5b55a3916
* process.c (wait_reading_process_input): If the select returns
Jim Blandy <jimb@redhat.com>
parents:
1207
diff
changeset
|
2600 FD_ZERO (&Available); |
|
25b5b55a3916
* process.c (wait_reading_process_input): If the select returns
Jim Blandy <jimb@redhat.com>
parents:
1207
diff
changeset
|
2601 #endif |
| 578 | 2602 #ifdef ALLIANT |
| 2603 /* This happens for no known reason on ALLIANT. | |
| 2604 I am guessing that this is the right response. -- RMS. */ | |
| 2605 else if (xerrno == EFAULT) | |
| 2606 FD_ZERO (&Available); | |
| 2607 #endif | |
| 2608 else if (xerrno == EBADF) | |
| 2609 { | |
| 2610 #ifdef AIX | |
| 2611 /* AIX doesn't handle PTY closure the same way BSD does. On AIX, | |
| 2612 the child's closure of the pts gives the parent a SIGHUP, and | |
| 2613 the ptc file descriptor is automatically closed, | |
| 2614 yielding EBADF here or at select() call above. | |
| 2615 So, SIGHUP is ignored (see def of PTY_TTY_NAME_SPRINTF | |
| 5534 | 2616 in m/ibmrt-aix.h), and here we just ignore the select error. |
| 578 | 2617 Cleanup occurs c/o status_notify after SIGCLD. */ |
| 648 | 2618 FD_ZERO (&Available); /* Cannot depend on values returned */ |
| 578 | 2619 #else |
| 2620 abort (); | |
| 2621 #endif | |
| 2622 } | |
| 2623 else | |
| 14613 | 2624 error ("select error: %s", strerror (xerrno)); |
| 578 | 2625 } |
|
2815
60f122cfe785
* process.c (wait_reading_process_input): If we're running
Jim Blandy <jimb@redhat.com>
parents:
2610
diff
changeset
|
2626 #if defined(sun) && !defined(USG5_4) |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2627 else if (nfds > 0 && keyboard_bit_set (&Available) |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
2628 && interrupt_input) |
| 2830 | 2629 /* System sometimes fails to deliver SIGIO. |
| 2630 | |
| 2631 David J. Mackenzie says that Emacs doesn't compile under | |
| 2632 Solaris if this code is enabled, thus the USG5_4 in the CPP | |
| 2633 conditional. "I haven't noticed any ill effects so far. | |
| 2634 If you find a Solaris expert somewhere, they might know | |
| 2635 better." */ | |
| 578 | 2636 kill (getpid (), SIGIO); |
| 2637 #endif | |
| 2638 | |
|
18378
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2639 #if 0 /* When polling is used, interrupt_input is 0, |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2640 so get_input_pending should read the input. |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2641 So this should not be needed. */ |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2642 /* If we are using polling for input, |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2643 and we see input available, make it get read now. |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2644 Otherwise it might not actually get read for a second. |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2645 And on hpux, since we turn off polling in wait_reading_process_input, |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2646 it might never get read at all if we don't spend much time |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2647 outside of wait_reading_process_input. */ |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2648 if (XINT (read_kbd) && interrupt_input |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2649 && keyboard_bit_set (&Available) |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2650 && input_polling_used ()) |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2651 kill (getpid (), SIGALRM); |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2652 #endif |
|
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2653 |
| 578 | 2654 /* Check for keyboard input */ |
| 2655 /* If there is any, return immediately | |
| 2656 to give it higher priority than subprocesses */ | |
| 2657 | |
|
19053
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2658 if (XINT (read_kbd) != 0 |
|
14758
849458c13c0c
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14736
diff
changeset
|
2659 && detect_input_pending_run_timers (do_display)) |
| 14613 | 2660 { |
| 2661 swallow_events (do_display); | |
|
14758
849458c13c0c
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14736
diff
changeset
|
2662 if (detect_input_pending_run_timers (do_display)) |
| 14613 | 2663 break; |
| 2664 } | |
| 2665 | |
|
18230
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2666 /* If there is unread keyboard input, also return. */ |
|
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2667 if (XINT (read_kbd) != 0 |
|
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2668 && requeued_events_pending_p ()) |
|
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2669 break; |
|
2f1f942f25ca
(wait_reading_process_input): Return if unread events appear.
Richard M. Stallman <rms@gnu.org>
parents:
18183
diff
changeset
|
2670 |
|
19053
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2671 /* If we are not checking for keyboard input now, |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2672 do process events (but don't run any timers). |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2673 This is so that X events will be processed. |
|
18492
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
2674 Otherwise they may have to wait until polling takes place. |
|
19053
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2675 That would causes delays in pasting selections, for example. |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2676 |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2677 (We used to do this only if wait_for_cell.) */ |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2678 if (XINT (read_kbd) == 0 && detect_input_pending ()) |
|
15064
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2679 { |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2680 swallow_events (do_display); |
|
18492
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
2681 #if 0 /* Exiting when read_kbd doesn't request that seems wrong, though. */ |
|
15064
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2682 if (detect_input_pending ()) |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2683 break; |
|
18492
668304de6f92
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
18378
diff
changeset
|
2684 #endif |
|
15064
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2685 } |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
2686 |
|
2200
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2687 /* Exit now if the cell we're waiting for became non-nil. */ |
|
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2688 if (wait_for_cell && ! NILP (*wait_for_cell)) |
|
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2689 break; |
|
5e58643bb169
(wait_reading_process_input): New option to wait
Richard M. Stallman <rms@gnu.org>
parents:
2120
diff
changeset
|
2690 |
| 621 | 2691 #ifdef SIGIO |
|
18378
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2692 /* If we think we have keyboard input waiting, but didn't get SIGIO, |
| 578 | 2693 go read it. This can happen with X on BSD after logging out. |
| 2694 In that case, there really is no input and no SIGIO, | |
| 2695 but select says there is input. */ | |
| 2696 | |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
2697 if (XINT (read_kbd) && interrupt_input |
|
18378
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2698 && keyboard_bit_set (&Available)) |
|
14736
b17ec81a6294
(wait_reading_process_input): Use getpid when generating SIGIO.
Richard M. Stallman <rms@gnu.org>
parents:
14671
diff
changeset
|
2699 kill (getpid (), SIGIO); |
| 621 | 2700 #endif |
| 578 | 2701 |
| 2702 if (! wait_proc) | |
| 2703 got_some_input |= nfds > 0; | |
| 2704 | |
| 624 | 2705 /* If checking input just got us a size-change event from X, |
| 2706 obey it now if we should. */ | |
|
4057
2fe1488b503c
(wait_reading_process_input): If wait_for_cell, do call
Richard M. Stallman <rms@gnu.org>
parents:
3953
diff
changeset
|
2707 if (XINT (read_kbd) || wait_for_cell) |
|
25356
5db69f7aadca
Call change_frame_size and do_pending_window_change with
Gerd Moellmann <gerd@gnu.org>
parents:
25262
diff
changeset
|
2708 do_pending_window_change (0); |
| 624 | 2709 |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2710 /* Check for data from a process. */ |
|
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2711 /* Really FIRST_PROC_DESC should be 0 on Unix, |
|
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2712 but this is safer in the short run. */ |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2713 for (channel = 0; channel <= max_process_desc; channel++) |
| 578 | 2714 { |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2715 if (FD_ISSET (channel, &Available) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
2716 && FD_ISSET (channel, &non_keyboard_wait_mask)) |
| 578 | 2717 { |
| 2718 int nread; | |
| 2719 | |
| 2720 /* If waiting for this channel, arrange to return as | |
| 2721 soon as no more input to be processed. No more | |
| 2722 waiting. */ | |
| 2723 if (wait_channel == channel) | |
| 2724 { | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
2725 wait_channel = -1; |
| 578 | 2726 time_limit = -1; |
| 2727 got_some_input = 1; | |
| 2728 } | |
| 2729 proc = chan_process[channel]; | |
| 2730 if (NILP (proc)) | |
| 2731 continue; | |
| 2732 | |
| 2733 /* Read data from the process, starting with our | |
| 2734 buffered-ahead character if we have one. */ | |
| 2735 | |
| 2736 nread = read_process_output (proc, channel); | |
| 2737 if (nread > 0) | |
| 2738 { | |
| 2739 /* Since read_process_output can run a filter, | |
| 2740 which can call accept-process-output, | |
| 2741 don't try to read from any other processes | |
| 2742 before doing the select again. */ | |
| 2743 FD_ZERO (&Available); | |
| 2744 | |
| 2745 if (do_display) | |
| 2746 redisplay_preserve_echo_area (); | |
| 2747 } | |
| 2748 #ifdef EWOULDBLOCK | |
| 2749 else if (nread == -1 && errno == EWOULDBLOCK) | |
| 2750 ; | |
|
15405
c27bb6e69e2d
(wait_reading_process_input): Move the O_NONBLOCK and
Richard M. Stallman <rms@gnu.org>
parents:
15368
diff
changeset
|
2751 #endif |
| 15406 | 2752 /* ISC 4.1 defines both EWOULDBLOCK and O_NONBLOCK, |
| 2753 and Emacs uses O_NONBLOCK, so what we get is EAGAIN. */ | |
| 578 | 2754 #ifdef O_NONBLOCK |
| 2755 else if (nread == -1 && errno == EAGAIN) | |
| 2756 ; | |
| 2757 #else | |
| 2758 #ifdef O_NDELAY | |
| 2759 else if (nread == -1 && errno == EAGAIN) | |
| 2760 ; | |
| 2761 /* Note that we cannot distinguish between no input | |
| 2762 available now and a closed pipe. | |
| 2763 With luck, a closed pipe will be accompanied by | |
| 2764 subprocess termination and SIGCHLD. */ | |
| 2765 else if (nread == 0 && !NETCONN_P (proc)) | |
| 2766 ; | |
| 648 | 2767 #endif /* O_NDELAY */ |
| 2768 #endif /* O_NONBLOCK */ | |
| 578 | 2769 #ifdef HAVE_PTYS |
| 2770 /* On some OSs with ptys, when the process on one end of | |
| 2771 a pty exits, the other end gets an error reading with | |
| 2772 errno = EIO instead of getting an EOF (0 bytes read). | |
| 2773 Therefore, if we get an error reading and errno = | |
| 2774 EIO, just continue, because the child process has | |
| 2775 exited and should clean itself up soon (e.g. when we | |
|
23035
8d68b82a4d8c
(wait_reading_process_input): If a pty gives EIO,
Richard M. Stallman <rms@gnu.org>
parents:
22939
diff
changeset
|
2776 get a SIGCHLD). |
|
8d68b82a4d8c
(wait_reading_process_input): If a pty gives EIO,
Richard M. Stallman <rms@gnu.org>
parents:
22939
diff
changeset
|
2777 |
|
8d68b82a4d8c
(wait_reading_process_input): If a pty gives EIO,
Richard M. Stallman <rms@gnu.org>
parents:
22939
diff
changeset
|
2778 However, it has been known to happen that the SIGCHLD |
|
8d68b82a4d8c
(wait_reading_process_input): If a pty gives EIO,
Richard M. Stallman <rms@gnu.org>
parents:
22939
diff
changeset
|
2779 got lost. So raise the signl again just in case. |
|
8d68b82a4d8c
(wait_reading_process_input): If a pty gives EIO,
Richard M. Stallman <rms@gnu.org>
parents:
22939
diff
changeset
|
2780 It can't hurt. */ |
| 578 | 2781 else if (nread == -1 && errno == EIO) |
|
23035
8d68b82a4d8c
(wait_reading_process_input): If a pty gives EIO,
Richard M. Stallman <rms@gnu.org>
parents:
22939
diff
changeset
|
2782 kill (getpid (), SIGCHLD); |
| 648 | 2783 #endif /* HAVE_PTYS */ |
| 2784 /* If we can detect process termination, don't consider the process | |
| 2785 gone just because its pipe is closed. */ | |
| 578 | 2786 #ifdef SIGCHLD |
| 2787 else if (nread == 0 && !NETCONN_P (proc)) | |
| 2788 ; | |
| 2789 #endif | |
| 2790 else | |
| 2791 { | |
| 2792 /* Preserve status of processes already terminated. */ | |
| 2793 XSETINT (XPROCESS (proc)->tick, ++process_tick); | |
| 2794 deactivate_process (proc); | |
| 2795 if (!NILP (XPROCESS (proc)->raw_status_low)) | |
| 2796 update_status (XPROCESS (proc)); | |
| 2797 if (EQ (XPROCESS (proc)->status, Qrun)) | |
| 2798 XPROCESS (proc)->status | |
| 2799 = Fcons (Qexit, Fcons (make_number (256), Qnil)); | |
| 2800 } | |
| 2801 } | |
| 648 | 2802 } /* end for each file descriptor */ |
| 2803 } /* end while exit conditions not met */ | |
| 2804 | |
|
8570
dd3dfde8f973
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
8390
diff
changeset
|
2805 waiting_for_user_input_p = 0; |
|
dd3dfde8f973
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
8390
diff
changeset
|
2806 |
| 648 | 2807 /* If calling from keyboard input, do not quit |
| 2808 since we want to return C-g as an input character. | |
| 2809 Otherwise, do pending quit if requested. */ | |
| 650 | 2810 if (XINT (read_kbd) >= 0) |
| 648 | 2811 { |
| 2812 /* Prevent input_pending from remaining set if we quit. */ | |
| 2813 clear_input_pending (); | |
| 2814 QUIT; | |
| 2815 } | |
|
15661
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2816 #ifdef hpux |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2817 /* AlainF 5-Jul-1996 |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2818 HP-UX 10.10 seems to have problems with signals coming in |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2819 Causes "poll: interrupted system call" messages when Emacs is run |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2820 in an X window |
|
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2821 Turn periodic alarms back on */ |
|
18378
22cd8d7dd5aa
(wait_reading_process_input): Don't check for
Richard M. Stallman <rms@gnu.org>
parents:
18329
diff
changeset
|
2822 start_polling (); |
|
15661
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2823 #endif |
|
25009
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2824 |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2825 #ifdef HAVE_X_WINDOWS |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2826 if (display_busy_cursor_p) |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2827 if (!inhibit_busy_cursor) |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2828 Fx_show_busy_cursor (); |
|
5733af0b62ce
(wait_reading_process_input): Show and hide busy
Gerd Moellmann <gerd@gnu.org>
parents:
24933
diff
changeset
|
2829 #endif |
|
15661
96debed5fb36
(wait_reading_process_input) [hpux]: Workaround for
Karl Heuer <kwzh@gnu.org>
parents:
15406
diff
changeset
|
2830 |
| 578 | 2831 return got_some_input; |
| 2832 } | |
| 2833 | |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2834 /* Given a list (FUNCTION ARGS...), apply FUNCTION to the ARGS. */ |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2835 |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2836 static Lisp_Object |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2837 read_process_output_call (fun_and_args) |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2838 Lisp_Object fun_and_args; |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2839 { |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2840 return apply1 (XCONS (fun_and_args)->car, XCONS (fun_and_args)->cdr); |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2841 } |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2842 |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2843 static Lisp_Object |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2844 read_process_output_error_handler (error) |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2845 Lisp_Object error; |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2846 { |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2847 cmd_error_internal (error, "error in process filter: "); |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2848 Vinhibit_quit = Qt; |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2849 update_echo_area (); |
|
11277
d4547e4b0aab
(read_process_output_error_handler)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
2850 Fsleep_for (make_number (2), Qnil); |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2851 } |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
2852 |
| 578 | 2853 /* Read pending output from the process channel, |
| 2854 starting with our buffered-ahead character if we have one. | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2855 Yield number of decoded characters read. |
| 578 | 2856 |
| 2857 This function reads at most 1024 characters. | |
| 2858 If you want to read all available subprocess output, | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2859 you must call it repeatedly until it returns zero. |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2860 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2861 The characters read are decoded according to PROC's coding-system |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2862 for decoding. */ |
| 578 | 2863 |
| 21514 | 2864 int |
| 578 | 2865 read_process_output (proc, channel) |
| 2866 Lisp_Object proc; | |
| 2867 register int channel; | |
| 2868 { | |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2869 register int nchars, nbytes; |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2870 char *chars; |
| 578 | 2871 #ifdef VMS |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2872 int chars_allocated = 0; /* If 1, `chars' should be freed later. */ |
| 578 | 2873 #else |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2874 char buf[1024]; |
| 578 | 2875 #endif |
| 2876 register Lisp_Object outstream; | |
| 2877 register struct buffer *old = current_buffer; | |
| 2878 register struct Lisp_Process *p = XPROCESS (proc); | |
| 2879 register int opoint; | |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
2880 struct coding_system *coding = proc_decode_coding_system[channel]; |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2881 int chars_in_decoding_buf = 0; /* If 1, `chars' points |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2882 XSTRING (p->decoding_buf)->data. */ |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2883 int carryover = XINT (p->decoding_carryover); |
| 578 | 2884 |
| 2885 #ifdef VMS | |
| 2886 VMS_PROC_STUFF *vs, *get_vms_process_pointer(); | |
| 2887 | |
| 2888 vs = get_vms_process_pointer (p->pid); | |
| 2889 if (vs) | |
| 2890 { | |
| 2891 if (!vs->iosb[0]) | |
|
25248
f0fc8443bdbb
(Fopen_network_stream): Use getaddrinfo.
Karl Heuer <kwzh@gnu.org>
parents:
25129
diff
changeset
|
2892 return (0); /* Really weird if it does this */ |
| 578 | 2893 if (!(vs->iosb[0] & 1)) |
| 2894 return -1; /* I/O error */ | |
| 2895 } | |
| 2896 else | |
| 2897 error ("Could not get VMS process pointer"); | |
| 2898 chars = vs->inputBuffer; | |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2899 nbytes = clean_vms_buffer (chars, vs->iosb[1]); |
|
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2900 if (nbytes <= 0) |
| 578 | 2901 { |
| 2902 start_vms_process_read (vs); /* Crank up the next read on the process */ | |
| 2903 return 1; /* Nothing worth printing, say we got 1 */ | |
| 2904 } | |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2905 if (carryover > 0) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2906 { |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2907 /* The data carried over in the previous decoding (which are at |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2908 the tail of decoding buffer) should be prepended to the new |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2909 data read to decode all together. */ |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2910 char *buf = (char *) xmalloc (nbytes + carryover); |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2911 |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2912 bcopy (XSTRING (p->decoding_buf)->data |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
2913 + STRING_BYTES (XSTRING (p->decoding_buf)) - carryover, |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2914 buf, carryover); |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2915 bcopy (chars, buf + carryover, nbytes); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2916 chars = buf; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2917 chars_allocated = 1; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2918 } |
| 578 | 2919 #else /* not VMS */ |
| 2920 | |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2921 if (carryover) |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2922 /* See the comment above. */ |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2923 bcopy (XSTRING (p->decoding_buf)->data |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
2924 + STRING_BYTES (XSTRING (p->decoding_buf)) - carryover, |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2925 buf, carryover); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2926 |
| 578 | 2927 if (proc_buffered_char[channel] < 0) |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2928 nbytes = read (channel, buf + carryover, (sizeof buf) - carryover); |
| 578 | 2929 else |
| 2930 { | |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2931 buf[carryover] = proc_buffered_char[channel]; |
| 578 | 2932 proc_buffered_char[channel] = -1; |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2933 nbytes = read (channel, buf + carryover + 1, |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2934 (sizeof buf) - carryover - 1); |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2935 if (nbytes < 0) |
|
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2936 nbytes = 1; |
| 578 | 2937 else |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2938 nbytes = nbytes + 1; |
| 578 | 2939 } |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2940 chars = buf; |
| 578 | 2941 #endif /* not VMS */ |
| 2942 | |
|
22523
b02a5ea8cf93
(read_process_output): Handle carryover correctly.
Kenichi Handa <handa@m17n.org>
parents:
22019
diff
changeset
|
2943 XSETINT (p->decoding_carryover, 0); |
|
b02a5ea8cf93
(read_process_output): Handle carryover correctly.
Kenichi Handa <handa@m17n.org>
parents:
22019
diff
changeset
|
2944 |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2945 /* At this point, NBYTES holds number of characters just received |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2946 (including the one in proc_buffered_char[channel]). */ |
|
23879
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
2947 if (nbytes <= 0) |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
2948 { |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
2949 if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK) |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
2950 return nbytes; |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
2951 coding->mode |= CODING_MODE_LAST_BLOCK; |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
2952 } |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2953 |
|
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2954 /* Now set NBYTES how many bytes we must decode. */ |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2955 nbytes += carryover; |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2956 nchars = nbytes; |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2957 |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2958 if (CODING_MAY_REQUIRE_DECODING (coding)) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2959 { |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
2960 int require = decoding_buffer_size (coding, nbytes); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2961 int result; |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2962 |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
2963 if (STRING_BYTES (XSTRING (p->decoding_buf)) < require) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2964 p->decoding_buf = make_uninit_string (require); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2965 result = decode_coding (coding, chars, XSTRING (p->decoding_buf)->data, |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
2966 nbytes, STRING_BYTES (XSTRING (p->decoding_buf))); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2967 carryover = nbytes - coding->consumed; |
|
22523
b02a5ea8cf93
(read_process_output): Handle carryover correctly.
Kenichi Handa <handa@m17n.org>
parents:
22019
diff
changeset
|
2968 if (carryover > 0) |
|
b02a5ea8cf93
(read_process_output): Handle carryover correctly.
Kenichi Handa <handa@m17n.org>
parents:
22019
diff
changeset
|
2969 { |
|
22536
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2970 /* Copy the carryover bytes to the end of p->decoding_buf, to |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2971 be processed on the next read. Since decoding_buffer_size |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2972 asks for an extra amount of space beyond the maximum |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2973 expected for the output, there should always be sufficient |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2974 space for the carryover (which is by definition a sequence |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2975 of bytes that was not long enough to be decoded, and thus |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2976 has a bounded length). */ |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2977 if (STRING_BYTES (XSTRING (p->decoding_buf)) |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2978 < coding->produced + carryover) |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2979 abort (); |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2980 bcopy (chars + coding->consumed, |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2981 XSTRING (p->decoding_buf)->data |
|
e4bcb7cb0038
(read_process_output): While processing carryover,
Kenichi Handa <handa@m17n.org>
parents:
22535
diff
changeset
|
2982 + STRING_BYTES (XSTRING (p->decoding_buf)) - carryover, |
|
22523
b02a5ea8cf93
(read_process_output): Handle carryover correctly.
Kenichi Handa <handa@m17n.org>
parents:
22019
diff
changeset
|
2983 carryover); |
|
b02a5ea8cf93
(read_process_output): Handle carryover correctly.
Kenichi Handa <handa@m17n.org>
parents:
22019
diff
changeset
|
2984 XSETINT (p->decoding_carryover, carryover); |
|
b02a5ea8cf93
(read_process_output): Handle carryover correctly.
Kenichi Handa <handa@m17n.org>
parents:
22019
diff
changeset
|
2985 } |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2986 |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2987 /* A new coding system might be found by `decode_coding'. */ |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2988 if (!EQ (p->decode_coding_system, coding->symbol)) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2989 { |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
2990 p->decode_coding_system = coding->symbol; |
|
19053
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2991 |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2992 /* Don't call setup_coding_system for |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2993 proc_decode_coding_system[channel] here. It is done in |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2994 detect_coding called via decode_coding above. */ |
|
7b5642657857
(read_process_output): Don't call setup_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
18974
diff
changeset
|
2995 |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
2996 /* If a coding system for encoding is not yet decided, we set |
|
20433
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
2997 it as the same as coding-system for decoding. |
|
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
2998 |
|
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
2999 But, before doing that we must check if |
|
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
3000 proc_encode_coding_system[p->outfd] surely points to a |
|
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
3001 valid memory because p->outfd will be changed once EOF is |
|
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
3002 sent to the process. */ |
|
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
3003 if (NILP (p->encode_coding_system) |
|
21530
be8599b6636a
(read_process_output): Fix mixing of Lisp_Object and
Andreas Schwab <schwab@suse.de>
parents:
21514
diff
changeset
|
3004 && proc_encode_coding_system[XINT (p->outfd)]) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3005 { |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3006 p->encode_coding_system = coding->symbol; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3007 setup_coding_system (coding->symbol, |
|
21530
be8599b6636a
(read_process_output): Fix mixing of Lisp_Object and
Andreas Schwab <schwab@suse.de>
parents:
21514
diff
changeset
|
3008 proc_encode_coding_system[XINT (p->outfd)]); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3009 } |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3010 } |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
3011 |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3012 #ifdef VMS |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3013 /* Now we don't need the contents of `chars'. */ |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3014 if (chars_allocated) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3015 free (chars); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3016 #endif |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3017 if (coding->produced == 0) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3018 return 0; |
|
18708
965c5ee65d86
(read_process_output): Add cast.
Richard M. Stallman <rms@gnu.org>
parents:
18648
diff
changeset
|
3019 chars = (char *) XSTRING (p->decoding_buf)->data; |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3020 nbytes = coding->produced; |
|
21281
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3021 nchars = (coding->fake_multibyte |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3022 ? multibyte_chars_in_text (chars, nbytes) |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3023 : coding->produced_char); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3024 chars_in_decoding_buf = 1; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3025 } |
|
22763
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3026 else |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3027 { |
|
22763
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3028 #ifdef VMS |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3029 if (chars_allocated) |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3030 { |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3031 /* Although we don't have to decode the received data, we |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3032 must move it to an area which we don't have to free. */ |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3033 if (! STRINGP (p->decoding_buf) |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3034 || STRING_BYTES (XSTRING (p->decoding_buf)) < nbytes) |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3035 p->decoding_buf = make_uninit_string (nbytes); |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3036 bcopy (chars, XSTRING (p->decoding_buf)->data, nbytes); |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3037 free (chars); |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3038 chars = XSTRING (p->decoding_buf)->data; |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3039 chars_in_decoding_buf = 1; |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3040 } |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3041 #endif |
|
21281
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3042 nchars = multibyte_chars_in_text (chars, nbytes); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3043 } |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3044 |
|
20433
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
3045 Vlast_coding_system_used = coding->symbol; |
|
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
3046 |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3047 /* If the caller required, let the process associated buffer |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3048 inherit the coding-system used to decode the process output. */ |
|
21848
050ea21cec87
(Fset_process_inherit_coding_system_flag, Fstart_process):
Richard M. Stallman <rms@gnu.org>
parents:
21798
diff
changeset
|
3049 if (! NILP (p->inherit_coding_system_flag) |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3050 && !NILP (p->buffer) && !NILP (XBUFFER (p->buffer)->name)) |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3051 { |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3052 struct buffer *prev_buf = current_buffer; |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3053 |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3054 Fset_buffer (p->buffer); |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3055 call1 (intern ("after-insert-file-set-buffer-file-coding-system"), |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3056 make_number (nbytes)); |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3057 set_buffer_internal (prev_buf); |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3058 } |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
3059 |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
3060 /* Read and dispose of the process output. */ |
| 578 | 3061 outstream = p->filter; |
| 3062 if (!NILP (outstream)) | |
| 3063 { | |
| 3064 /* We inhibit quit here instead of just catching it so that | |
| 3065 hitting ^G when a filter happens to be running won't screw | |
| 3066 it up. */ | |
| 3067 int count = specpdl_ptr - specpdl; | |
|
3510
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3068 Lisp_Object odeactivate; |
|
10914
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
3069 Lisp_Object obuffer, okeymap; |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
3070 Lisp_Object text; |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3071 int outer_running_asynch_code = running_asynch_code; |
|
23460
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
3072 int waiting = waiting_for_user_input_p; |
|
10914
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
3073 |
|
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
3074 /* No need to gcpro these, because all we do with them later |
|
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
3075 is test them for EQness, and none of them should be a string. */ |
|
3510
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3076 odeactivate = Vdeactivate_mark; |
|
10914
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
3077 XSETBUFFER (obuffer, current_buffer); |
|
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
3078 okeymap = current_buffer->keymap; |
|
3510
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3079 |
| 578 | 3080 specbind (Qinhibit_quit, Qt); |
|
8231
5226ed89c1a6
(Qlast_nonmenu_event): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8063
diff
changeset
|
3081 specbind (Qlast_nonmenu_event, Qt); |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
3082 |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3083 /* In case we get recursively called, |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3084 and we already saved the match data nonrecursively, |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3085 save the same match data in safely recursive fashion. */ |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3086 if (outer_running_asynch_code) |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3087 { |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3088 Lisp_Object tem; |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3089 /* Don't clobber the CURRENT match data, either! */ |
|
16728
309a750fd5c0
(read_process_output, exec_sentinel):
Richard M. Stallman <rms@gnu.org>
parents:
16718
diff
changeset
|
3090 tem = Fmatch_data (Qnil, Qnil); |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3091 restore_match_data (); |
|
21177
73f8ae8312c8
(exec_sentinel, read_process_output): Fstore_match_data => Fset_match_data.
Richard M. Stallman <rms@gnu.org>
parents:
21049
diff
changeset
|
3092 record_unwind_protect (Fset_match_data, Fmatch_data (Qnil, Qnil)); |
|
73f8ae8312c8
(exec_sentinel, read_process_output): Fstore_match_data => Fset_match_data.
Richard M. Stallman <rms@gnu.org>
parents:
21049
diff
changeset
|
3093 Fset_match_data (tem); |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3094 } |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3095 |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3096 /* For speed, if a search happens within this code, |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3097 save the match data in a special nonrecursive fashion. */ |
|
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potort? <pot@gnu.org>
parents:
9969
diff
changeset
|
3098 running_asynch_code = 1; |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3099 |
|
23930
a9f9015b5b83
(read_process_output): Decide the multibyteness of
Kenichi Handa <handa@m17n.org>
parents:
23879
diff
changeset
|
3100 /* The multibyteness of a string given to the filter is decided |
|
a9f9015b5b83
(read_process_output): Decide the multibyteness of
Kenichi Handa <handa@m17n.org>
parents:
23879
diff
changeset
|
3101 by which coding system we used for decoding. */ |
|
a9f9015b5b83
(read_process_output): Decide the multibyteness of
Kenichi Handa <handa@m17n.org>
parents:
23879
diff
changeset
|
3102 if (coding->type == coding_type_no_conversion |
|
a9f9015b5b83
(read_process_output): Decide the multibyteness of
Kenichi Handa <handa@m17n.org>
parents:
23879
diff
changeset
|
3103 || coding->type == coding_type_raw_text) |
|
a9f9015b5b83
(read_process_output): Decide the multibyteness of
Kenichi Handa <handa@m17n.org>
parents:
23879
diff
changeset
|
3104 text = make_unibyte_string (chars, nbytes); |
|
a9f9015b5b83
(read_process_output): Decide the multibyteness of
Kenichi Handa <handa@m17n.org>
parents:
23879
diff
changeset
|
3105 else |
|
a9f9015b5b83
(read_process_output): Decide the multibyteness of
Kenichi Handa <handa@m17n.org>
parents:
23879
diff
changeset
|
3106 text = make_multibyte_string (chars, nchars, nbytes); |
|
a9f9015b5b83
(read_process_output): Decide the multibyteness of
Kenichi Handa <handa@m17n.org>
parents:
23879
diff
changeset
|
3107 |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
3108 internal_condition_case_1 (read_process_output_call, |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
3109 Fcons (outstream, |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
3110 Fcons (proc, Fcons (text, Qnil))), |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
3111 !NILP (Vdebug_on_error) ? Qnil : Qerror, |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
3112 read_process_output_error_handler); |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3113 |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3114 /* If we saved the match data nonrecursively, restore it now. */ |
|
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potort? <pot@gnu.org>
parents:
9969
diff
changeset
|
3115 restore_match_data (); |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
3116 running_asynch_code = outer_running_asynch_code; |
| 578 | 3117 |
|
3666
c7ff787b096f
(read_process_output): Don't deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3608
diff
changeset
|
3118 /* Handling the process output should not deactivate the mark. */ |
|
3510
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3119 Vdeactivate_mark = odeactivate; |
|
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3120 |
|
23460
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
3121 /* Restore waiting_for_user_input_p as it was |
|
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
3122 when we were called, in case the filter clobbered it. */ |
|
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
3123 waiting_for_user_input_p = waiting; |
|
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
3124 |
|
12808
4db1f387e85f
(read_process_output, exec_sentinel): Call
Richard M. Stallman <rms@gnu.org>
parents:
12749
diff
changeset
|
3125 #if 0 /* Call record_asynch_buffer_change unconditionally, |
|
4db1f387e85f
(read_process_output, exec_sentinel): Call
Richard M. Stallman <rms@gnu.org>
parents:
12749
diff
changeset
|
3126 because we might have changed minor modes or other things |
|
4db1f387e85f
(read_process_output, exec_sentinel): Call
Richard M. Stallman <rms@gnu.org>
parents:
12749
diff
changeset
|
3127 that affect key bindings. */ |
|
10914
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
3128 if (! EQ (Fcurrent_buffer (), obuffer) |
|
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
3129 || ! EQ (current_buffer->keymap, okeymap)) |
|
12808
4db1f387e85f
(read_process_output, exec_sentinel): Call
Richard M. Stallman <rms@gnu.org>
parents:
12749
diff
changeset
|
3130 #endif |
|
13159
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
3131 /* But do it only if the caller is actually going to read events. |
|
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
3132 Otherwise there's no need to make him wake up, and it could |
|
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
3133 cause trouble (for example it would make Fsit_for return). */ |
|
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
3134 if (waiting_for_user_input_p == -1) |
|
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
3135 record_asynch_buffer_change (); |
|
6748
b1cde622fa65
(read_process_output): If buffer changes, record that fact.
Karl Heuer <kwzh@gnu.org>
parents:
6569
diff
changeset
|
3136 |
| 578 | 3137 #ifdef VMS |
| 3138 start_vms_process_read (vs); | |
| 3139 #endif | |
|
5561
fd7524d61a8d
(read_process_output): Supply second arg to unbind_to.
Richard M. Stallman <rms@gnu.org>
parents:
5548
diff
changeset
|
3140 unbind_to (count, Qnil); |
| 578 | 3141 return nchars; |
| 3142 } | |
| 3143 | |
| 3144 /* If no filter, write into buffer if it isn't dead. */ | |
| 3145 if (!NILP (p->buffer) && !NILP (XBUFFER (p->buffer)->name)) | |
| 3146 { | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3147 Lisp_Object old_read_only; |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3148 int old_begv, old_zv; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3149 int old_begv_byte, old_zv_byte; |
|
3510
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3150 Lisp_Object odeactivate; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3151 int before, before_byte; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3152 int opoint_byte; |
|
3510
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3153 |
|
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3154 odeactivate = Vdeactivate_mark; |
| 578 | 3155 |
| 3156 Fset_buffer (p->buffer); | |
|
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15895
diff
changeset
|
3157 opoint = PT; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3158 opoint_byte = PT_BYTE; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3159 old_read_only = current_buffer->read_only; |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3160 old_begv = BEGV; |
|
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3161 old_zv = ZV; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3162 old_begv_byte = BEGV_BYTE; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3163 old_zv_byte = ZV_BYTE; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3164 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3165 current_buffer->read_only = Qnil; |
| 578 | 3166 |
| 3167 /* Insert new output into buffer | |
| 3168 at the current end-of-output marker, | |
| 3169 thus preserving logical ordering of input and output. */ | |
| 3170 if (XMARKER (p->mark)->buffer) | |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3171 SET_PT_BOTH (clip_to_bounds (BEGV, marker_position (p->mark), ZV), |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3172 clip_to_bounds (BEGV_BYTE, marker_byte_position (p->mark), |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3173 ZV_BYTE)); |
| 578 | 3174 else |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3175 SET_PT_BOTH (ZV, ZV_BYTE); |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3176 before = PT; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3177 before_byte = PT_BYTE; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3178 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3179 /* If the output marker is outside of the visible region, save |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3180 the restriction and widen. */ |
|
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15895
diff
changeset
|
3181 if (! (BEGV <= PT && PT <= ZV)) |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3182 Fwiden (); |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3183 |
|
22763
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3184 if (NILP (current_buffer->enable_multibyte_characters)) |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3185 nchars = nbytes; |
|
059f1c33af70
(read_process_output): Even if we read data without
Kenichi Handa <handa@m17n.org>
parents:
22619
diff
changeset
|
3186 |
| 578 | 3187 /* Insert before markers in case we are inserting where |
| 3188 the buffer's mark is, and the user's next command is Meta-y. */ | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3189 if (chars_in_decoding_buf) |
|
21281
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3190 { |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3191 /* Since multibyteness of p->docoding_buf is corrupted, we |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3192 can't use insert_from_string_before_markers. */ |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3193 char *temp_buf; |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3194 |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3195 temp_buf = (char *) alloca (nbytes); |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3196 bcopy (XSTRING (p->decoding_buf)->data, temp_buf, nbytes); |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3197 insert_before_markers (temp_buf, nbytes); |
|
3763e516cf1e
(read_process_output): Count multibyte characters. If
Kenichi Handa <handa@m17n.org>
parents:
21249
diff
changeset
|
3198 } |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3199 else |
|
23762
f69129948f65
(read_process_output): Call signal_after_change.
Richard M. Stallman <rms@gnu.org>
parents:
23661
diff
changeset
|
3200 { |
|
f69129948f65
(read_process_output): Call signal_after_change.
Richard M. Stallman <rms@gnu.org>
parents:
23661
diff
changeset
|
3201 insert_1_both (chars, nchars, nbytes, 0, 1, 1); |
|
f69129948f65
(read_process_output): Call signal_after_change.
Richard M. Stallman <rms@gnu.org>
parents:
23661
diff
changeset
|
3202 signal_after_change (opoint, 0, PT - opoint); |
|
f69129948f65
(read_process_output): Call signal_after_change.
Richard M. Stallman <rms@gnu.org>
parents:
23661
diff
changeset
|
3203 } |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3204 set_marker_both (p->mark, p->buffer, PT, PT_BYTE); |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3205 |
| 578 | 3206 update_mode_lines++; |
| 3207 | |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3208 /* Make sure opoint and the old restrictions |
|
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3209 float ahead of any new text just as point would. */ |
|
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3210 if (opoint >= before) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3211 { |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3212 opoint += PT - before; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3213 opoint_byte += PT_BYTE - before_byte; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3214 } |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3215 if (old_begv > before) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3216 { |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3217 old_begv += PT - before; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3218 old_begv_byte += PT_BYTE - before_byte; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3219 } |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3220 if (old_zv >= before) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3221 { |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3222 old_zv += PT - before; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3223 old_zv_byte += PT_BYTE - before_byte; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3224 } |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3225 |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3226 /* If the restriction isn't what it should be, set it. */ |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3227 if (old_begv != BEGV || old_zv != ZV) |
|
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
3228 Fnarrow_to_region (make_number (old_begv), make_number (old_zv)); |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3229 |
|
3666
c7ff787b096f
(read_process_output): Don't deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3608
diff
changeset
|
3230 /* Handling the process output should not deactivate the mark. */ |
|
3510
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3231 Vdeactivate_mark = odeactivate; |
|
b4a552ca4e99
(read_process_output): Deactivate the mark.
Richard M. Stallman <rms@gnu.org>
parents:
3238
diff
changeset
|
3232 |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3233 current_buffer->read_only = old_read_only; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3234 SET_PT_BOTH (opoint, opoint_byte); |
| 578 | 3235 set_buffer_internal (old); |
| 3236 } | |
| 3237 #ifdef VMS | |
| 3238 start_vms_process_read (vs); | |
| 3239 #endif | |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
3240 return nbytes; |
| 578 | 3241 } |
| 3242 | |
| 3243 DEFUN ("waiting-for-user-input-p", Fwaiting_for_user_input_p, Swaiting_for_user_input_p, | |
| 3244 0, 0, 0, | |
|
7352
ef89b78c1a92
(wait_reading_process_input): Don't call prepare_menu_bars
Richard M. Stallman <rms@gnu.org>
parents:
7266
diff
changeset
|
3245 "Returns non-nil if emacs is waiting for input from the user.\n\ |
| 578 | 3246 This is intended for use by asynchronous process output filters and sentinels.") |
| 3247 () | |
| 3248 { | |
|
7352
ef89b78c1a92
(wait_reading_process_input): Don't call prepare_menu_bars
Richard M. Stallman <rms@gnu.org>
parents:
7266
diff
changeset
|
3249 return (waiting_for_user_input_p ? Qt : Qnil); |
| 578 | 3250 } |
| 3251 | |
| 3252 /* Sending data to subprocess */ | |
| 3253 | |
| 3254 jmp_buf send_process_frame; | |
| 3255 | |
| 3256 SIGTYPE | |
| 3257 send_process_trap () | |
| 3258 { | |
| 3259 #ifdef BSD4_1 | |
| 3260 sigrelse (SIGPIPE); | |
| 3261 sigrelse (SIGALRM); | |
| 3262 #endif /* BSD4_1 */ | |
| 3263 longjmp (send_process_frame, 1); | |
| 3264 } | |
| 3265 | |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3266 /* Send some data to process PROC. |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3267 BUF is the beginning of the data; LEN is the number of characters. |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3268 OBJECT is the Lisp object that the data comes from. |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3269 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3270 The data is encoded by PROC's coding-system for encoding before it |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3271 is sent. But if the data ends at the middle of multi-byte |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3272 representation, that incomplete sequence of bytes are sent without |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3273 being encoded. Should we store them in a buffer to prepend them to |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3274 the data send later? */ |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3275 |
| 21514 | 3276 void |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3277 send_process (proc, buf, len, object) |
|
11926
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
3278 volatile Lisp_Object proc; |
|
18585
64184009811b
(send_process): Make buf and temp_buf `unsigned char *'.
Richard M. Stallman <rms@gnu.org>
parents:
18540
diff
changeset
|
3279 unsigned char *buf; |
| 578 | 3280 int len; |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3281 Lisp_Object object; |
| 578 | 3282 { |
|
11926
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
3283 /* Use volatile to protect variables from being clobbered by longjmp. */ |
| 578 | 3284 int rv; |
|
11926
40d7e6f04ebe
(create_process, send_process): Add volatile qualifiers.
Karl Heuer <kwzh@gnu.org>
parents:
11845
diff
changeset
|
3285 volatile unsigned char *procname = XSTRING (XPROCESS (proc)->name)->data; |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3286 struct coding_system *coding; |
|
15895
85112cca0b22
(send_process): GCPRO object.
Richard M. Stallman <rms@gnu.org>
parents:
15717
diff
changeset
|
3287 struct gcpro gcpro1; |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3288 int carryover = XINT (XPROCESS (proc)->encoding_carryover); |
|
15895
85112cca0b22
(send_process): GCPRO object.
Richard M. Stallman <rms@gnu.org>
parents:
15717
diff
changeset
|
3289 |
|
85112cca0b22
(send_process): GCPRO object.
Richard M. Stallman <rms@gnu.org>
parents:
15717
diff
changeset
|
3290 GCPRO1 (object); |
| 578 | 3291 |
| 3292 #ifdef VMS | |
| 3293 struct Lisp_Process *p = XPROCESS (proc); | |
| 3294 VMS_PROC_STUFF *vs, *get_vms_process_pointer(); | |
| 3295 #endif /* VMS */ | |
| 3296 | |
| 3297 if (! NILP (XPROCESS (proc)->raw_status_low)) | |
| 3298 update_status (XPROCESS (proc)); | |
| 3299 if (! EQ (XPROCESS (proc)->status, Qrun)) | |
| 3300 error ("Process %s not running", procname); | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3301 if (XINT (XPROCESS (proc)->outfd) < 0) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3302 error ("Output file descriptor of %s is closed", procname); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3303 |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
3304 coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)]; |
|
20433
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
3305 Vlast_coding_system_used = coding->symbol; |
|
a43789debf48
(read_process_output): Fix previous change, i.e, if
Kenichi Handa <handa@m17n.org>
parents:
20428
diff
changeset
|
3306 |
|
20225
ca258a32a122
(create_process): Encode arguments for the process.
Kenichi Handa <handa@m17n.org>
parents:
19837
diff
changeset
|
3307 if (CODING_REQUIRE_ENCODING (coding)) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3308 { |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3309 int require = encoding_buffer_size (coding, len); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3310 int offset, dummy; |
|
18585
64184009811b
(send_process): Make buf and temp_buf `unsigned char *'.
Richard M. Stallman <rms@gnu.org>
parents:
18540
diff
changeset
|
3311 unsigned char *temp_buf = NULL; |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3312 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3313 /* Remember the offset of data because a string or a buffer may |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3314 be relocated. Setting OFFSET to -1 means we don't have to |
|
24867
4daf369d28c0
(send_process): Delete unsafe/redundant assignment.
Karl Heuer <kwzh@gnu.org>
parents:
24598
diff
changeset
|
3315 care about relocation. */ |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3316 offset = (BUFFERP (object) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3317 ? BUF_PTR_BYTE_POS (XBUFFER (object), buf) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3318 : (STRINGP (object) |
|
24867
4daf369d28c0
(send_process): Delete unsafe/redundant assignment.
Karl Heuer <kwzh@gnu.org>
parents:
24598
diff
changeset
|
3319 ? buf - XSTRING (object)->data |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3320 : -1)); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3321 |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3322 if (carryover > 0) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3323 { |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3324 temp_buf = (unsigned char *) xmalloc (len + carryover); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3325 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3326 if (offset >= 0) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3327 { |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3328 if (BUFFERP (object)) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3329 buf = BUF_BYTE_ADDRESS (XBUFFER (object), offset); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3330 else if (STRINGP (object)) |
|
18585
64184009811b
(send_process): Make buf and temp_buf `unsigned char *'.
Richard M. Stallman <rms@gnu.org>
parents:
18540
diff
changeset
|
3331 buf = offset + XSTRING (object)->data; |
|
24867
4daf369d28c0
(send_process): Delete unsafe/redundant assignment.
Karl Heuer <kwzh@gnu.org>
parents:
24598
diff
changeset
|
3332 /* Now we don't have to care about relocation. */ |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3333 offset = -1; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3334 } |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3335 bcopy ((XSTRING (XPROCESS (proc)->encoding_buf)->data |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
3336 + STRING_BYTES (XSTRING (XPROCESS (proc)->encoding_buf)) |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3337 - carryover), |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3338 temp_buf, |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3339 carryover); |
|
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3340 bcopy (buf, temp_buf + carryover, len); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3341 buf = temp_buf; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3342 } |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3343 |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
3344 if (STRING_BYTES (XSTRING (XPROCESS (proc)->encoding_buf)) < require) |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3345 { |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3346 XPROCESS (proc)->encoding_buf = make_uninit_string (require); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3347 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3348 if (offset >= 0) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3349 { |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3350 if (BUFFERP (object)) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3351 buf = BUF_BYTE_ADDRESS (XBUFFER (object), offset); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3352 else if (STRINGP (object)) |
|
18585
64184009811b
(send_process): Make buf and temp_buf `unsigned char *'.
Richard M. Stallman <rms@gnu.org>
parents:
18540
diff
changeset
|
3353 buf = offset + XSTRING (object)->data; |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3354 } |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3355 } |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3356 object = XPROCESS (proc)->encoding_buf; |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3357 encode_coding (coding, buf, XSTRING (object)->data, |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
3358 len, STRING_BYTES (XSTRING (object))); |
|
20715
5e983ddb85c9
(Fstart_process): Use raw-text instead of emacs-mule
Kenichi Handa <handa@m17n.org>
parents:
20708
diff
changeset
|
3359 len = coding->produced; |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3360 buf = XSTRING (object)->data; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3361 if (temp_buf) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3362 xfree (temp_buf); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
3363 } |
| 578 | 3364 |
| 3365 #ifdef VMS | |
| 3366 vs = get_vms_process_pointer (p->pid); | |
| 3367 if (vs == 0) | |
| 3368 error ("Could not find this process: %x", p->pid); | |
| 3369 else if (write_to_vms_process (vs, buf, len)) | |
| 3370 ; | |
| 3371 #else | |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3372 |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3373 if (pty_max_bytes == 0) |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3374 { |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3375 #if defined (HAVE_FPATHCONF) && defined (_PC_MAX_CANON) |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3376 pty_max_bytes = fpathconf (XFASTINT (XPROCESS (proc)->outfd), |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3377 _PC_MAX_CANON); |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3378 if (pty_max_bytes < 0) |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3379 pty_max_bytes = 250; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3380 #else |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3381 pty_max_bytes = 250; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3382 #endif |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3383 /* Deduct one, to leave space for the eof. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3384 pty_max_bytes--; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3385 } |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3386 |
| 578 | 3387 if (!setjmp (send_process_frame)) |
| 3388 while (len > 0) | |
| 3389 { | |
| 3390 int this = len; | |
| 621 | 3391 SIGTYPE (*old_sigpipe)(); |
| 6158 | 3392 int flush_pty = 0; |
| 3393 | |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3394 /* Decide how much data we can send in one batch. |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3395 Long lines need to be split into multiple batches. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3396 if (!NILP (XPROCESS (proc)->pty_flag)) |
| 6158 | 3397 { |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3398 /* Starting this at zero is always correct when not the first iteration |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3399 because the previous iteration ended by sending C-d. |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3400 It may not be correct for the first iteration |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3401 if a partial line was sent in a separate send_process call. |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3402 If that proves worth handling, we need to save linepos |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3403 in the process object. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3404 int linepos = 0; |
|
18585
64184009811b
(send_process): Make buf and temp_buf `unsigned char *'.
Richard M. Stallman <rms@gnu.org>
parents:
18540
diff
changeset
|
3405 unsigned char *ptr = buf; |
|
64184009811b
(send_process): Make buf and temp_buf `unsigned char *'.
Richard M. Stallman <rms@gnu.org>
parents:
18540
diff
changeset
|
3406 unsigned char *end = buf + len; |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3407 |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3408 /* Scan through this text for a line that is too long. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3409 while (ptr != end && linepos < pty_max_bytes) |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3410 { |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3411 if (*ptr == '\n') |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3412 linepos = 0; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3413 else |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3414 linepos++; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3415 ptr++; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3416 } |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3417 /* If we found one, break the line there |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3418 and put in a C-d to force the buffer through. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3419 this = ptr - buf; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3420 } |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3421 |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3422 /* Send this batch, using one or more write calls. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3423 while (this > 0) |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3424 { |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3425 old_sigpipe = (SIGTYPE (*) ()) signal (SIGPIPE, send_process_trap); |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3426 rv = write (XINT (XPROCESS (proc)->outfd), buf, this); |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3427 signal (SIGPIPE, old_sigpipe); |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3428 |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3429 if (rv < 0) |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3430 { |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3431 if (0 |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3432 #ifdef EWOULDBLOCK |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3433 || errno == EWOULDBLOCK |
| 6158 | 3434 #endif |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3435 #ifdef EAGAIN |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3436 || errno == EAGAIN |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3437 #endif |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3438 ) |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3439 /* Buffer is full. Wait, accepting input; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3440 that may allow the program |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3441 to finish doing output and read more. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3442 { |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3443 Lisp_Object zero; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3444 int offset; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3445 |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3446 /* Running filters might relocate buffers or strings. |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3447 Arrange to relocate BUF. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3448 if (BUFFERP (object)) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3449 offset = BUF_PTR_BYTE_POS (XBUFFER (object), buf); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3450 else if (STRINGP (object)) |
|
18585
64184009811b
(send_process): Make buf and temp_buf `unsigned char *'.
Richard M. Stallman <rms@gnu.org>
parents:
18540
diff
changeset
|
3451 offset = buf - XSTRING (object)->data; |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3452 |
|
9318
a14cc1712337
(make_process, list_processes_1, create_process, Faccept_process_output,
Karl Heuer <kwzh@gnu.org>
parents:
9277
diff
changeset
|
3453 XSETFASTINT (zero, 0); |
|
16718
ea26040865cb
(send_process) [EMACS_HAS_USECS]:
Richard M. Stallman <rms@gnu.org>
parents:
16644
diff
changeset
|
3454 #ifdef EMACS_HAS_USECS |
|
ea26040865cb
(send_process) [EMACS_HAS_USECS]:
Richard M. Stallman <rms@gnu.org>
parents:
16644
diff
changeset
|
3455 wait_reading_process_input (0, 20000, zero, 0); |
|
ea26040865cb
(send_process) [EMACS_HAS_USECS]:
Richard M. Stallman <rms@gnu.org>
parents:
16644
diff
changeset
|
3456 #else |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3457 wait_reading_process_input (1, 0, zero, 0); |
|
16718
ea26040865cb
(send_process) [EMACS_HAS_USECS]:
Richard M. Stallman <rms@gnu.org>
parents:
16644
diff
changeset
|
3458 #endif |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3459 |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3460 if (BUFFERP (object)) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3461 buf = BUF_BYTE_ADDRESS (XBUFFER (object), offset); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3462 else if (STRINGP (object)) |
|
18585
64184009811b
(send_process): Make buf and temp_buf `unsigned char *'.
Richard M. Stallman <rms@gnu.org>
parents:
18540
diff
changeset
|
3463 buf = offset + XSTRING (object)->data; |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3464 |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3465 rv = 0; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3466 } |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3467 else |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3468 /* This is a real error. */ |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3469 report_file_error ("writing to process", Fcons (proc, Qnil)); |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3470 } |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3471 buf += rv; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3472 len -= rv; |
|
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3473 this -= rv; |
| 6158 | 3474 } |
| 3475 | |
| 3476 /* If we sent just part of the string, put in an EOF | |
| 3477 to force it through, before we send the rest. */ | |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3478 if (len > 0) |
| 6158 | 3479 Fprocess_send_eof (proc); |
| 578 | 3480 } |
| 3481 #endif | |
| 3482 else | |
| 3483 { | |
| 3484 XPROCESS (proc)->raw_status_low = Qnil; | |
| 3485 XPROCESS (proc)->raw_status_high = Qnil; | |
| 3486 XPROCESS (proc)->status = Fcons (Qexit, Fcons (make_number (256), Qnil)); | |
| 3487 XSETINT (XPROCESS (proc)->tick, ++process_tick); | |
| 3488 deactivate_process (proc); | |
| 3489 #ifdef VMS | |
| 3490 error ("Error writing to process %s; closed it", procname); | |
| 3491 #else | |
| 3492 error ("SIGPIPE raised on process %s; closed it", procname); | |
| 3493 #endif | |
| 3494 } | |
|
15895
85112cca0b22
(send_process): GCPRO object.
Richard M. Stallman <rms@gnu.org>
parents:
15717
diff
changeset
|
3495 |
|
85112cca0b22
(send_process): GCPRO object.
Richard M. Stallman <rms@gnu.org>
parents:
15717
diff
changeset
|
3496 UNGCPRO; |
| 578 | 3497 } |
| 3498 | |
| 3499 DEFUN ("process-send-region", Fprocess_send_region, Sprocess_send_region, | |
| 3500 3, 3, 0, | |
| 3501 "Send current contents of region as input to PROCESS.\n\ | |
| 808 | 3502 PROCESS may be a process, a buffer, the name of a process or buffer, or\n\ |
| 3503 nil, indicating the current buffer's process.\n\ | |
| 578 | 3504 Called from program, takes three arguments, PROCESS, START and END.\n\ |
| 3505 If the region is more than 500 characters long,\n\ | |
| 3506 it is sent in several bunches. This may happen even for shorter regions.\n\ | |
| 3507 Output from processes can arrive in between bunches.") | |
| 3508 (process, start, end) | |
| 3509 Lisp_Object process, start, end; | |
| 3510 { | |
| 3511 Lisp_Object proc; | |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3512 int start1, end1; |
| 578 | 3513 |
| 3514 proc = get_process (process); | |
| 3515 validate_region (&start, &end); | |
| 3516 | |
| 3517 if (XINT (start) < GPT && XINT (end) > GPT) | |
|
18739
60f002497be1
(Fprocess_send_region): Convert move_gap argument to int.
Richard M. Stallman <rms@gnu.org>
parents:
18708
diff
changeset
|
3518 move_gap (XINT (start)); |
| 578 | 3519 |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3520 start1 = CHAR_TO_BYTE (XINT (start)); |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3521 end1 = CHAR_TO_BYTE (XINT (end)); |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
3522 send_process (proc, BYTE_POS_ADDR (start1), end1 - start1, |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3523 Fcurrent_buffer ()); |
| 578 | 3524 |
| 3525 return Qnil; | |
| 3526 } | |
| 3527 | |
| 3528 DEFUN ("process-send-string", Fprocess_send_string, Sprocess_send_string, | |
| 3529 2, 2, 0, | |
| 3530 "Send PROCESS the contents of STRING as input.\n\ | |
| 808 | 3531 PROCESS may be a process, a buffer, the name of a process or buffer, or\n\ |
| 3532 nil, indicating the current buffer's process.\n\ | |
| 578 | 3533 If STRING is more than 500 characters long,\n\ |
| 3534 it is sent in several bunches. This may happen even for shorter strings.\n\ | |
| 3535 Output from processes can arrive in between bunches.") | |
| 3536 (process, string) | |
| 3537 Lisp_Object process, string; | |
| 3538 { | |
| 3539 Lisp_Object proc; | |
| 3540 CHECK_STRING (string, 1); | |
| 3541 proc = get_process (process); | |
|
20594
6e5a5afbe628
(read_process_output): Use insert_1_both.
Richard M. Stallman <rms@gnu.org>
parents:
20551
diff
changeset
|
3542 send_process (proc, XSTRING (string)->data, |
|
21244
50929073a0ba
Use STRING_BYTES and SET_STRING_BYTES.
Richard M. Stallman <rms@gnu.org>
parents:
21177
diff
changeset
|
3543 STRING_BYTES (XSTRING (string)), string); |
| 578 | 3544 return Qnil; |
| 3545 } | |
| 3546 | |
|
24352
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3547 DEFUN ("process-running-child-p", Fprocess_running_child_p, |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3548 Sprocess_running_child_p, 0, 1, 0, |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3549 "Return t if PROCESS has given the terminal to a child.\n\ |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3550 If the operating system does not make it possible to find out,\n\ |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3551 return t unconditionally.") |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3552 (process) |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3553 Lisp_Object process; |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3554 { |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3555 /* Initialize in case ioctl doesn't exist or gives an error, |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3556 in a way that will cause returning t. */ |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3557 int gid = 0; |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3558 Lisp_Object proc; |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3559 struct Lisp_Process *p; |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3560 |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3561 proc = get_process (process); |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3562 p = XPROCESS (proc); |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3563 |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3564 if (!EQ (p->childp, Qt)) |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3565 error ("Process %s is not a subprocess", |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3566 XSTRING (p->name)->data); |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3567 if (XINT (p->infd) < 0) |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3568 error ("Process %s is not active", |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3569 XSTRING (p->name)->data); |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3570 |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3571 #ifdef TIOCGPGRP |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3572 if (!NILP (p->subtty)) |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3573 ioctl (XFASTINT (p->subtty), TIOCGPGRP, &gid); |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3574 else |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3575 ioctl (XINT (p->infd), TIOCGPGRP, &gid); |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3576 #endif /* defined (TIOCGPGRP ) */ |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3577 |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3578 if (gid == XFASTINT (p->pid)) |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3579 return Qnil; |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3580 return Qt; |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3581 } |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3582 |
| 578 | 3583 /* send a signal number SIGNO to PROCESS. |
|
24352
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3584 If CURRENT_GROUP is t, that means send to the process group |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3585 that currently owns the terminal being used to communicate with PROCESS. |
| 578 | 3586 This is used for various commands in shell mode. |
|
24352
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3587 If CURRENT_GROUP is lambda, that means send to the process group |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3588 that currently owns the terminal, but only if it is NOT the shell itself. |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3589 |
| 578 | 3590 If NOMSG is zero, insert signal-announcements into process's buffers |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3591 right away. |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3592 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3593 If we can, we try to signal PROCESS by sending control characters |
|
7220
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
3594 down the pty. This allows us to signal inferiors who have changed |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3595 their uid, for which killpg would return an EPERM error. */ |
| 578 | 3596 |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
3597 static void |
| 578 | 3598 process_send_signal (process, signo, current_group, nomsg) |
| 3599 Lisp_Object process; | |
| 3600 int signo; | |
| 3601 Lisp_Object current_group; | |
| 3602 int nomsg; | |
| 3603 { | |
| 3604 Lisp_Object proc; | |
| 3605 register struct Lisp_Process *p; | |
| 3606 int gid; | |
| 3607 int no_pgrp = 0; | |
| 3608 | |
| 3609 proc = get_process (process); | |
| 3610 p = XPROCESS (proc); | |
| 3611 | |
| 3612 if (!EQ (p->childp, Qt)) | |
| 3613 error ("Process %s is not a subprocess", | |
| 3614 XSTRING (p->name)->data); | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3615 if (XINT (p->infd) < 0) |
| 578 | 3616 error ("Process %s is not active", |
| 3617 XSTRING (p->name)->data); | |
| 3618 | |
| 3619 if (NILP (p->pty_flag)) | |
| 3620 current_group = Qnil; | |
| 3621 | |
| 3622 /* If we are using pgrps, get a pgrp number and make it negative. */ | |
| 3623 if (!NILP (current_group)) | |
| 3624 { | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3625 #ifdef SIGNALS_VIA_CHARACTERS |
| 578 | 3626 /* If possible, send signals to the entire pgrp |
| 3627 by sending an input character to it. */ | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3628 |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3629 /* TERMIOS is the latest and bestest, and seems most likely to |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3630 work. If the system has it, use it. */ |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3631 #ifdef HAVE_TERMIOS |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3632 struct termios t; |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3633 |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3634 switch (signo) |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3635 { |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3636 case SIGINT: |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3637 tcgetattr (XINT (p->infd), &t); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3638 send_process (proc, &t.c_cc[VINTR], 1, Qnil); |
|
2120
fc3cdca22f8d
* process.c (process_send_signal): In the TERMIOS code for sending
Jim Blandy <jimb@redhat.com>
parents:
1925
diff
changeset
|
3639 return; |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3640 |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3641 case SIGQUIT: |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3642 tcgetattr (XINT (p->infd), &t); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3643 send_process (proc, &t.c_cc[VQUIT], 1, Qnil); |
|
2120
fc3cdca22f8d
* process.c (process_send_signal): In the TERMIOS code for sending
Jim Blandy <jimb@redhat.com>
parents:
1925
diff
changeset
|
3644 return; |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3645 |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3646 case SIGTSTP: |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3647 tcgetattr (XINT (p->infd), &t); |
|
7414
33e5afbb62bf
(process_send_signal): If PREFER_VSUSP, use VSUSP instead of VSWTCH.
Richard M. Stallman <rms@gnu.org>
parents:
7352
diff
changeset
|
3648 #if defined (VSWTCH) && !defined (PREFER_VSUSP) |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3649 send_process (proc, &t.c_cc[VSWTCH], 1, Qnil); |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3650 #else |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3651 send_process (proc, &t.c_cc[VSUSP], 1, Qnil); |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3652 #endif |
|
2120
fc3cdca22f8d
* process.c (process_send_signal): In the TERMIOS code for sending
Jim Blandy <jimb@redhat.com>
parents:
1925
diff
changeset
|
3653 return; |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3654 } |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3655 |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3656 #else /* ! HAVE_TERMIOS */ |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3657 |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3658 /* On Berkeley descendants, the following IOCTL's retrieve the |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3659 current control characters. */ |
| 578 | 3660 #if defined (TIOCGLTC) && defined (TIOCGETC) |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3661 |
| 578 | 3662 struct tchars c; |
| 3663 struct ltchars lc; | |
| 3664 | |
| 3665 switch (signo) | |
| 3666 { | |
| 3667 case SIGINT: | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3668 ioctl (XINT (p->infd), TIOCGETC, &c); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3669 send_process (proc, &c.t_intrc, 1, Qnil); |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
3670 return; |
| 578 | 3671 case SIGQUIT: |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3672 ioctl (XINT (p->infd), TIOCGETC, &c); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3673 send_process (proc, &c.t_quitc, 1, Qnil); |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
3674 return; |
|
1012
a48ed1d416dd
* process.c (process_send_signal): Don't send SIGTSTP if the
Jim Blandy <jimb@redhat.com>
parents:
849
diff
changeset
|
3675 #ifdef SIGTSTP |
| 578 | 3676 case SIGTSTP: |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3677 ioctl (XINT (p->infd), TIOCGLTC, &lc); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3678 send_process (proc, &lc.t_suspc, 1, Qnil); |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
3679 return; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3680 #endif /* ! defined (SIGTSTP) */ |
| 578 | 3681 } |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3682 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3683 #else /* ! defined (TIOCGLTC) && defined (TIOCGETC) */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3684 |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3685 /* On SYSV descendants, the TCGETA ioctl retrieves the current control |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3686 characters. */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3687 #ifdef TCGETA |
| 578 | 3688 struct termio t; |
| 3689 switch (signo) | |
| 3690 { | |
| 3691 case SIGINT: | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3692 ioctl (XINT (p->infd), TCGETA, &t); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3693 send_process (proc, &t.c_cc[VINTR], 1, Qnil); |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
3694 return; |
| 578 | 3695 case SIGQUIT: |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3696 ioctl (XINT (p->infd), TCGETA, &t); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3697 send_process (proc, &t.c_cc[VQUIT], 1, Qnil); |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
3698 return; |
|
1569
52a69b6a8f96
* process.c [SYSV]: Don't include <termios.h>, <termio.h>, or
Jim Blandy <jimb@redhat.com>
parents:
1522
diff
changeset
|
3699 #ifdef SIGTSTP |
| 578 | 3700 case SIGTSTP: |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3701 ioctl (XINT (p->infd), TCGETA, &t); |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3702 send_process (proc, &t.c_cc[VSWTCH], 1, Qnil); |
|
1522
19ccf004b172
* process.c: (status_convert): Declare this to return a
Jim Blandy <jimb@redhat.com>
parents:
1323
diff
changeset
|
3703 return; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3704 #endif /* ! defined (SIGTSTP) */ |
| 578 | 3705 } |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3706 #else /* ! defined (TCGETA) */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3707 Your configuration files are messed up. |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3708 /* If your system configuration files define SIGNALS_VIA_CHARACTERS, |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3709 you'd better be using one of the alternatives above! */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3710 #endif /* ! defined (TCGETA) */ |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3711 #endif /* ! defined (TIOCGLTC) && defined (TIOCGETC) */ |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
3712 #endif /* ! defined HAVE_TERMIOS */ |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3713 #endif /* ! defined (SIGNALS_VIA_CHARACTERS) */ |
| 849 | 3714 |
| 3715 #ifdef TIOCGPGRP | |
| 578 | 3716 /* Get the pgrp using the tty itself, if we have that. |
| 3717 Otherwise, use the pty to get the pgrp. | |
| 3718 On pfa systems, saka@pfu.fujitsu.co.JP writes: | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3719 "TIOCGPGRP symbol defined in sys/ioctl.h at E50. |
|
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3720 But, TIOCGPGRP does not work on E50 ;-P works fine on E60" |
| 578 | 3721 His patch indicates that if TIOCGPGRP returns an error, then |
| 3722 we should just assume that p->pid is also the process group id. */ | |
| 3723 { | |
| 3724 int err; | |
| 3725 | |
| 3726 if (!NILP (p->subtty)) | |
| 3727 err = ioctl (XFASTINT (p->subtty), TIOCGPGRP, &gid); | |
| 3728 else | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3729 err = ioctl (XINT (p->infd), TIOCGPGRP, &gid); |
| 578 | 3730 |
| 3731 #ifdef pfa | |
| 3732 if (err == -1) | |
| 3733 gid = - XFASTINT (p->pid); | |
| 849 | 3734 #endif /* ! defined (pfa) */ |
| 578 | 3735 } |
| 3736 if (gid == -1) | |
| 3737 no_pgrp = 1; | |
| 3738 else | |
| 3739 gid = - gid; | |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
3740 #else /* ! defined (TIOCGPGRP ) */ |
| 849 | 3741 /* Can't select pgrps on this system, so we know that |
| 3742 the child itself heads the pgrp. */ | |
| 3743 gid = - XFASTINT (p->pid); | |
| 3744 #endif /* ! defined (TIOCGPGRP ) */ | |
|
24352
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3745 |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3746 /* If current_group is lambda, and the shell owns the terminal, |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3747 don't send any signal. */ |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3748 if (EQ (current_group, Qlambda) && gid == - XFASTINT (p->pid)) |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3749 return; |
| 578 | 3750 } |
| 3751 else | |
| 3752 gid = - XFASTINT (p->pid); | |
| 3753 | |
| 3754 switch (signo) | |
| 3755 { | |
| 3756 #ifdef SIGCONT | |
| 3757 case SIGCONT: | |
| 3758 p->raw_status_low = Qnil; | |
| 3759 p->raw_status_high = Qnil; | |
| 3760 p->status = Qrun; | |
| 3761 XSETINT (p->tick, ++process_tick); | |
| 3762 if (!nomsg) | |
| 3763 status_notify (); | |
| 3764 break; | |
| 849 | 3765 #endif /* ! defined (SIGCONT) */ |
| 578 | 3766 case SIGINT: |
| 3767 #ifdef VMS | |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3768 send_process (proc, "\003", 1, Qnil); /* ^C */ |
| 578 | 3769 goto whoosh; |
| 3770 #endif | |
| 3771 case SIGQUIT: | |
| 3772 #ifdef VMS | |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
3773 send_process (proc, "\031", 1, Qnil); /* ^Y */ |
| 578 | 3774 goto whoosh; |
| 3775 #endif | |
| 3776 case SIGKILL: | |
| 3777 #ifdef VMS | |
| 3778 sys$forcex (&(XFASTINT (p->pid)), 0, 1); | |
| 3779 whoosh: | |
| 3780 #endif | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3781 flush_pending_output (XINT (p->infd)); |
| 578 | 3782 break; |
| 3783 } | |
| 3784 | |
| 3785 /* If we don't have process groups, send the signal to the immediate | |
| 3786 subprocess. That isn't really right, but it's better than any | |
| 3787 obvious alternative. */ | |
| 3788 if (no_pgrp) | |
| 3789 { | |
| 3790 kill (XFASTINT (p->pid), signo); | |
| 3791 return; | |
| 3792 } | |
| 3793 | |
| 3794 /* gid may be a pid, or minus a pgrp's number */ | |
| 3795 #ifdef TIOCSIGSEND | |
| 3796 if (!NILP (current_group)) | |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
3797 ioctl (XINT (p->infd), TIOCSIGSEND, signo); |
| 578 | 3798 else |
| 3799 { | |
| 3800 gid = - XFASTINT (p->pid); | |
| 3801 kill (gid, signo); | |
| 3802 } | |
| 849 | 3803 #else /* ! defined (TIOCSIGSEND) */ |
| 578 | 3804 EMACS_KILLPG (-gid, signo); |
| 849 | 3805 #endif /* ! defined (TIOCSIGSEND) */ |
| 578 | 3806 } |
| 3807 | |
| 3808 DEFUN ("interrupt-process", Finterrupt_process, Sinterrupt_process, 0, 2, 0, | |
| 23405 | 3809 "Interrupt process PROCESS.\n\ |
| 808 | 3810 PROCESS may be a process, a buffer, or the name of a process or buffer.\n\ |
|
7220
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
3811 nil or no arg means current buffer's process.\n\ |
| 578 | 3812 Second arg CURRENT-GROUP non-nil means send signal to\n\ |
| 3813 the current process-group of the process's controlling terminal\n\ | |
| 3814 rather than to the process's own process group.\n\ | |
| 3815 If the process is a shell, this means interrupt current subjob\n\ | |
|
24352
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3816 rather than the shell.\n\ |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3817 \n\ |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3818 If CURRENT-GROUP is `lambda', and if the shell owns the terminal,\n\ |
|
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
3819 don't send the signal.") |
| 578 | 3820 (process, current_group) |
| 3821 Lisp_Object process, current_group; | |
| 3822 { | |
| 3823 process_send_signal (process, SIGINT, current_group, 0); | |
| 3824 return process; | |
| 3825 } | |
| 3826 | |
| 3827 DEFUN ("kill-process", Fkill_process, Skill_process, 0, 2, 0, | |
| 3828 "Kill process PROCESS. May be process or name of one.\n\ | |
| 3829 See function `interrupt-process' for more details on usage.") | |
| 3830 (process, current_group) | |
| 3831 Lisp_Object process, current_group; | |
| 3832 { | |
| 3833 process_send_signal (process, SIGKILL, current_group, 0); | |
| 3834 return process; | |
| 3835 } | |
| 3836 | |
| 3837 DEFUN ("quit-process", Fquit_process, Squit_process, 0, 2, 0, | |
| 3838 "Send QUIT signal to process PROCESS. May be process or name of one.\n\ | |
| 3839 See function `interrupt-process' for more details on usage.") | |
| 3840 (process, current_group) | |
| 3841 Lisp_Object process, current_group; | |
| 3842 { | |
| 3843 process_send_signal (process, SIGQUIT, current_group, 0); | |
| 3844 return process; | |
| 3845 } | |
| 3846 | |
| 3847 DEFUN ("stop-process", Fstop_process, Sstop_process, 0, 2, 0, | |
| 3848 "Stop process PROCESS. May be process or name of one.\n\ | |
| 3849 See function `interrupt-process' for more details on usage.") | |
| 3850 (process, current_group) | |
| 3851 Lisp_Object process, current_group; | |
| 3852 { | |
| 3853 #ifndef SIGTSTP | |
| 3854 error ("no SIGTSTP support"); | |
| 3855 #else | |
| 3856 process_send_signal (process, SIGTSTP, current_group, 0); | |
| 3857 #endif | |
| 3858 return process; | |
| 3859 } | |
| 3860 | |
| 3861 DEFUN ("continue-process", Fcontinue_process, Scontinue_process, 0, 2, 0, | |
| 3862 "Continue process PROCESS. May be process or name of one.\n\ | |
| 3863 See function `interrupt-process' for more details on usage.") | |
| 3864 (process, current_group) | |
| 3865 Lisp_Object process, current_group; | |
| 3866 { | |
| 3867 #ifdef SIGCONT | |
| 3868 process_send_signal (process, SIGCONT, current_group, 0); | |
| 3869 #else | |
| 3870 error ("no SIGCONT support"); | |
| 3871 #endif | |
| 3872 return process; | |
| 3873 } | |
| 3874 | |
| 3875 DEFUN ("signal-process", Fsignal_process, Ssignal_process, | |
| 3876 2, 2, "nProcess number: \nnSignal code: ", | |
|
11144
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3877 "Send the process with process id PID the signal with code SIGCODE.\n\ |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3878 PID must be an integer. The process need not be a child of this Emacs.\n\ |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3879 SIGCODE may be an integer, or a symbol whose name is a signal name.") |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3880 (pid, sigcode) |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3881 Lisp_Object pid, sigcode; |
| 578 | 3882 { |
| 3883 CHECK_NUMBER (pid, 0); | |
|
11144
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3884 |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3885 #define handle_signal(NAME, VALUE) \ |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3886 else if (!strcmp (name, NAME)) \ |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3887 XSETINT (sigcode, VALUE) |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3888 |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3889 if (INTEGERP (sigcode)) |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3890 ; |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3891 else |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3892 { |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3893 unsigned char *name; |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3894 |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3895 CHECK_SYMBOL (sigcode, 1); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3896 name = XSYMBOL (sigcode)->name->data; |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3897 |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3898 if (0) |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3899 ; |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3900 #ifdef SIGHUP |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3901 handle_signal ("SIGHUP", SIGHUP); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3902 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3903 #ifdef SIGINT |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3904 handle_signal ("SIGINT", SIGINT); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3905 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3906 #ifdef SIGQUIT |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3907 handle_signal ("SIGQUIT", SIGQUIT); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3908 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3909 #ifdef SIGILL |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3910 handle_signal ("SIGILL", SIGILL); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3911 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3912 #ifdef SIGABRT |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3913 handle_signal ("SIGABRT", SIGABRT); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3914 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3915 #ifdef SIGEMT |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3916 handle_signal ("SIGEMT", SIGEMT); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3917 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3918 #ifdef SIGKILL |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3919 handle_signal ("SIGKILL", SIGKILL); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3920 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3921 #ifdef SIGFPE |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3922 handle_signal ("SIGFPE", SIGFPE); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3923 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3924 #ifdef SIGBUS |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3925 handle_signal ("SIGBUS", SIGBUS); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3926 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3927 #ifdef SIGSEGV |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3928 handle_signal ("SIGSEGV", SIGSEGV); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3929 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3930 #ifdef SIGSYS |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3931 handle_signal ("SIGSYS", SIGSYS); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3932 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3933 #ifdef SIGPIPE |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3934 handle_signal ("SIGPIPE", SIGPIPE); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3935 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3936 #ifdef SIGALRM |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3937 handle_signal ("SIGALRM", SIGALRM); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3938 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3939 #ifdef SIGTERM |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3940 handle_signal ("SIGTERM", SIGTERM); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3941 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3942 #ifdef SIGURG |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3943 handle_signal ("SIGURG", SIGURG); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3944 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3945 #ifdef SIGSTOP |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3946 handle_signal ("SIGSTOP", SIGSTOP); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3947 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3948 #ifdef SIGTSTP |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3949 handle_signal ("SIGTSTP", SIGTSTP); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3950 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3951 #ifdef SIGCONT |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3952 handle_signal ("SIGCONT", SIGCONT); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3953 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3954 #ifdef SIGCHLD |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3955 handle_signal ("SIGCHLD", SIGCHLD); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3956 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3957 #ifdef SIGTTIN |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3958 handle_signal ("SIGTTIN", SIGTTIN); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3959 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3960 #ifdef SIGTTOU |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3961 handle_signal ("SIGTTOU", SIGTTOU); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3962 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3963 #ifdef SIGIO |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3964 handle_signal ("SIGIO", SIGIO); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3965 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3966 #ifdef SIGXCPU |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3967 handle_signal ("SIGXCPU", SIGXCPU); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3968 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3969 #ifdef SIGXFSZ |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3970 handle_signal ("SIGXFSZ", SIGXFSZ); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3971 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3972 #ifdef SIGVTALRM |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3973 handle_signal ("SIGVTALRM", SIGVTALRM); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3974 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3975 #ifdef SIGPROF |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3976 handle_signal ("SIGPROF", SIGPROF); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3977 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3978 #ifdef SIGWINCH |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3979 handle_signal ("SIGWINCH", SIGWINCH); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3980 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3981 #ifdef SIGINFO |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3982 handle_signal ("SIGINFO", SIGINFO); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3983 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3984 #ifdef SIGUSR1 |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3985 handle_signal ("SIGUSR1", SIGUSR1); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3986 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3987 #ifdef SIGUSR2 |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3988 handle_signal ("SIGUSR2", SIGUSR2); |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3989 #endif |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3990 else |
|
11148
117b32676686
(Fsignal_process): SIGCODE is a symbol, not a string.
Karl Heuer <kwzh@gnu.org>
parents:
11144
diff
changeset
|
3991 error ("Undefined signal name %s", name); |
|
11144
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3992 } |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3993 |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3994 #undef handle_signal |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3995 |
|
c2b689aeb934
(Fsignal_process): Allow signal names as well as numbers.
Richard M. Stallman <rms@gnu.org>
parents:
10914
diff
changeset
|
3996 return make_number (kill (XINT (pid), XINT (sigcode))); |
| 578 | 3997 } |
| 3998 | |
| 3999 DEFUN ("process-send-eof", Fprocess_send_eof, Sprocess_send_eof, 0, 1, 0, | |
| 4000 "Make PROCESS see end-of-file in its input.\n\ | |
| 23405 | 4001 EOF comes after any text already sent to it.\n\ |
| 808 | 4002 PROCESS may be a process, a buffer, the name of a process or buffer, or\n\ |
|
7884
066a06dd3bd3
(Fprocess_send_eof): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7764
diff
changeset
|
4003 nil, indicating the current buffer's process.\n\ |
|
066a06dd3bd3
(Fprocess_send_eof): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7764
diff
changeset
|
4004 If PROCESS is a network connection, or is a process communicating\n\ |
|
066a06dd3bd3
(Fprocess_send_eof): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7764
diff
changeset
|
4005 through a pipe (as opposed to a pty), then you cannot send any more\n\ |
|
066a06dd3bd3
(Fprocess_send_eof): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
7764
diff
changeset
|
4006 text to PROCESS after you call this function.") |
| 578 | 4007 (process) |
| 4008 Lisp_Object process; | |
| 4009 { | |
| 4010 Lisp_Object proc; | |
|
23879
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
4011 struct coding_system *coding; |
| 578 | 4012 |
| 4013 proc = get_process (process); | |
|
23879
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
4014 coding = proc_encode_coding_system[XINT (XPROCESS (proc)->outfd)]; |
|
2221
7edc78402205
(Fprocess_send_eof): Make sure proc is running.
Richard M. Stallman <rms@gnu.org>
parents:
2200
diff
changeset
|
4015 |
|
7edc78402205
(Fprocess_send_eof): Make sure proc is running.
Richard M. Stallman <rms@gnu.org>
parents:
2200
diff
changeset
|
4016 /* Make sure the process is really alive. */ |
|
7edc78402205
(Fprocess_send_eof): Make sure proc is running.
Richard M. Stallman <rms@gnu.org>
parents:
2200
diff
changeset
|
4017 if (! NILP (XPROCESS (proc)->raw_status_low)) |
|
7edc78402205
(Fprocess_send_eof): Make sure proc is running.
Richard M. Stallman <rms@gnu.org>
parents:
2200
diff
changeset
|
4018 update_status (XPROCESS (proc)); |
|
7edc78402205
(Fprocess_send_eof): Make sure proc is running.
Richard M. Stallman <rms@gnu.org>
parents:
2200
diff
changeset
|
4019 if (! EQ (XPROCESS (proc)->status, Qrun)) |
|
2222
d81c60c5f9ce
Fix typo in previous change.
Richard M. Stallman <rms@gnu.org>
parents:
2221
diff
changeset
|
4020 error ("Process %s not running", XSTRING (XPROCESS (proc)->name)->data); |
|
2221
7edc78402205
(Fprocess_send_eof): Make sure proc is running.
Richard M. Stallman <rms@gnu.org>
parents:
2200
diff
changeset
|
4021 |
|
23879
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
4022 if (CODING_REQUIRE_FLUSHING (coding)) |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
4023 { |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
4024 coding->mode |= CODING_MODE_LAST_BLOCK; |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
4025 send_process (proc, "", 0, Qnil); |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
4026 } |
|
18e5d1cfa74b
(read_process_output): If NBYTES is zero and
Kenichi Handa <handa@m17n.org>
parents:
23762
diff
changeset
|
4027 |
| 578 | 4028 #ifdef VMS |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
4029 send_process (proc, "\032", 1, Qnil); /* ^z */ |
| 578 | 4030 #else |
| 4031 if (!NILP (XPROCESS (proc)->pty_flag)) | |
|
8063
30861f2f4f84
(send_process): Major rewrite.
Richard M. Stallman <rms@gnu.org>
parents:
7937
diff
changeset
|
4032 send_process (proc, "\004", 1, Qnil); |
| 578 | 4033 else |
| 4034 { | |
|
22939
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4035 int old_outfd, new_outfd; |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4036 |
|
18329
ddaafa596bf5
(Fprocess_send_eof): Prooperly conditionalize prev. change.
Richard M. Stallman <rms@gnu.org>
parents:
18328
diff
changeset
|
4037 #ifdef HAVE_SHUTDOWN |
|
18328
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4038 /* If this is a network connection, or socketpair is used |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4039 for communication with the subprocess, call shutdown to cause EOF. |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4040 (In some old system, shutdown to socketpair doesn't work. |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4041 Then we just can't win.) */ |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4042 if (NILP (XPROCESS (proc)->pid) |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4043 || XINT (XPROCESS (proc)->outfd) == XINT (XPROCESS (proc)->infd)) |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4044 shutdown (XINT (XPROCESS (proc)->outfd), 1); |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4045 /* In case of socketpair, outfd == infd, so don't close it. */ |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4046 if (XINT (XPROCESS (proc)->outfd) != XINT (XPROCESS (proc)->infd)) |
|
0295bbed3c39
(Fprocess_send_eof): Use shutdown, if it's a socket.
Richard M. Stallman <rms@gnu.org>
parents:
18292
diff
changeset
|
4047 close (XINT (XPROCESS (proc)->outfd)); |
|
18329
ddaafa596bf5
(Fprocess_send_eof): Prooperly conditionalize prev. change.
Richard M. Stallman <rms@gnu.org>
parents:
18328
diff
changeset
|
4048 #else /* not HAVE_SHUTDOWN */ |
|
ddaafa596bf5
(Fprocess_send_eof): Prooperly conditionalize prev. change.
Richard M. Stallman <rms@gnu.org>
parents:
18328
diff
changeset
|
4049 close (XINT (XPROCESS (proc)->outfd)); |
|
ddaafa596bf5
(Fprocess_send_eof): Prooperly conditionalize prev. change.
Richard M. Stallman <rms@gnu.org>
parents:
18328
diff
changeset
|
4050 #endif /* not HAVE_SHUTDOWN */ |
|
22939
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4051 new_outfd = open (NULL_DEVICE, O_WRONLY); |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4052 old_outfd = XINT (XPROCESS (proc)->outfd); |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4053 |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4054 if (!proc_encode_coding_system[new_outfd]) |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4055 proc_encode_coding_system[new_outfd] |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4056 = (struct coding_system *) xmalloc (sizeof (struct coding_system)); |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4057 bcopy (proc_encode_coding_system[old_outfd], |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4058 proc_encode_coding_system[new_outfd], |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4059 sizeof (struct coding_system)); |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4060 bzero (proc_encode_coding_system[old_outfd], |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4061 sizeof (struct coding_system)); |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4062 |
|
572895549f80
(Fprocess_send_eof): Transfer proc_encode_coding_system
Richard M. Stallman <rms@gnu.org>
parents:
22864
diff
changeset
|
4063 XSETINT (XPROCESS (proc)->outfd, new_outfd); |
| 578 | 4064 } |
| 4065 #endif /* VMS */ | |
| 4066 return process; | |
| 4067 } | |
| 4068 | |
| 4069 /* Kill all processes associated with `buffer'. | |
| 4070 If `buffer' is nil, kill all processes */ | |
| 4071 | |
|
20382
dbad9367d232
(create_process, deactivate_process, close_process_descs):
Andreas Schwab <schwab@suse.de>
parents:
20225
diff
changeset
|
4072 void |
| 578 | 4073 kill_buffer_processes (buffer) |
| 4074 Lisp_Object buffer; | |
| 4075 { | |
| 4076 Lisp_Object tail, proc; | |
| 4077 | |
|
9952
9daedd94a204
(NETCONN_P, kill_buffer_processes): Use the new type-test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9882
diff
changeset
|
4078 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCONS (tail)->cdr) |
| 578 | 4079 { |
| 4080 proc = XCONS (XCONS (tail)->car)->cdr; | |
|
9952
9daedd94a204
(NETCONN_P, kill_buffer_processes): Use the new type-test macros.
Karl Heuer <kwzh@gnu.org>
parents:
9882
diff
changeset
|
4081 if (GC_PROCESSP (proc) |
| 578 | 4082 && (NILP (buffer) || EQ (XPROCESS (proc)->buffer, buffer))) |
| 4083 { | |
| 4084 if (NETCONN_P (proc)) | |
|
7764
fad00b057e50
(kill_buffer_processes): For net conn, use Fdelete_process.
Richard M. Stallman <rms@gnu.org>
parents:
7748
diff
changeset
|
4085 Fdelete_process (proc); |
|
5134
0a4e46e15304
(wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
4998
diff
changeset
|
4086 else if (XINT (XPROCESS (proc)->infd) >= 0) |
| 578 | 4087 process_send_signal (proc, SIGHUP, Qnil, 1); |
| 4088 } | |
| 4089 } | |
| 4090 } | |
| 4091 | |
| 4092 /* On receipt of a signal that a child status has changed, | |
| 4093 loop asking about children with changed statuses until | |
| 4094 the system says there are no more. | |
| 4095 All we do is change the status; | |
| 4096 we do not run sentinels or print notifications. | |
| 4097 That is saved for the next time keyboard input is done, | |
| 4098 in order to avoid timing errors. */ | |
| 4099 | |
| 4100 /** WARNING: this can be called during garbage collection. | |
| 4101 Therefore, it must not be fooled by the presence of mark bits in | |
| 4102 Lisp objects. */ | |
| 4103 | |
| 4104 /** USG WARNING: Although it is not obvious from the documentation | |
| 4105 in signal(2), on a USG system the SIGCLD handler MUST NOT call | |
| 4106 signal() before executing at least one wait(), otherwise the handler | |
| 4107 will be called again, resulting in an infinite loop. The relevant | |
| 4108 portion of the documentation reads "SIGCLD signals will be queued | |
| 4109 and the signal-catching function will be continually reentered until | |
| 4110 the queue is empty". Invoking signal() causes the kernel to reexamine | |
| 4111 the SIGCLD queue. Fred Fish, UniSoft Systems Inc. */ | |
| 4112 | |
| 4113 SIGTYPE | |
| 4114 sigchld_handler (signo) | |
| 4115 int signo; | |
| 4116 { | |
| 4117 int old_errno = errno; | |
| 4118 Lisp_Object proc; | |
| 4119 register struct Lisp_Process *p; | |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4120 extern EMACS_TIME *input_available_clear_time; |
| 578 | 4121 |
| 4122 #ifdef BSD4_1 | |
| 4123 extern int sigheld; | |
| 4124 sigheld |= sigbit (SIGCHLD); | |
| 4125 #endif | |
| 4126 | |
| 4127 while (1) | |
| 4128 { | |
| 4129 register int pid; | |
| 4130 WAITTYPE w; | |
| 4131 Lisp_Object tail; | |
| 4132 | |
| 4133 #ifdef WNOHANG | |
| 4134 #ifndef WUNTRACED | |
| 4135 #define WUNTRACED 0 | |
| 4136 #endif /* no WUNTRACED */ | |
| 4137 /* Keep trying to get a status until we get a definitive result. */ | |
| 4138 do | |
| 4139 { | |
| 4140 errno = 0; | |
| 4141 pid = wait3 (&w, WNOHANG | WUNTRACED, 0); | |
| 4142 } | |
| 4143 while (pid <= 0 && errno == EINTR); | |
| 4144 | |
| 4145 if (pid <= 0) | |
| 4146 { | |
| 4147 /* A real failure. We have done all our job, so return. */ | |
| 4148 | |
| 4149 /* USG systems forget handlers when they are used; | |
| 4150 must reestablish each time */ | |
|
16116
80a67b8f39e9
(create_process_1, sigchld_handler) [POSIX_SIGNALS]:
Richard M. Stallman <rms@gnu.org>
parents:
16076
diff
changeset
|
4151 #if defined (USG) && !defined (POSIX_SIGNALS) |
| 578 | 4152 signal (signo, sigchld_handler); /* WARNING - must come after wait3() */ |
| 4153 #endif | |
| 4154 #ifdef BSD4_1 | |
| 4155 sigheld &= ~sigbit (SIGCHLD); | |
| 4156 sigrelse (SIGCHLD); | |
| 4157 #endif | |
| 4158 errno = old_errno; | |
| 4159 return; | |
| 4160 } | |
| 4161 #else | |
| 4162 pid = wait (&w); | |
| 4163 #endif /* no WNOHANG */ | |
| 4164 | |
| 4165 /* Find the process that signaled us, and record its status. */ | |
| 4166 | |
| 4167 p = 0; | |
|
14496
beca72fdb420
(sigchld_handler): Use cleaner end-of-list test.
Karl Heuer <kwzh@gnu.org>
parents:
14458
diff
changeset
|
4168 for (tail = Vprocess_alist; CONSP (tail); tail = XCONS (tail)->cdr) |
| 578 | 4169 { |
| 4170 proc = XCONS (XCONS (tail)->car)->cdr; | |
| 4171 p = XPROCESS (proc); | |
| 4172 if (EQ (p->childp, Qt) && XFASTINT (p->pid) == pid) | |
| 4173 break; | |
| 4174 p = 0; | |
| 4175 } | |
| 4176 | |
| 4177 /* Look for an asynchronous process whose pid hasn't been filled | |
| 4178 in yet. */ | |
| 4179 if (p == 0) | |
|
14496
beca72fdb420
(sigchld_handler): Use cleaner end-of-list test.
Karl Heuer <kwzh@gnu.org>
parents:
14458
diff
changeset
|
4180 for (tail = Vprocess_alist; CONSP (tail); tail = XCONS (tail)->cdr) |
| 578 | 4181 { |
| 4182 proc = XCONS (XCONS (tail)->car)->cdr; | |
| 4183 p = XPROCESS (proc); | |
|
9115
59bc2d010b5f
(decode_status, Fprocessp, Fget_process, Fget_buffer_process, Fprocess_status,
Karl Heuer <kwzh@gnu.org>
parents:
9034
diff
changeset
|
4184 if (INTEGERP (p->pid) && XINT (p->pid) == -1) |
| 578 | 4185 break; |
| 4186 p = 0; | |
| 4187 } | |
| 4188 | |
| 4189 /* Change the status of the process that was found. */ | |
| 4190 if (p != 0) | |
| 4191 { | |
| 4192 union { int i; WAITTYPE wt; } u; | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4193 int clear_desc_flag = 0; |
| 578 | 4194 |
| 4195 XSETINT (p->tick, ++process_tick); | |
| 4196 u.wt = w; | |
|
12324
41bd44279127
(sigchld_handler): Change XSETFASTINT to XSETINT.
Richard M. Stallman <rms@gnu.org>
parents:
12215
diff
changeset
|
4197 XSETINT (p->raw_status_low, u.i & 0xffff); |
|
41bd44279127
(sigchld_handler): Change XSETFASTINT to XSETINT.
Richard M. Stallman <rms@gnu.org>
parents:
12215
diff
changeset
|
4198 XSETINT (p->raw_status_high, u.i >> 16); |
| 578 | 4199 |
| 4200 /* If process has terminated, stop waiting for its output. */ | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4201 if ((WIFSIGNALED (w) || WIFEXITED (w)) |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4202 && XINT (p->infd) >= 0) |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4203 clear_desc_flag = 1; |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4204 |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4205 /* We use clear_desc_flag to avoid a compiler bug in Microsoft C. */ |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4206 if (clear_desc_flag) |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4207 { |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4208 FD_CLR (XINT (p->infd), &input_wait_mask); |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4209 FD_CLR (XINT (p->infd), &non_keyboard_wait_mask); |
|
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4210 } |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4211 |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4212 /* Tell wait_reading_process_input that it needs to wake up and |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4213 look around. */ |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4214 if (input_available_clear_time) |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4215 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); |
| 578 | 4216 } |
| 4217 | |
| 4218 /* There was no asynchronous process found for that id. Check | |
| 4219 if we have a synchronous process. */ | |
| 4220 else | |
| 4221 { | |
| 4222 synch_process_alive = 0; | |
| 4223 | |
| 4224 /* Report the status of the synchronous process. */ | |
| 4225 if (WIFEXITED (w)) | |
| 4226 synch_process_retcode = WRETCODE (w); | |
| 4227 else if (WIFSIGNALED (w)) | |
|
5579
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4228 { |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4229 int code = WTERMSIG (w); |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4230 char *signame = 0; |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4231 |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4232 if (code < NSIG) |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4233 { |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
4234 #ifndef VMS |
|
9705
f7535deb913a
(status_message): Add a cast.
Richard M. Stallman <rms@gnu.org>
parents:
9697
diff
changeset
|
4235 /* Suppress warning if the table has const char *. */ |
|
f7535deb913a
(status_message): Add a cast.
Richard M. Stallman <rms@gnu.org>
parents:
9697
diff
changeset
|
4236 signame = (char *) sys_siglist[code]; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
4237 #else |
|
5579
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4238 signame = sys_errlist[code]; |
|
1594
b476a97ad17e
* systty.h, process.c, buffer.h, callproc.c, sysdep.c, dired.c:
Jim Blandy <jimb@redhat.com>
parents:
1569
diff
changeset
|
4239 #endif |
|
5579
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4240 } |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4241 if (signame == 0) |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4242 signame = "unknown"; |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4243 |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4244 synch_process_death = signame; |
|
466bc8ef8e21
(sigchld_handler, status_message): Handle a NULL in sys_siglist.
Richard M. Stallman <rms@gnu.org>
parents:
5561
diff
changeset
|
4245 } |
|
1925
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4246 |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4247 /* Tell wait_reading_process_input that it needs to wake up and |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4248 look around. */ |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4249 if (input_available_clear_time) |
|
3ddb163a9201
* process.c: Make sure we don't miss processes exiting, by having
Jim Blandy <jimb@redhat.com>
parents:
1886
diff
changeset
|
4250 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0); |
| 578 | 4251 } |
| 4252 | |
| 4253 /* On some systems, we must return right away. | |
| 4254 If any more processes want to signal us, we will | |
| 4255 get another signal. | |
| 4256 Otherwise (on systems that have WNOHANG), loop around | |
| 4257 to use up all the processes that have something to tell us. */ | |
|
9793
28267fcc61be
Use macros IS_ANY_SEP, IS_DIRECTORY_SEP,
Richard M. Stallman <rms@gnu.org>
parents:
9705
diff
changeset
|
4258 #if defined (USG) && ! (defined (HPUX) && defined (WNOHANG)) || defined (WINDOWSNT) |
|
16116
80a67b8f39e9
(create_process_1, sigchld_handler) [POSIX_SIGNALS]:
Richard M. Stallman <rms@gnu.org>
parents:
16076
diff
changeset
|
4259 #if defined (USG) && ! defined (POSIX_SIGNALS) |
| 578 | 4260 signal (signo, sigchld_handler); |
| 4261 #endif | |
| 4262 errno = old_errno; | |
| 4263 return; | |
| 4264 #endif /* USG, but not HPUX with WNOHANG */ | |
| 4265 } | |
| 4266 } | |
| 4267 | |
| 4268 | |
| 4269 static Lisp_Object | |
| 4270 exec_sentinel_unwind (data) | |
| 4271 Lisp_Object data; | |
| 4272 { | |
| 4273 XPROCESS (XCONS (data)->car)->sentinel = XCONS (data)->cdr; | |
| 4274 return Qnil; | |
| 4275 } | |
| 4276 | |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4277 static Lisp_Object |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4278 exec_sentinel_error_handler (error) |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4279 Lisp_Object error; |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4280 { |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4281 cmd_error_internal (error, "error in process sentinel: "); |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4282 Vinhibit_quit = Qt; |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4283 update_echo_area (); |
|
11277
d4547e4b0aab
(read_process_output_error_handler)
Richard M. Stallman <rms@gnu.org>
parents:
11235
diff
changeset
|
4284 Fsleep_for (make_number (2), Qnil); |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4285 } |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4286 |
| 578 | 4287 static void |
| 4288 exec_sentinel (proc, reason) | |
| 4289 Lisp_Object proc, reason; | |
| 4290 { | |
|
10914
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
4291 Lisp_Object sentinel, obuffer, odeactivate, okeymap; |
| 578 | 4292 register struct Lisp_Process *p = XPROCESS (proc); |
| 4293 int count = specpdl_ptr - specpdl; | |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4294 int outer_running_asynch_code = running_asynch_code; |
|
23460
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
4295 int waiting = waiting_for_user_input_p; |
| 578 | 4296 |
|
10914
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
4297 /* No need to gcpro these, because all we do with them later |
|
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
4298 is test them for EQness, and none of them should be a string. */ |
|
7454
8d9e41a175fa
(exec_sentinel): Don't deactivate the mark. Check for asynch buffer switch.
Karl Heuer <kwzh@gnu.org>
parents:
7414
diff
changeset
|
4299 odeactivate = Vdeactivate_mark; |
|
10914
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
4300 XSETBUFFER (obuffer, current_buffer); |
|
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
4301 okeymap = current_buffer->keymap; |
|
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
4302 |
| 578 | 4303 sentinel = p->sentinel; |
| 4304 if (NILP (sentinel)) | |
| 4305 return; | |
| 4306 | |
| 4307 /* Zilch the sentinel while it's running, to avoid recursive invocations; | |
| 4308 assure that it gets restored no matter how the sentinel exits. */ | |
| 4309 p->sentinel = Qnil; | |
| 4310 record_unwind_protect (exec_sentinel_unwind, Fcons (proc, sentinel)); | |
| 4311 /* Inhibit quit so that random quits don't screw up a running filter. */ | |
| 4312 specbind (Qinhibit_quit, Qt); | |
|
8231
5226ed89c1a6
(Qlast_nonmenu_event): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8063
diff
changeset
|
4313 specbind (Qlast_nonmenu_event, Qt); |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4314 |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4315 /* In case we get recursively called, |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4316 and we already saved the match data nonrecursively, |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4317 save the same match data in safely recursive fashion. */ |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4318 if (outer_running_asynch_code) |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4319 { |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4320 Lisp_Object tem; |
|
16728
309a750fd5c0
(read_process_output, exec_sentinel):
Richard M. Stallman <rms@gnu.org>
parents:
16718
diff
changeset
|
4321 tem = Fmatch_data (Qnil, Qnil); |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4322 restore_match_data (); |
|
21177
73f8ae8312c8
(exec_sentinel, read_process_output): Fstore_match_data => Fset_match_data.
Richard M. Stallman <rms@gnu.org>
parents:
21049
diff
changeset
|
4323 record_unwind_protect (Fset_match_data, Fmatch_data (Qnil, Qnil)); |
|
73f8ae8312c8
(exec_sentinel, read_process_output): Fstore_match_data => Fset_match_data.
Richard M. Stallman <rms@gnu.org>
parents:
21049
diff
changeset
|
4324 Fset_match_data (tem); |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4325 } |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4326 |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4327 /* For speed, if a search happens within this code, |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4328 save the match data in a special nonrecursive fashion. */ |
|
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potort? <pot@gnu.org>
parents:
9969
diff
changeset
|
4329 running_asynch_code = 1; |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4330 |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4331 internal_condition_case_1 (read_process_output_call, |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4332 Fcons (sentinel, |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4333 Fcons (proc, Fcons (reason, Qnil))), |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4334 !NILP (Vdebug_on_error) ? Qnil : Qerror, |
|
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4335 exec_sentinel_error_handler); |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4336 |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4337 /* If we saved the match data nonrecursively, restore it now. */ |
|
10032
f689803caa92
Added code for automatically saving and restoring the match data
Francesco Potort? <pot@gnu.org>
parents:
9969
diff
changeset
|
4338 restore_match_data (); |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4339 running_asynch_code = outer_running_asynch_code; |
|
7454
8d9e41a175fa
(exec_sentinel): Don't deactivate the mark. Check for asynch buffer switch.
Karl Heuer <kwzh@gnu.org>
parents:
7414
diff
changeset
|
4340 |
|
8d9e41a175fa
(exec_sentinel): Don't deactivate the mark. Check for asynch buffer switch.
Karl Heuer <kwzh@gnu.org>
parents:
7414
diff
changeset
|
4341 Vdeactivate_mark = odeactivate; |
|
23460
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
4342 |
|
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
4343 /* Restore waiting_for_user_input_p as it was |
|
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
4344 when we were called, in case the filter clobbered it. */ |
|
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
4345 waiting_for_user_input_p = waiting; |
|
94f4ba741f22
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
23405
diff
changeset
|
4346 |
|
12808
4db1f387e85f
(read_process_output, exec_sentinel): Call
Richard M. Stallman <rms@gnu.org>
parents:
12749
diff
changeset
|
4347 #if 0 |
|
10914
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
4348 if (! EQ (Fcurrent_buffer (), obuffer) |
|
413d44c0bd41
(exec_sentinel, read_process_output): If running filter
Richard M. Stallman <rms@gnu.org>
parents:
10744
diff
changeset
|
4349 || ! EQ (current_buffer->keymap, okeymap)) |
|
12808
4db1f387e85f
(read_process_output, exec_sentinel): Call
Richard M. Stallman <rms@gnu.org>
parents:
12749
diff
changeset
|
4350 #endif |
|
13159
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
4351 /* But do it only if the caller is actually going to read events. |
|
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
4352 Otherwise there's no need to make him wake up, and it could |
|
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
4353 cause trouble (for example it would make Fsit_for return). */ |
|
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
4354 if (waiting_for_user_input_p == -1) |
|
2af96ac471bc
(exec_sentinel, read_process_output):
Richard M. Stallman <rms@gnu.org>
parents:
12808
diff
changeset
|
4355 record_asynch_buffer_change (); |
|
7454
8d9e41a175fa
(exec_sentinel): Don't deactivate the mark. Check for asynch buffer switch.
Karl Heuer <kwzh@gnu.org>
parents:
7414
diff
changeset
|
4356 |
|
5561
fd7524d61a8d
(read_process_output): Supply second arg to unbind_to.
Richard M. Stallman <rms@gnu.org>
parents:
5548
diff
changeset
|
4357 unbind_to (count, Qnil); |
| 578 | 4358 } |
| 4359 | |
| 4360 /* Report all recent events of a change in process status | |
| 4361 (either run the sentinel or output a message). | |
| 4362 This is done while Emacs is waiting for keyboard input. */ | |
| 4363 | |
|
20382
dbad9367d232
(create_process, deactivate_process, close_process_descs):
Andreas Schwab <schwab@suse.de>
parents:
20225
diff
changeset
|
4364 void |
| 578 | 4365 status_notify () |
| 4366 { | |
| 4367 register Lisp_Object proc, buffer; | |
|
6515
df7438605e1e
(status_notify): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6429
diff
changeset
|
4368 Lisp_Object tail, msg; |
| 578 | 4369 struct gcpro gcpro1, gcpro2; |
| 4370 | |
|
6515
df7438605e1e
(status_notify): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6429
diff
changeset
|
4371 tail = Qnil; |
|
df7438605e1e
(status_notify): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6429
diff
changeset
|
4372 msg = Qnil; |
| 578 | 4373 /* We need to gcpro tail; if read_process_output calls a filter |
| 4374 which deletes a process and removes the cons to which tail points | |
| 4375 from Vprocess_alist, and then causes a GC, tail is an unprotected | |
| 4376 reference. */ | |
| 4377 GCPRO2 (tail, msg); | |
| 4378 | |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4379 /* Set this now, so that if new processes are created by sentinels |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4380 that we run, we get called again to handle their status changes. */ |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4381 update_tick = process_tick; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4382 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4383 for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail)) |
| 578 | 4384 { |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4385 Lisp_Object symbol; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4386 register struct Lisp_Process *p; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4387 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4388 proc = Fcdr (Fcar (tail)); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4389 p = XPROCESS (proc); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4390 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4391 if (XINT (p->tick) != XINT (p->update_tick)) |
| 578 | 4392 { |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4393 XSETINT (p->update_tick, XINT (p->tick)); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4394 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4395 /* If process is still active, read any output that remains. */ |
|
16644
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4396 while (! EQ (p->filter, Qt) |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4397 && XINT (p->infd) >= 0 |
|
3a93437adce1
(status_notify): Test p->infd > 0
Richard M. Stallman <rms@gnu.org>
parents:
16464
diff
changeset
|
4398 && read_process_output (proc, XINT (p->infd)) > 0); |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4399 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4400 buffer = p->buffer; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4401 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4402 /* Get the text to use for the message. */ |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4403 if (!NILP (p->raw_status_low)) |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4404 update_status (p); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4405 msg = status_message (p->status); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4406 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4407 /* If process is terminated, deactivate it or delete it. */ |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4408 symbol = p->status; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4409 if (CONSP (p->status)) |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4410 symbol = XCONS (p->status)->car; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4411 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4412 if (EQ (symbol, Qsignal) || EQ (symbol, Qexit) |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4413 || EQ (symbol, Qclosed)) |
| 578 | 4414 { |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4415 if (delete_exited_processes) |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4416 remove_process (proc); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4417 else |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4418 deactivate_process (proc); |
| 578 | 4419 } |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4420 |
|
16464
c1f19d8e5b80
(status_notify): Update p->tick again
Richard M. Stallman <rms@gnu.org>
parents:
16220
diff
changeset
|
4421 /* The actions above may have further incremented p->tick. |
|
c1f19d8e5b80
(status_notify): Update p->tick again
Richard M. Stallman <rms@gnu.org>
parents:
16220
diff
changeset
|
4422 So set p->update_tick again |
|
c1f19d8e5b80
(status_notify): Update p->tick again
Richard M. Stallman <rms@gnu.org>
parents:
16220
diff
changeset
|
4423 so that an error in the sentinel will not cause |
|
c1f19d8e5b80
(status_notify): Update p->tick again
Richard M. Stallman <rms@gnu.org>
parents:
16220
diff
changeset
|
4424 this code to be run again. */ |
|
c1f19d8e5b80
(status_notify): Update p->tick again
Richard M. Stallman <rms@gnu.org>
parents:
16220
diff
changeset
|
4425 XSETINT (p->update_tick, XINT (p->tick)); |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4426 /* Now output the message suitably. */ |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4427 if (!NILP (p->sentinel)) |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4428 exec_sentinel (proc, msg); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4429 /* Don't bother with a message in the buffer |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4430 when a process becomes runnable. */ |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4431 else if (!EQ (symbol, Qrun) && !NILP (buffer)) |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4432 { |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4433 Lisp_Object ro, tem; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4434 struct buffer *old = current_buffer; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4435 int opoint, opoint_byte; |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4436 int before, before_byte; |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4437 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4438 ro = XBUFFER (buffer)->read_only; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4439 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4440 /* Avoid error if buffer is deleted |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4441 (probably that's why the process is dead, too) */ |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4442 if (NILP (XBUFFER (buffer)->name)) |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4443 continue; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4444 Fset_buffer (buffer); |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
4445 |
|
16039
855c8d8ba0f0
Change all references from point to PT.
Karl Heuer <kwzh@gnu.org>
parents:
15895
diff
changeset
|
4446 opoint = PT; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4447 opoint_byte = PT_BYTE; |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4448 /* Insert new output into buffer |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4449 at the current end-of-output marker, |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4450 thus preserving logical ordering of input and output. */ |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4451 if (XMARKER (p->mark)->buffer) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4452 Fgoto_char (p->mark); |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4453 else |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4454 SET_PT_BOTH (ZV, ZV_BYTE); |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
4455 |
|
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
4456 before = PT; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4457 before_byte = PT_BYTE; |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4458 |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4459 tem = current_buffer->read_only; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4460 current_buffer->read_only = Qnil; |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4461 insert_string ("\nProcess "); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4462 Finsert (1, &p->name); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4463 insert_string (" "); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4464 Finsert (1, &msg); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4465 current_buffer->read_only = tem; |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4466 set_marker_both (p->mark, p->buffer, PT, PT_BYTE); |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4467 |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
4468 if (opoint >= before) |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4469 SET_PT_BOTH (opoint + (PT - before), |
|
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4470 opoint_byte + (PT_BYTE - before_byte)); |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
4471 else |
|
20551
5f17380c85f1
(status_notify): Use byte and char pointers.
Richard M. Stallman <rms@gnu.org>
parents:
20433
diff
changeset
|
4472 SET_PT_BOTH (opoint, opoint_byte); |
|
17604
77b137e2d9a7
(read_process_output): Update opoint, old_begv and old_zv
Richard M. Stallman <rms@gnu.org>
parents:
17247
diff
changeset
|
4473 |
|
12215
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4474 set_buffer_internal (old); |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4475 } |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4476 } |
|
2f1f03964f08
(status_notify): Undo May 18 change.
Richard M. Stallman <rms@gnu.org>
parents:
12132
diff
changeset
|
4477 } /* end for */ |
| 578 | 4478 |
| 4479 update_mode_lines++; /* in case buffers use %s in mode-line-format */ | |
| 4480 redisplay_preserve_echo_area (); | |
| 4481 | |
| 4482 UNGCPRO; | |
| 4483 } | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4484 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4485 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4486 DEFUN ("set-process-coding-system", Fset_process_coding_system, |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4487 Sset_process_coding_system, 1, 3, 0, |
| 23405 | 4488 "Set coding systems of PROCESS to DECODING and ENCODING.\n\ |
| 4489 DECODING will be used to decode subprocess output and ENCODING to\n\ | |
| 4490 encode subprocess input.") | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4491 (proc, decoding, encoding) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4492 register Lisp_Object proc, decoding, encoding; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4493 { |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4494 register struct Lisp_Process *p; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4495 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4496 CHECK_PROCESS (proc, 0); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4497 p = XPROCESS (proc); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4498 if (XINT (p->infd) < 0) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4499 error ("Input file descriptor of %s closed", XSTRING (p->name)->data); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4500 if (XINT (p->outfd) < 0) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4501 error ("Output file descriptor of %s closed", XSTRING (p->name)->data); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4502 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4503 p->decode_coding_system = Fcheck_coding_system (decoding); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4504 p->encode_coding_system = Fcheck_coding_system (encoding); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4505 setup_coding_system (decoding, |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
4506 proc_decode_coding_system[XINT (p->infd)]); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4507 setup_coding_system (encoding, |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
4508 proc_encode_coding_system[XINT (p->outfd)]); |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4509 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4510 return Qnil; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4511 } |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4512 |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4513 DEFUN ("process-coding-system", |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4514 Fprocess_coding_system, Sprocess_coding_system, 1, 1, 0, |
|
19133
a5f15ed1907d
(Fset_process_coding_system): Doc-string modified.
Kenichi Handa <handa@m17n.org>
parents:
19053
diff
changeset
|
4515 "Return a cons of coding systems for decoding and encoding of PROCESS.") |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4516 (proc) |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4517 register Lisp_Object proc; |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4518 { |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4519 CHECK_PROCESS (proc, 0); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4520 return Fcons (XPROCESS (proc)->decode_coding_system, |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4521 XPROCESS (proc)->encode_coding_system); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4522 } |
| 578 | 4523 |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4524 /* The first time this is called, assume keyboard input comes from DESC |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4525 instead of from where we used to expect it. |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4526 Subsequent calls mean assume input keyboard can come from DESC |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4527 in addition to other places. */ |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4528 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4529 static int add_keyboard_wait_descriptor_called_flag; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4530 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4531 void |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4532 add_keyboard_wait_descriptor (desc) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4533 int desc; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4534 { |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4535 if (! add_keyboard_wait_descriptor_called_flag) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4536 FD_CLR (0, &input_wait_mask); |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4537 add_keyboard_wait_descriptor_called_flag = 1; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4538 FD_SET (desc, &input_wait_mask); |
|
17224
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
4539 FD_SET (desc, &non_process_wait_mask); |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4540 if (desc > max_keyboard_desc) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4541 max_keyboard_desc = desc; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4542 } |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4543 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4544 /* From now on, do not expect DESC to give keyboard input. */ |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4545 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4546 void |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4547 delete_keyboard_wait_descriptor (desc) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4548 int desc; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4549 { |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4550 int fd; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4551 int lim = max_keyboard_desc; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4552 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4553 FD_CLR (desc, &input_wait_mask); |
|
17224
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
4554 FD_CLR (desc, &non_process_wait_mask); |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4555 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4556 if (desc == max_keyboard_desc) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4557 for (fd = 0; fd < lim; fd++) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4558 if (FD_ISSET (fd, &input_wait_mask) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4559 && !FD_ISSET (fd, &non_keyboard_wait_mask)) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4560 max_keyboard_desc = fd; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4561 } |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4562 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4563 /* Return nonzero if *MASK has a bit set |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4564 that corresponds to one of the keyboard input descriptors. */ |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4565 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4566 int |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4567 keyboard_bit_set (mask) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4568 SELECT_TYPE *mask; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4569 { |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4570 int fd; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4571 |
|
12541
33a4586124e9
(keyboard_bit_set): Fix one-off in loop end.
Karl Heuer <kwzh@gnu.org>
parents:
12491
diff
changeset
|
4572 for (fd = 0; fd <= max_keyboard_desc; fd++) |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4573 if (FD_ISSET (fd, mask) && FD_ISSET (fd, &input_wait_mask) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4574 && !FD_ISSET (fd, &non_keyboard_wait_mask)) |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4575 return 1; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4576 |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4577 return 0; |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4578 } |
|
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4579 |
| 21514 | 4580 void |
| 578 | 4581 init_process () |
| 4582 { | |
| 4583 register int i; | |
| 4584 | |
| 4585 #ifdef SIGCHLD | |
| 4586 #ifndef CANNOT_DUMP | |
| 4587 if (! noninteractive || initialized) | |
| 4588 #endif | |
| 4589 signal (SIGCHLD, sigchld_handler); | |
| 4590 #endif | |
| 4591 | |
| 4592 FD_ZERO (&input_wait_mask); | |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4593 FD_ZERO (&non_keyboard_wait_mask); |
|
17224
dd2545e79add
(wait_reading_process_input): If wait_for_cell,
Richard M. Stallman <rms@gnu.org>
parents:
17110
diff
changeset
|
4594 FD_ZERO (&non_process_wait_mask); |
|
7044
7032d07f5ad9
(max_process_desc): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
7013
diff
changeset
|
4595 max_process_desc = 0; |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
4596 |
|
9686
cd788aa8cb2a
Handle multiple keyboard input descriptors.
Richard M. Stallman <rms@gnu.org>
parents:
9334
diff
changeset
|
4597 FD_SET (0, &input_wait_mask); |
|
4682
c4d471244116
(keyboard_descriptor): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
4639
diff
changeset
|
4598 |
| 578 | 4599 Vprocess_alist = Qnil; |
| 4600 for (i = 0; i < MAXDESC; i++) | |
| 4601 { | |
| 4602 chan_process[i] = Qnil; | |
| 4603 proc_buffered_char[i] = -1; | |
| 4604 } | |
|
17110
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
4605 bzero (proc_decode_coding_system, sizeof proc_decode_coding_system); |
|
3a348cbb354f
(Fstart_process, Fopen_network_stream): Do not perform
Kenichi Handa <handa@m17n.org>
parents:
17041
diff
changeset
|
4606 bzero (proc_encode_coding_system, sizeof proc_encode_coding_system); |
|
22619
e64ada9fc033
(init_process): Initilize Vdefault_process_coding_system.
Kenichi Handa <handa@m17n.org>
parents:
22614
diff
changeset
|
4607 |
|
e64ada9fc033
(init_process): Initilize Vdefault_process_coding_system.
Kenichi Handa <handa@m17n.org>
parents:
22614
diff
changeset
|
4608 Vdefault_process_coding_system |
|
e64ada9fc033
(init_process): Initilize Vdefault_process_coding_system.
Kenichi Handa <handa@m17n.org>
parents:
22614
diff
changeset
|
4609 = (NILP (buffer_defaults.enable_multibyte_characters) |
|
e64ada9fc033
(init_process): Initilize Vdefault_process_coding_system.
Kenichi Handa <handa@m17n.org>
parents:
22614
diff
changeset
|
4610 ? Fcons (Qraw_text, Qnil) |
|
e64ada9fc033
(init_process): Initilize Vdefault_process_coding_system.
Kenichi Handa <handa@m17n.org>
parents:
22614
diff
changeset
|
4611 : Fcons (Qemacs_mule, Qnil)); |
| 578 | 4612 } |
|
4231
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
4613 |
| 21514 | 4614 void |
| 578 | 4615 syms_of_process () |
| 4616 { | |
| 4617 Qprocessp = intern ("processp"); | |
| 4618 staticpro (&Qprocessp); | |
| 4619 Qrun = intern ("run"); | |
| 4620 staticpro (&Qrun); | |
| 4621 Qstop = intern ("stop"); | |
| 4622 staticpro (&Qstop); | |
| 4623 Qsignal = intern ("signal"); | |
| 4624 staticpro (&Qsignal); | |
| 4625 | |
| 4626 /* Qexit is already staticpro'd by syms_of_eval; don't staticpro it | |
| 4627 here again. | |
| 4628 | |
| 4629 Qexit = intern ("exit"); | |
| 4630 staticpro (&Qexit); */ | |
| 4631 | |
| 4632 Qopen = intern ("open"); | |
| 4633 staticpro (&Qopen); | |
| 4634 Qclosed = intern ("closed"); | |
| 4635 staticpro (&Qclosed); | |
| 4636 | |
|
8231
5226ed89c1a6
(Qlast_nonmenu_event): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8063
diff
changeset
|
4637 Qlast_nonmenu_event = intern ("last-nonmenu-event"); |
|
5226ed89c1a6
(Qlast_nonmenu_event): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8063
diff
changeset
|
4638 staticpro (&Qlast_nonmenu_event); |
|
5226ed89c1a6
(Qlast_nonmenu_event): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
8063
diff
changeset
|
4639 |
| 578 | 4640 staticpro (&Vprocess_alist); |
| 4641 | |
| 4642 DEFVAR_BOOL ("delete-exited-processes", &delete_exited_processes, | |
| 4643 "*Non-nil means delete processes immediately when they exit.\n\ | |
| 4644 nil means don't delete them until `list-processes' is run."); | |
| 4645 | |
| 4646 delete_exited_processes = 1; | |
| 4647 | |
| 4648 DEFVAR_LISP ("process-connection-type", &Vprocess_connection_type, | |
| 4649 "Control type of device used to communicate with subprocesses.\n\ | |
|
7220
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
4650 Values are nil to use a pipe, or t or `pty' to use a pty.\n\ |
|
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
4651 The value has no effect if the system has no ptys or if all ptys are busy:\n\ |
|
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
4652 then a pipe is used in any case.\n\ |
|
a33eb16cab9d
(Fopen_network_stream): Retry the connect if EADDRINUSE. Ignore EISCONN.
Richard M. Stallman <rms@gnu.org>
parents:
7157
diff
changeset
|
4653 The value takes effect when `start-process' is called."); |
| 578 | 4654 Vprocess_connection_type = Qt; |
| 4655 | |
| 4656 defsubr (&Sprocessp); | |
| 4657 defsubr (&Sget_process); | |
| 4658 defsubr (&Sget_buffer_process); | |
| 4659 defsubr (&Sdelete_process); | |
| 4660 defsubr (&Sprocess_status); | |
| 4661 defsubr (&Sprocess_exit_status); | |
| 4662 defsubr (&Sprocess_id); | |
| 4663 defsubr (&Sprocess_name); | |
|
9030
b14532c71632
(exec_sentinel_error_handler): New function.
Richard M. Stallman <rms@gnu.org>
parents:
8570
diff
changeset
|
4664 defsubr (&Sprocess_tty_name); |
| 578 | 4665 defsubr (&Sprocess_command); |
| 4666 defsubr (&Sset_process_buffer); | |
| 4667 defsubr (&Sprocess_buffer); | |
| 4668 defsubr (&Sprocess_mark); | |
| 4669 defsubr (&Sset_process_filter); | |
| 4670 defsubr (&Sprocess_filter); | |
| 4671 defsubr (&Sset_process_sentinel); | |
|
16058
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
4672 defsubr (&Sprocess_sentinel); |
|
6830
bcaddbe53068
(Fset_process_window_size): New function.
Richard M. Stallman <rms@gnu.org>
parents:
6823
diff
changeset
|
4673 defsubr (&Sset_process_window_size); |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4674 defsubr (&Sset_process_inherit_coding_system_flag); |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4675 defsubr (&Sprocess_inherit_coding_system_flag); |
| 578 | 4676 defsubr (&Sprocess_kill_without_query); |
|
16058
924aeb9ed7c3
(Fprocess_contact): New function.
Richard M. Stallman <rms@gnu.org>
parents:
16053
diff
changeset
|
4677 defsubr (&Sprocess_contact); |
| 578 | 4678 defsubr (&Slist_processes); |
| 4679 defsubr (&Sprocess_list); | |
| 4680 defsubr (&Sstart_process); | |
| 4681 #ifdef HAVE_SOCKETS | |
| 4682 defsubr (&Sopen_network_stream); | |
| 4683 #endif /* HAVE_SOCKETS */ | |
| 4684 defsubr (&Saccept_process_output); | |
| 4685 defsubr (&Sprocess_send_region); | |
| 4686 defsubr (&Sprocess_send_string); | |
| 4687 defsubr (&Sinterrupt_process); | |
| 4688 defsubr (&Skill_process); | |
| 4689 defsubr (&Squit_process); | |
| 4690 defsubr (&Sstop_process); | |
| 4691 defsubr (&Scontinue_process); | |
|
24352
023601636a18
(syms_of_process): defsubr it.
Richard M. Stallman <rms@gnu.org>
parents:
23930
diff
changeset
|
4692 defsubr (&Sprocess_running_child_p); |
| 578 | 4693 defsubr (&Sprocess_send_eof); |
| 4694 defsubr (&Ssignal_process); | |
| 4695 defsubr (&Swaiting_for_user_input_p); | |
| 4696 /* defsubr (&Sprocess_connection); */ | |
|
17041
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4697 defsubr (&Sset_process_coding_system); |
|
b61cbe595be5
Include charset.h and coding.h.
Karl Heuer <kwzh@gnu.org>
parents:
16780
diff
changeset
|
4698 defsubr (&Sprocess_coding_system); |
| 578 | 4699 } |
| 4700 | |
| 588 | 4701 |
| 4702 #else /* not subprocesses */ | |
| 4703 | |
| 4704 #include <sys/types.h> | |
| 4705 #include <errno.h> | |
| 4706 | |
| 4707 #include "lisp.h" | |
| 4708 #include "systime.h" | |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4709 #include "charset.h" |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4710 #include "coding.h" |
| 588 | 4711 #include "termopts.h" |
|
12132
017f32786ed3
[!subprocesses]: Include sysselect.h.
Karl Heuer <kwzh@gnu.org>
parents:
11926
diff
changeset
|
4712 #include "sysselect.h" |
| 588 | 4713 |
| 765 | 4714 extern int frame_garbaged; |
| 588 | 4715 |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4716 extern EMACS_TIME timer_check (); |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4717 extern int timers_run; |
| 588 | 4718 |
| 4719 /* As described above, except assuming that there are no subprocesses: | |
| 4720 | |
| 4721 Wait for timeout to elapse and/or keyboard input to be available. | |
| 4722 | |
| 4723 time_limit is: | |
| 4724 timeout in seconds, or | |
| 4725 zero for no limit, or | |
| 4726 -1 means gobble data immediately available but don't wait for any. | |
| 4727 | |
| 650 | 4728 read_kbd is a Lisp_Object: |
| 588 | 4729 0 to ignore keyboard input, or |
| 4730 1 to return when input is available, or | |
| 4731 -1 means caller will actually read the input, so don't throw to | |
| 4732 the quit handler. | |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4733 a cons cell, meaning wait until its car is non-nil |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4734 (and gobble terminal input into the buffer if any arrives), or |
| 588 | 4735 We know that read_kbd will never be a Lisp_Process, since |
| 4736 `subprocesses' isn't defined. | |
| 4737 | |
| 4738 do_display != 0 means redisplay should be done to show subprocess | |
|
6429
1dbe24a029fd
(wait_reading_process_input, both versions): Don't call
Richard M. Stallman <rms@gnu.org>
parents:
6393
diff
changeset
|
4739 output that arrives. |
| 588 | 4740 |
|
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3510
diff
changeset
|
4741 Return true iff we received input from any process. */ |
| 588 | 4742 |
| 4743 int | |
| 4744 wait_reading_process_input (time_limit, microsecs, read_kbd, do_display) | |
| 650 | 4745 int time_limit, microsecs; |
| 4746 Lisp_Object read_kbd; | |
| 4747 int do_display; | |
| 588 | 4748 { |
|
22535
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4749 register int nfds; |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4750 EMACS_TIME end_time, timeout; |
|
14278
3562c5f43780
(wait_reading_process_input) [not subprocesses]: Do
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
4751 SELECT_TYPE waitchannels; |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4752 int xerrno; |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4753 Lisp_Object *wait_for_cell = 0; |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4754 |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4755 /* If waiting for non-nil in a cell, record where. */ |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4756 if (CONSP (read_kbd)) |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4757 { |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4758 wait_for_cell = &XCONS (read_kbd)->car; |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4759 XSETFASTINT (read_kbd, 0); |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4760 } |
| 588 | 4761 |
| 4762 /* What does time_limit really mean? */ | |
| 4763 if (time_limit || microsecs) | |
| 4764 { | |
| 4765 EMACS_GET_TIME (end_time); | |
|
22535
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4766 EMACS_SET_SECS_USECS (timeout, time_limit, microsecs); |
| 588 | 4767 EMACS_ADD_TIME (end_time, end_time, timeout); |
| 4768 } | |
| 4769 | |
| 4770 /* Turn off periodic alarms (in case they are in use) | |
| 4771 because the select emulator uses alarms. */ | |
| 4772 stop_polling (); | |
| 4773 | |
|
22535
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4774 while (1) |
| 588 | 4775 { |
|
14802
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4776 int timeout_reduced_for_timers = 0; |
| 588 | 4777 |
| 4778 /* If calling from keyboard input, do not quit | |
| 4779 since we want to return C-g as an input character. | |
| 4780 Otherwise, do pending quit if requested. */ | |
| 650 | 4781 if (XINT (read_kbd) >= 0) |
| 588 | 4782 QUIT; |
| 4783 | |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4784 /* Exit now if the cell we're waiting for became non-nil. */ |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4785 if (wait_for_cell && ! NILP (*wait_for_cell)) |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4786 break; |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4787 |
|
14802
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4788 /* Compute time from now till when time limit is up */ |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4789 /* Exit if already run out */ |
|
22535
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4790 if (time_limit == -1) |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4791 { |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4792 /* -1 specified for timeout means |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4793 gobble output available now |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4794 but don't wait at all. */ |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4795 |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4796 EMACS_SET_SECS_USECS (timeout, 0, 0); |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4797 } |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4798 else if (time_limit || microsecs) |
| 588 | 4799 { |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4800 EMACS_GET_TIME (timeout); |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4801 EMACS_SUB_TIME (timeout, end_time, timeout); |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4802 if (EMACS_TIME_NEG_P (timeout)) |
| 588 | 4803 break; |
| 4804 } | |
|
22535
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4805 else |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4806 { |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4807 EMACS_SET_SECS_USECS (timeout, 100000, 0); |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4808 } |
| 588 | 4809 |
|
14802
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4810 /* If our caller will not immediately handle keyboard events, |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4811 run timer events directly. |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4812 (Callers that will immediately read keyboard events |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4813 call timer_delay on their own.) */ |
|
15064
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4814 if (! wait_for_cell) |
|
14802
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4815 { |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4816 EMACS_TIME timer_delay; |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4817 int old_timers_run; |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4818 |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4819 retry: |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4820 old_timers_run = timers_run; |
|
14802
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4821 timer_delay = timer_check (1); |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4822 if (timers_run != old_timers_run && do_display) |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4823 { |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4824 redisplay_preserve_echo_area (); |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4825 /* We must retry, since a timer may have requeued itself |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4826 and that could alter the time delay. */ |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4827 goto retry; |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4828 } |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4829 |
|
22535
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4830 /* If there is unread keyboard input, also return. */ |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4831 if (XINT (read_kbd) != 0 |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4832 && requeued_events_pending_p ()) |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4833 break; |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4834 |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4835 if (! EMACS_TIME_NEG_P (timer_delay) && time_limit != -1) |
|
14802
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4836 { |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4837 EMACS_TIME difference; |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4838 EMACS_SUB_TIME (difference, timer_delay, timeout); |
|
14802
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4839 if (EMACS_TIME_NEG_P (difference)) |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4840 { |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4841 timeout = timer_delay; |
|
14802
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4842 timeout_reduced_for_timers = 1; |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4843 } |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4844 } |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4845 } |
|
45827a5afe4d
[!subprocesses] (wait_reading_process_input):
Richard M. Stallman <rms@gnu.org>
parents:
14785
diff
changeset
|
4846 |
| 588 | 4847 /* Cause C-g and alarm signals to take immediate action, |
| 4848 and cause input available signals to zero out timeout. */ | |
| 650 | 4849 if (XINT (read_kbd) < 0) |
| 588 | 4850 set_waiting_for_input (&timeout); |
| 4851 | |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4852 /* Wait till there is something to do. */ |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4853 |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4854 if (! XINT (read_kbd) && wait_for_cell == 0) |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4855 FD_ZERO (&waitchannels); |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4856 else |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4857 FD_SET (0, &waitchannels); |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4858 |
| 765 | 4859 /* If a frame has been newly mapped and needs updating, |
| 588 | 4860 reprocess its display stuff. */ |
|
6429
1dbe24a029fd
(wait_reading_process_input, both versions): Don't call
Richard M. Stallman <rms@gnu.org>
parents:
6393
diff
changeset
|
4861 if (frame_garbaged && do_display) |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4862 { |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4863 clear_waiting_for_input (); |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4864 redisplay_preserve_echo_area (); |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4865 if (XINT (read_kbd) < 0) |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4866 set_waiting_for_input (&timeout); |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4867 } |
| 588 | 4868 |
|
15025
e5f54fd1c352
(wait_reading_process_input) [!subprocesses]:
Richard M. Stallman <rms@gnu.org>
parents:
15021
diff
changeset
|
4869 if (XINT (read_kbd) && detect_input_pending ()) |
|
e5f54fd1c352
(wait_reading_process_input) [!subprocesses]:
Richard M. Stallman <rms@gnu.org>
parents:
15021
diff
changeset
|
4870 { |
|
e5f54fd1c352
(wait_reading_process_input) [!subprocesses]:
Richard M. Stallman <rms@gnu.org>
parents:
15021
diff
changeset
|
4871 nfds = 0; |
|
e5f54fd1c352
(wait_reading_process_input) [!subprocesses]:
Richard M. Stallman <rms@gnu.org>
parents:
15021
diff
changeset
|
4872 FD_ZERO (&waitchannels); |
|
e5f54fd1c352
(wait_reading_process_input) [!subprocesses]:
Richard M. Stallman <rms@gnu.org>
parents:
15021
diff
changeset
|
4873 } |
|
e5f54fd1c352
(wait_reading_process_input) [!subprocesses]:
Richard M. Stallman <rms@gnu.org>
parents:
15021
diff
changeset
|
4874 else |
|
e5f54fd1c352
(wait_reading_process_input) [!subprocesses]:
Richard M. Stallman <rms@gnu.org>
parents:
15021
diff
changeset
|
4875 nfds = select (1, &waitchannels, (SELECT_TYPE *)0, (SELECT_TYPE *)0, |
|
e5f54fd1c352
(wait_reading_process_input) [!subprocesses]:
Richard M. Stallman <rms@gnu.org>
parents:
15021
diff
changeset
|
4876 &timeout); |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4877 |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4878 xerrno = errno; |
| 588 | 4879 |
| 4880 /* Make C-g and alarm signals set flags again */ | |
| 4881 clear_waiting_for_input (); | |
| 4882 | |
| 4883 /* If we woke up due to SIGWINCH, actually change size now. */ | |
|
25356
5db69f7aadca
Call change_frame_size and do_pending_window_change with
Gerd Moellmann <gerd@gnu.org>
parents:
25262
diff
changeset
|
4884 do_pending_window_change (0); |
| 588 | 4885 |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4886 if (time_limit && nfds == 0 && ! timeout_reduced_for_timers) |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4887 /* We waited the full specified time, so return now. */ |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4888 break; |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4889 |
| 588 | 4890 if (nfds == -1) |
| 4891 { | |
| 4892 /* If the system call was interrupted, then go around the | |
| 4893 loop again. */ | |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4894 if (xerrno == EINTR) |
|
14278
3562c5f43780
(wait_reading_process_input) [not subprocesses]: Do
Karl Heuer <kwzh@gnu.org>
parents:
14186
diff
changeset
|
4895 FD_ZERO (&waitchannels); |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4896 else |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4897 error ("select error: %s", strerror (xerrno)); |
| 588 | 4898 } |
| 4899 #ifdef sun | |
| 4900 else if (nfds > 0 && (waitchannels & 1) && interrupt_input) | |
| 4901 /* System sometimes fails to deliver SIGIO. */ | |
| 4902 kill (getpid (), SIGIO); | |
| 4903 #endif | |
|
3915
55ed7a65746e
(wait_reading_process_input): Use SIGIO only if defined.
Richard M. Stallman <rms@gnu.org>
parents:
3826
diff
changeset
|
4904 #ifdef SIGIO |
| 650 | 4905 if (XINT (read_kbd) && interrupt_input && (waitchannels & 1)) |
|
14736
b17ec81a6294
(wait_reading_process_input): Use getpid when generating SIGIO.
Richard M. Stallman <rms@gnu.org>
parents:
14671
diff
changeset
|
4906 kill (getpid (), SIGIO); |
|
3915
55ed7a65746e
(wait_reading_process_input): Use SIGIO only if defined.
Richard M. Stallman <rms@gnu.org>
parents:
3826
diff
changeset
|
4907 #endif |
| 588 | 4908 |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4909 /* Check for keyboard input */ |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4910 |
|
15064
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4911 if ((XINT (read_kbd) != 0) |
|
14806
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4912 && detect_input_pending_run_timers (do_display)) |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4913 { |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4914 swallow_events (do_display); |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4915 if (detect_input_pending_run_timers (do_display)) |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4916 break; |
|
232b90ad50e8
(wait_reading_process_input) [! subprocesses]: Run
Karl Heuer <kwzh@gnu.org>
parents:
14802
diff
changeset
|
4917 } |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4918 |
|
22535
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4919 /* If there is unread keyboard input, also return. */ |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4920 if (XINT (read_kbd) != 0 |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4921 && requeued_events_pending_p ()) |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4922 break; |
|
fd9324c5a498
(wait_reading_process_input): Recompute timeout each
Eli Zaretskii <eliz@gnu.org>
parents:
22523
diff
changeset
|
4923 |
|
15064
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4924 /* If wait_for_cell. check for keyboard input |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4925 but don't run any timers. |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4926 ??? (It seems wrong to me to check for keyboard |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4927 input at all when wait_for_cell, but the code |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4928 has been this way since July 1994. |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4929 Try changing this after version 19.31.) */ |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4930 if (wait_for_cell |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4931 && detect_input_pending ()) |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4932 { |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4933 swallow_events (do_display); |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4934 if (detect_input_pending ()) |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4935 break; |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4936 } |
|
fb0f2804c34a
(wait_reading_process_input, both definitions):
Richard M. Stallman <rms@gnu.org>
parents:
15025
diff
changeset
|
4937 |
|
15021
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4938 /* Exit now if the cell we're waiting for became non-nil. */ |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4939 if (wait_for_cell && ! NILP (*wait_for_cell)) |
|
af36df262fc5
(wait_reading_process_input) [!subprocesses]: Handle
Richard M. Stallman <rms@gnu.org>
parents:
14998
diff
changeset
|
4940 break; |
| 588 | 4941 } |
| 4942 | |
|
2120
fc3cdca22f8d
* process.c (process_send_signal): In the TERMIOS code for sending
Jim Blandy <jimb@redhat.com>
parents:
1925
diff
changeset
|
4943 start_polling (); |
|
fc3cdca22f8d
* process.c (process_send_signal): In the TERMIOS code for sending
Jim Blandy <jimb@redhat.com>
parents:
1925
diff
changeset
|
4944 |
| 588 | 4945 return 0; |
| 4946 } | |
| 4947 | |
| 4948 | |
| 4949 DEFUN ("get-buffer-process", Fget_buffer_process, Sget_buffer_process, 1, 1, 0, | |
|
6345
862304c3b015
(Fget_buffer_process): Fix typo in comment.
Karl Heuer <kwzh@gnu.org>
parents:
6313
diff
changeset
|
4950 /* Don't confuse make-docfile by having two doc strings for this function. |
|
4231
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
4951 make-docfile does not pay attention to #if, for good reason! */ |
|
91a883c56382
(Fget_buffer_process): Delete doc string from
Richard M. Stallman <rms@gnu.org>
parents:
4057
diff
changeset
|
4952 0) |
| 588 | 4953 (name) |
| 4954 register Lisp_Object name; | |
| 4955 { | |
| 4956 return Qnil; | |
| 4957 } | |
| 4958 | |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4959 DEFUN ("process-inherit-coding-system-flag", |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4960 Fprocess_inherit_coding_system_flag, Sprocess_inherit_coding_system_flag, |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4961 1, 1, 0, |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4962 /* Don't confuse make-docfile by having two doc strings for this function. |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4963 make-docfile does not pay attention to #if, for good reason! */ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4964 0) |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4965 (process) |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4966 register Lisp_Object process; |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4967 { |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4968 /* Ignore the argument and return the value of |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4969 inherit-process-coding-system. */ |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4970 return inherit_process_coding_system ? Qt : Qnil; |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4971 } |
|
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4972 |
| 588 | 4973 /* Kill all processes associated with `buffer'. |
| 4974 If `buffer' is nil, kill all processes. | |
| 4975 Since we have no subprocesses, this does nothing. */ | |
| 4976 | |
|
21414
aac7354edaed
(kill_buffer_processes): Make consistent with
Karl Heuer <kwzh@gnu.org>
parents:
21281
diff
changeset
|
4977 void |
| 588 | 4978 kill_buffer_processes (buffer) |
| 4979 Lisp_Object buffer; | |
| 4980 { | |
| 4981 } | |
| 4982 | |
|
21978
ba8852d809f6
(init_process, syms_of_process): Make definition consistent with
Eli Zaretskii <eliz@gnu.org>
parents:
21950
diff
changeset
|
4983 void |
| 588 | 4984 init_process () |
| 4985 { | |
| 4986 } | |
| 4987 | |
|
21978
ba8852d809f6
(init_process, syms_of_process): Make definition consistent with
Eli Zaretskii <eliz@gnu.org>
parents:
21950
diff
changeset
|
4988 void |
| 588 | 4989 syms_of_process () |
| 4990 { | |
| 4991 defsubr (&Sget_buffer_process); | |
|
21656
bb39a5863a82
(Fset_process_inherit_coding_system_flag,
Eli Zaretskii <eliz@gnu.org>
parents:
21530
diff
changeset
|
4992 defsubr (&Sprocess_inherit_coding_system_flag); |
| 588 | 4993 } |
| 4994 | |
| 4995 | |
| 4996 #endif /* not subprocesses */ |
