(Fsignal_process): SIGCODE is a symbol, not a string.
[bpt/emacs.git] / src / process.c
CommitLineData
d0d6b7c5 1/* Asynchronous subprocess control for GNU Emacs.
b062d1fe 2 Copyright (C) 1985, 86, 87, 88, 93, 94 Free Software Foundation, Inc.
d0d6b7c5
JB
3
4This file is part of GNU Emacs.
5
6GNU Emacs is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
1dc77cc3 8the Free Software Foundation; either version 2, or (at your option)
d0d6b7c5
JB
9any later version.
10
11GNU Emacs is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU Emacs; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21#include <signal.h>
22
18160b98 23#include <config.h>
d0d6b7c5 24
6720a7fb
JB
25/* This file is split into two parts by the following preprocessor
26 conditional. The 'then' clause contains all of the support for
27 asynchronous subprocesses. The 'else' clause contains stub
28 versions of some of the asynchronous subprocess routines that are
29 often called elsewhere in Emacs, so we don't have to #ifdef the
30 sections that call them. */
31
32\f
d0d6b7c5 33#ifdef subprocesses
d0d6b7c5
JB
34
35#include <stdio.h>
36#include <errno.h>
37#include <setjmp.h>
38#include <sys/types.h> /* some typedefs are used in sys/file.h */
39#include <sys/file.h>
40#include <sys/stat.h>
93b4f699
RS
41#ifdef HAVE_UNISTD_H
42#include <unistd.h>
43#endif
d0d6b7c5 44
e98d950b
RS
45#ifdef WINDOWSNT
46#include <stdlib.h>
47#include <fcntl.h>
48#endif /* not WINDOWSNT */
49
d0d6b7c5
JB
50#ifdef HAVE_SOCKETS /* TCP connection support, if kernel can do it */
51#include <sys/socket.h>
52#include <netdb.h>
53#include <netinet/in.h>
54#include <arpa/inet.h>
55#endif /* HAVE_SOCKETS */
56
1d2c16fa
RS
57/* TERM is a poor-man's SLIP, used on Linux. */
58#ifdef TERM
59#include <client.h>
60#endif
61
cf32fea0
PR
62/* On some systems, e.g. DGUX, inet_addr returns a 'struct in_addr'. */
63#ifdef HAVE_BROKEN_INET_ADDR
79967d5e
RS
64#define IN_ADDR struct in_addr
65#define NUMERIC_ADDR_ERROR (numeric_addr.s_addr == -1)
66#else
67#define IN_ADDR unsigned long
68#define NUMERIC_ADDR_ERROR (numeric_addr == -1)
69#endif
70
d0d6b7c5
JB
71#if defined(BSD) || defined(STRIDE)
72#include <sys/ioctl.h>
0ad77c54 73#if !defined (O_NDELAY) && defined (HAVE_PTYS) && !defined(USG5)
d0d6b7c5
JB
74#include <fcntl.h>
75#endif /* HAVE_PTYS and no O_NDELAY */
76#endif /* BSD or STRIDE */
d0d6b7c5 77
99e3d726
RS
78#ifdef BROKEN_O_NONBLOCK
79#undef O_NONBLOCK
80#endif /* BROKEN_O_NONBLOCK */
81
d0d6b7c5
JB
82#ifdef NEED_BSDTTY
83#include <bsdtty.h>
84#endif
85
d0d6b7c5
JB
86#ifdef IRIS
87#include <sys/sysmacros.h> /* for "minor" */
88#endif /* not IRIS */
89
90#include "systime.h"
36ebaafa 91#include "systty.h"
d0d6b7c5
JB
92
93#include "lisp.h"
94#include "window.h"
95#include "buffer.h"
96#include "process.h"
97#include "termhooks.h"
98#include "termopts.h"
99#include "commands.h"
1dc77cc3 100#include "frame.h"
d0d6b7c5 101
dd2281ae 102Lisp_Object Qprocessp;
d0d6b7c5 103Lisp_Object Qrun, Qstop, Qsignal, Qopen, Qclosed;
6545aada 104Lisp_Object Qlast_nonmenu_event;
d0d6b7c5
JB
105/* Qexit is declared and initialized in eval.c. */
106
107/* a process object is a network connection when its childp field is neither
108 Qt nor Qnil but is instead a string (name of foreign host we
109 are connected to + name of port we are connected to) */
110
111#ifdef HAVE_SOCKETS
112static Lisp_Object stream_process;
113
b5b502d6 114#define NETCONN_P(p) (GC_STRINGP (XPROCESS (p)->childp))
d0d6b7c5
JB
115#else
116#define NETCONN_P(p) 0
117#endif /* HAVE_SOCKETS */
118
119/* Define first descriptor number available for subprocesses. */
120#ifdef VMS
121#define FIRST_PROC_DESC 1
122#else /* Not VMS */
123#define FIRST_PROC_DESC 3
124#endif
125
126/* Define SIGCHLD as an alias for SIGCLD. There are many conditionals
127 testing SIGCHLD. */
128
129#if !defined (SIGCHLD) && defined (SIGCLD)
130#define SIGCHLD SIGCLD
131#endif /* SIGCLD */
132
133#include "syssignal.h"
134
889255b4 135#include "syswait.h"
d0d6b7c5 136
b062d1fe
RM
137extern int errno;
138extern char *strerror ();
139#ifdef VMS
d0d6b7c5 140extern char *sys_errlist[];
b062d1fe 141#endif
d0d6b7c5 142
5f0929a7
RS
143#ifndef HAVE_H_ERRNO
144extern int h_errno;
145#endif
146
a86928f7 147#ifndef SYS_SIGLIST_DECLARED
d0d6b7c5
JB
148#ifndef VMS
149#ifndef BSD4_1
e98d950b 150#ifndef WINDOWSNT
084fd64a 151#ifndef LINUX
d0d6b7c5 152extern char *sys_siglist[];
a0e4d3f3
RS
153#endif /* not LINUX */
154#else /* BSD4_1 */
d0d6b7c5
JB
155char *sys_siglist[] =
156 {
157 "bum signal!!",
158 "hangup",
159 "interrupt",
160 "quit",
161 "illegal instruction",
162 "trace trap",
163 "iot instruction",
164 "emt instruction",
165 "floating point exception",
166 "kill",
167 "bus error",
168 "segmentation violation",
169 "bad argument to system call",
170 "write on a pipe with no one to read it",
171 "alarm clock",
172 "software termination signal from kill",
173 "status signal",
174 "sendable stop signal not from tty",
175 "stop signal from tty",
176 "continue a stopped process",
177 "child status has changed",
178 "background read attempted from control tty",
179 "background write attempted from control tty",
180 "input record available at control tty",
181 "exceeded CPU time limit",
182 "exceeded file size limit"
183 };
e98d950b 184#endif /* not WINDOWSNT */
d0d6b7c5
JB
185#endif
186#endif /* VMS */
a86928f7 187#endif /* ! SYS_SIGLIST_DECLARED */
d0d6b7c5 188
d0d6b7c5
JB
189/* t means use pty, nil means use a pipe,
190 maybe other values to come. */
dd2281ae 191static Lisp_Object Vprocess_connection_type;
d0d6b7c5
JB
192
193#ifdef SKTPAIR
194#ifndef HAVE_SOCKETS
195#include <sys/socket.h>
196#endif
197#endif /* SKTPAIR */
198
17d02632
KH
199/* These next two vars are non-static since sysdep.c uses them in the
200 emulation of `select'. */
d0d6b7c5 201/* Number of events of change of status of a process. */
17d02632 202int process_tick;
d0d6b7c5 203/* Number of events for which the user or sentinel has been notified. */
17d02632 204int update_tick;
d0d6b7c5 205
5886acf9 206#include "sysselect.h"
d0d6b7c5 207
44ade2e9
RS
208/* If we support X Windows, turn on the code to poll periodically
209 to detect C-g. It isn't actually used when doing interrupt input. */
210#ifdef HAVE_X_WINDOWS
211#define POLL_FOR_INPUT
212#endif
213
a69281ff 214/* Mask of bits indicating the descriptors that we wait for input on. */
d0d6b7c5 215
dd2281ae
RS
216static SELECT_TYPE input_wait_mask;
217
a69281ff
RS
218/* Mask that excludes keyboard input descriptor (s). */
219
220static SELECT_TYPE non_keyboard_wait_mask;
221
7d0e672e
RS
222/* The largest descriptor currently in use for a process object. */
223static int max_process_desc;
224
a69281ff
RS
225/* The largest descriptor currently in use for keyboard input. */
226static int max_keyboard_desc;
d0d6b7c5 227
dd2281ae
RS
228/* Nonzero means delete a process right away if it exits. */
229static int delete_exited_processes;
d0d6b7c5
JB
230
231/* Indexed by descriptor, gives the process (if any) for that descriptor */
41f3aa98 232Lisp_Object chan_process[MAXDESC];
d0d6b7c5
JB
233
234/* Alist of elements (NAME . PROCESS) */
41f3aa98 235Lisp_Object Vprocess_alist;
d0d6b7c5
JB
236
237/* Buffered-ahead input char from process, indexed by channel.
238 -1 means empty (no char is buffered).
239 Used on sys V where the only way to tell if there is any
240 output from the process is to read at least one char.
241 Always -1 on systems that support FIONREAD. */
242
e98d950b
RS
243/* Don't make static; need to access externally. */
244int proc_buffered_char[MAXDESC];
dd2281ae
RS
245
246static Lisp_Object get_process ();
93b4f699
RS
247
248/* Maximum number of bytes to send to a pty without an eof. */
249static int pty_max_bytes;
3b9a3dfa
RS
250
251/* Open an available pty, returning a file descriptor.
252 Return -1 on failure.
253 The file name of the terminal corresponding to the pty
254 is left in the variable pty_name. */
255
256static char pty_name[24];
d0d6b7c5
JB
257\f
258/* Compute the Lisp form of the process status, p->status, from
259 the numeric status that was returned by `wait'. */
260
f9738840
JB
261Lisp_Object status_convert ();
262
d0d6b7c5
JB
263update_status (p)
264 struct Lisp_Process *p;
265{
266 union { int i; WAITTYPE wt; } u;
267 u.i = XFASTINT (p->raw_status_low) + (XFASTINT (p->raw_status_high) << 16);
268 p->status = status_convert (u.wt);
269 p->raw_status_low = Qnil;
270 p->raw_status_high = Qnil;
271}
272
91d10fa8 273/* Convert a process status word in Unix format to
d0d6b7c5
JB
274 the list that we use internally. */
275
276Lisp_Object
277status_convert (w)
278 WAITTYPE w;
279{
280 if (WIFSTOPPED (w))
281 return Fcons (Qstop, Fcons (make_number (WSTOPSIG (w)), Qnil));
282 else if (WIFEXITED (w))
283 return Fcons (Qexit, Fcons (make_number (WRETCODE (w)),
284 WCOREDUMP (w) ? Qt : Qnil));
285 else if (WIFSIGNALED (w))
286 return Fcons (Qsignal, Fcons (make_number (WTERMSIG (w)),
287 WCOREDUMP (w) ? Qt : Qnil));
288 else
289 return Qrun;
290}
291
292/* Given a status-list, extract the three pieces of information
293 and store them individually through the three pointers. */
294
295void
296decode_status (l, symbol, code, coredump)
297 Lisp_Object l;
298 Lisp_Object *symbol;
299 int *code;
300 int *coredump;
301{
302 Lisp_Object tem;
303
bcd69aea 304 if (SYMBOLP (l))
d0d6b7c5
JB
305 {
306 *symbol = l;
307 *code = 0;
308 *coredump = 0;
309 }
310 else
311 {
312 *symbol = XCONS (l)->car;
313 tem = XCONS (l)->cdr;
314 *code = XFASTINT (XCONS (tem)->car);
f9738840 315 tem = XCONS (tem)->cdr;
d0d6b7c5
JB
316 *coredump = !NILP (tem);
317 }
318}
319
320/* Return a string describing a process status list. */
321
322Lisp_Object
323status_message (status)
324 Lisp_Object status;
325{
326 Lisp_Object symbol;
327 int code, coredump;
328 Lisp_Object string, string2;
329
330 decode_status (status, &symbol, &code, &coredump);
331
332 if (EQ (symbol, Qsignal) || EQ (symbol, Qstop))
333 {
b97ad9ea
RS
334 char *signame = 0;
335 if (code < NSIG)
336 {
b0310da4 337#ifndef VMS
ed0cae05
RS
338 /* Cast to suppress warning if the table has const char *. */
339 signame = (char *) sys_siglist[code];
b0310da4 340#else
b97ad9ea 341 signame = sys_errlist[code];
b0310da4 342#endif
b97ad9ea
RS
343 }
344 if (signame == 0)
345 signame = "unknown";
346 string = build_string (signame);
d0d6b7c5
JB
347 string2 = build_string (coredump ? " (core dumped)\n" : "\n");
348 XSTRING (string)->data[0] = DOWNCASE (XSTRING (string)->data[0]);
349 return concat2 (string, string2);
350 }
351 else if (EQ (symbol, Qexit))
352 {
353 if (code == 0)
354 return build_string ("finished\n");
f2980264 355 string = Fnumber_to_string (make_number (code));
d0d6b7c5
JB
356 string2 = build_string (coredump ? " (core dumped)\n" : "\n");
357 return concat2 (build_string ("exited abnormally with code "),
358 concat2 (string, string2));
359 }
360 else
361 return Fcopy_sequence (Fsymbol_name (symbol));
362}
363\f
364#ifdef HAVE_PTYS
d0d6b7c5 365
d0d6b7c5
JB
366int
367allocate_pty ()
368{
369 struct stat stb;
370 register c, i;
371 int fd;
372
32676c08
JB
373 /* Some systems name their pseudoterminals so that there are gaps in
374 the usual sequence - for example, on HP9000/S700 systems, there
375 are no pseudoterminals with names ending in 'f'. So we wait for
376 three failures in a row before deciding that we've reached the
377 end of the ptys. */
378 int failed_count = 0;
379
d0d6b7c5
JB
380#ifdef PTY_ITERATION
381 PTY_ITERATION
382#else
383 for (c = FIRST_PTY_LETTER; c <= 'z'; c++)
384 for (i = 0; i < 16; i++)
385#endif
386 {
387#ifdef PTY_NAME_SPRINTF
388 PTY_NAME_SPRINTF
d0d6b7c5
JB
389#else
390 sprintf (pty_name, "/dev/pty%c%x", c, i);
d0d6b7c5
JB
391#endif /* no PTY_NAME_SPRINTF */
392
4d7c105e
RS
393#ifdef PTY_OPEN
394 PTY_OPEN;
395#else /* no PTY_OPEN */
32676c08
JB
396#ifdef IRIS
397 /* Unusual IRIS code */
398 *ptyv = open ("/dev/ptc", O_RDWR | O_NDELAY, 0);
399 if (fd < 0)
400 return -1;
401 if (fstat (fd, &stb) < 0)
d0d6b7c5 402 return -1;
4d7c105e 403#else /* not IRIS */
32676c08
JB
404 if (stat (pty_name, &stb) < 0)
405 {
406 failed_count++;
407 if (failed_count >= 3)
408 return -1;
409 }
410 else
411 failed_count = 0;
d0d6b7c5
JB
412#ifdef O_NONBLOCK
413 fd = open (pty_name, O_RDWR | O_NONBLOCK, 0);
414#else
415 fd = open (pty_name, O_RDWR | O_NDELAY, 0);
416#endif
4d7c105e
RS
417#endif /* not IRIS */
418#endif /* no PTY_OPEN */
d0d6b7c5
JB
419
420 if (fd >= 0)
421 {
422 /* check to make certain that both sides are available
423 this avoids a nasty yet stupid bug in rlogins */
424#ifdef PTY_TTY_NAME_SPRINTF
425 PTY_TTY_NAME_SPRINTF
d0d6b7c5
JB
426#else
427 sprintf (pty_name, "/dev/tty%c%x", c, i);
d0d6b7c5
JB
428#endif /* no PTY_TTY_NAME_SPRINTF */
429#ifndef UNIPLUS
430 if (access (pty_name, 6) != 0)
431 {
432 close (fd);
fad97cbe 433#if !defined(IRIS) && !defined(__sgi)
d0d6b7c5
JB
434 continue;
435#else
436 return -1;
437#endif /* IRIS */
438 }
439#endif /* not UNIPLUS */
440 setup_pty (fd);
441 return fd;
442 }
443 }
444 return -1;
445}
446#endif /* HAVE_PTYS */
447\f
448Lisp_Object
449make_process (name)
450 Lisp_Object name;
451{
23d6bb9c 452 struct Lisp_Vector *vec;
d0d6b7c5
JB
453 register Lisp_Object val, tem, name1;
454 register struct Lisp_Process *p;
455 char suffix[10];
456 register int i;
457
23d6bb9c
KH
458 vec = allocate_vectorlike ((EMACS_INT) VECSIZE (struct Lisp_Process));
459 for (i = 0; i < VECSIZE (struct Lisp_Process); i++)
460 vec->contents[i] = Qnil;
461 vec->size = VECSIZE (struct Lisp_Process);
462 p = (struct Lisp_Process *)vec;
463
1d056e64
KH
464 XSETINT (p->infd, -1);
465 XSETINT (p->outfd, -1);
22719df2
KH
466 XSETFASTINT (p->pid, 0);
467 XSETFASTINT (p->tick, 0);
468 XSETFASTINT (p->update_tick, 0);
d0d6b7c5
JB
469 p->raw_status_low = Qnil;
470 p->raw_status_high = Qnil;
471 p->status = Qrun;
472 p->mark = Fmake_marker ();
473
474 /* If name is already in use, modify it until it is unused. */
475
476 name1 = name;
477 for (i = 1; ; i++)
478 {
479 tem = Fget_process (name1);
480 if (NILP (tem)) break;
481 sprintf (suffix, "<%d>", i);
482 name1 = concat2 (name, build_string (suffix));
483 }
484 name = name1;
485 p->name = name;
23d6bb9c 486 XSETPROCESS (val, p);
d0d6b7c5
JB
487 Vprocess_alist = Fcons (Fcons (name, val), Vprocess_alist);
488 return val;
489}
490
491remove_process (proc)
492 register Lisp_Object proc;
493{
494 register Lisp_Object pair;
495
496 pair = Frassq (proc, Vprocess_alist);
497 Vprocess_alist = Fdelq (pair, Vprocess_alist);
498 Fset_marker (XPROCESS (proc)->mark, Qnil, Qnil);
499
500 deactivate_process (proc);
501}
502\f
503DEFUN ("processp", Fprocessp, Sprocessp, 1, 1, 0,
504 "Return t if OBJECT is a process.")
505 (obj)
506 Lisp_Object obj;
507{
bcd69aea 508 return PROCESSP (obj) ? Qt : Qnil;
d0d6b7c5
JB
509}
510
511DEFUN ("get-process", Fget_process, Sget_process, 1, 1, 0,
512 "Return the process named NAME, or nil if there is none.")
513 (name)
514 register Lisp_Object name;
515{
bcd69aea 516 if (PROCESSP (name))
d0d6b7c5
JB
517 return name;
518 CHECK_STRING (name, 0);
519 return Fcdr (Fassoc (name, Vprocess_alist));
520}
521
522DEFUN ("get-buffer-process", Fget_buffer_process, Sget_buffer_process, 1, 1, 0,
523 "Return the (or, a) process associated with BUFFER.\n\
524BUFFER may be a buffer or the name of one.")
525 (name)
526 register Lisp_Object name;
527{
528 register Lisp_Object buf, tail, proc;
529
530 if (NILP (name)) return Qnil;
531 buf = Fget_buffer (name);
532 if (NILP (buf)) return Qnil;
533
534 for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail))
535 {
536 proc = Fcdr (Fcar (tail));
bcd69aea 537 if (PROCESSP (proc) && EQ (XPROCESS (proc)->buffer, buf))
d0d6b7c5
JB
538 return proc;
539 }
540 return Qnil;
541}
542
ebb9e16f
JB
543/* This is how commands for the user decode process arguments. It
544 accepts a process, a process name, a buffer, a buffer name, or nil.
545 Buffers denote the first process in the buffer, and nil denotes the
546 current buffer. */
d0d6b7c5 547
77b221b1 548static Lisp_Object
d0d6b7c5
JB
549get_process (name)
550 register Lisp_Object name;
551{
1619761d
KH
552 register Lisp_Object proc, obj;
553 if (STRINGP (name))
554 {
555 obj = Fget_process (name);
556 if (NILP (obj))
557 obj = Fget_buffer (name);
558 if (NILP (obj))
559 error ("Process %s does not exist", XSTRING (name)->data);
560 }
561 else if (NILP (name))
562 obj = Fcurrent_buffer ();
d0d6b7c5 563 else
1619761d
KH
564 obj = name;
565
566 /* Now obj should be either a buffer object or a process object.
567 */
568 if (BUFFERP (obj))
d0d6b7c5 569 {
1619761d 570 proc = Fget_buffer_process (obj);
d0d6b7c5 571 if (NILP (proc))
1619761d 572 error ("Buffer %s has no process", XSTRING (XBUFFER (obj)->name)->data);
d0d6b7c5 573 }
d0d6b7c5 574 else
1619761d
KH
575 {
576 CHECK_PROCESS (obj, 0);
577 proc = obj;
578 }
579 return proc;
d0d6b7c5
JB
580}
581
582DEFUN ("delete-process", Fdelete_process, Sdelete_process, 1, 1, 0,
583 "Delete PROCESS: kill it and forget about it immediately.\n\
ebb9e16f
JB
584PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
585nil, indicating the current buffer's process.")
d0d6b7c5
JB
586 (proc)
587 register Lisp_Object proc;
588{
589 proc = get_process (proc);
590 XPROCESS (proc)->raw_status_low = Qnil;
591 XPROCESS (proc)->raw_status_high = Qnil;
592 if (NETCONN_P (proc))
593 {
594 XPROCESS (proc)->status = Fcons (Qexit, Fcons (make_number (0), Qnil));
595 XSETINT (XPROCESS (proc)->tick, ++process_tick);
596 }
6c955bcb 597 else if (XINT (XPROCESS (proc)->infd) >= 0)
d0d6b7c5
JB
598 {
599 Fkill_process (proc, Qnil);
600 /* Do this now, since remove_process will make sigchld_handler do nothing. */
601 XPROCESS (proc)->status
602 = Fcons (Qsignal, Fcons (make_number (SIGKILL), Qnil));
603 XSETINT (XPROCESS (proc)->tick, ++process_tick);
604 status_notify ();
605 }
606 remove_process (proc);
607 return Qnil;
608}
609\f
610DEFUN ("process-status", Fprocess_status, Sprocess_status, 1, 1, 0,
611 "Return the status of PROCESS: a symbol, one of these:\n\
612run -- for a process that is running.\n\
613stop -- for a process stopped but continuable.\n\
614exit -- for a process that has exited.\n\
615signal -- for a process that has got a fatal signal.\n\
616open -- for a network stream connection that is open.\n\
617closed -- for a network stream connection that is closed.\n\
ebb9e16f
JB
618nil -- if arg is a process name and no such process exists.\n\
619PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
620nil, indicating the current buffer's process.")
d0d6b7c5
JB
621 (proc)
622 register Lisp_Object proc;
623{
624 register struct Lisp_Process *p;
625 register Lisp_Object status;
343f4114
RS
626
627 if (STRINGP (proc))
628 proc = Fget_process (proc);
629 else
630 proc = get_process (proc);
631
d0d6b7c5
JB
632 if (NILP (proc))
633 return proc;
343f4114 634
d0d6b7c5
JB
635 p = XPROCESS (proc);
636 if (!NILP (p->raw_status_low))
637 update_status (p);
638 status = p->status;
bcd69aea 639 if (CONSP (status))
d0d6b7c5
JB
640 status = XCONS (status)->car;
641 if (NETCONN_P (proc))
642 {
643 if (EQ (status, Qrun))
644 status = Qopen;
645 else if (EQ (status, Qexit))
646 status = Qclosed;
647 }
648 return status;
649}
650
651DEFUN ("process-exit-status", Fprocess_exit_status, Sprocess_exit_status,
652 1, 1, 0,
653 "Return the exit status of PROCESS or the signal number that killed it.\n\
654If PROCESS has not yet exited or died, return 0.")
655 (proc)
656 register Lisp_Object proc;
657{
658 CHECK_PROCESS (proc, 0);
659 if (!NILP (XPROCESS (proc)->raw_status_low))
660 update_status (XPROCESS (proc));
bcd69aea 661 if (CONSP (XPROCESS (proc)->status))
d0d6b7c5
JB
662 return XCONS (XCONS (XPROCESS (proc)->status)->cdr)->car;
663 return make_number (0);
664}
665
666DEFUN ("process-id", Fprocess_id, Sprocess_id, 1, 1, 0,
667 "Return the process id of PROCESS.\n\
668This is the pid of the Unix process which PROCESS uses or talks to.\n\
669For a network connection, this value is nil.")
670 (proc)
671 register Lisp_Object proc;
672{
673 CHECK_PROCESS (proc, 0);
674 return XPROCESS (proc)->pid;
675}
676
677DEFUN ("process-name", Fprocess_name, Sprocess_name, 1, 1, 0,
678 "Return the name of PROCESS, as a string.\n\
679This is the name of the program invoked in PROCESS,\n\
680possibly modified to make it unique among process names.")
681 (proc)
682 register Lisp_Object proc;
683{
684 CHECK_PROCESS (proc, 0);
685 return XPROCESS (proc)->name;
686}
687
688DEFUN ("process-command", Fprocess_command, Sprocess_command, 1, 1, 0,
689 "Return the command that was executed to start PROCESS.\n\
690This is a list of strings, the first string being the program executed\n\
691and the rest of the strings being the arguments given to it.\n\
692For a non-child channel, this is nil.")
693 (proc)
694 register Lisp_Object proc;
695{
696 CHECK_PROCESS (proc, 0);
697 return XPROCESS (proc)->command;
698}
699
3b9a3dfa
RS
700DEFUN ("process-tty-name", Fprocess_tty_name, Sprocess_tty_name, 1, 1, 0,
701 "Return the name of the terminal PROCESS uses, or nil if none.\n\
702This is the terminal that the process itself reads and writes on,\n\
703not the name of the pty that Emacs uses to talk with that terminal.")
704 (proc)
705 register Lisp_Object proc;
706{
707 CHECK_PROCESS (proc, 0);
708 return XPROCESS (proc)->tty_name;
709}
710
d0d6b7c5
JB
711DEFUN ("set-process-buffer", Fset_process_buffer, Sset_process_buffer,
712 2, 2, 0,
713 "Set buffer associated with PROCESS to BUFFER (a buffer, or nil).")
714 (proc, buffer)
715 register Lisp_Object proc, buffer;
716{
717 CHECK_PROCESS (proc, 0);
718 if (!NILP (buffer))
719 CHECK_BUFFER (buffer, 1);
720 XPROCESS (proc)->buffer = buffer;
721 return buffer;
722}
723
724DEFUN ("process-buffer", Fprocess_buffer, Sprocess_buffer,
725 1, 1, 0,
726 "Return the buffer PROCESS is associated with.\n\
727Output from PROCESS is inserted in this buffer\n\
728unless PROCESS has a filter.")
729 (proc)
730 register Lisp_Object proc;
731{
732 CHECK_PROCESS (proc, 0);
733 return XPROCESS (proc)->buffer;
734}
735
736DEFUN ("process-mark", Fprocess_mark, Sprocess_mark,
737 1, 1, 0,
738 "Return the marker for the end of the last output from PROCESS.")
739 (proc)
740 register Lisp_Object proc;
741{
742 CHECK_PROCESS (proc, 0);
743 return XPROCESS (proc)->mark;
744}
745
746DEFUN ("set-process-filter", Fset_process_filter, Sset_process_filter,
747 2, 2, 0,
748 "Give PROCESS the filter function FILTER; nil means no filter.\n\
20ddfff7 749t means stop accepting output from the process.\n\
d0d6b7c5
JB
750When a process has a filter, each time it does output\n\
751the entire string of output is passed to the filter.\n\
752The filter gets two arguments: the process and the string of output.\n\
753If the process has a filter, its buffer is not used for output.")
754 (proc, filter)
755 register Lisp_Object proc, filter;
756{
757 CHECK_PROCESS (proc, 0);
20ddfff7 758 if (EQ (filter, Qt))
a69281ff
RS
759 {
760 FD_CLR (XINT (XPROCESS (proc)->infd), &input_wait_mask);
761 FD_CLR (XINT (XPROCESS (proc)->infd), &non_keyboard_wait_mask);
762 }
20ddfff7 763 else if (EQ (XPROCESS (proc)->filter, Qt))
a69281ff
RS
764 {
765 FD_SET (XINT (XPROCESS (proc)->infd), &input_wait_mask);
766 FD_SET (XINT (XPROCESS (proc)->infd), &non_keyboard_wait_mask);
767 }
d0d6b7c5
JB
768 XPROCESS (proc)->filter = filter;
769 return filter;
770}
771
772DEFUN ("process-filter", Fprocess_filter, Sprocess_filter,
773 1, 1, 0,
774 "Returns the filter function of PROCESS; nil if none.\n\
775See `set-process-filter' for more info on filter functions.")
776 (proc)
777 register Lisp_Object proc;
778{
779 CHECK_PROCESS (proc, 0);
780 return XPROCESS (proc)->filter;
781}
782
783DEFUN ("set-process-sentinel", Fset_process_sentinel, Sset_process_sentinel,
784 2, 2, 0,
785 "Give PROCESS the sentinel SENTINEL; nil for none.\n\
786The sentinel is called as a function when the process changes state.\n\
787It gets two arguments: the process, and a string describing the change.")
788 (proc, sentinel)
789 register Lisp_Object proc, sentinel;
790{
791 CHECK_PROCESS (proc, 0);
792 XPROCESS (proc)->sentinel = sentinel;
793 return sentinel;
794}
795
796DEFUN ("process-sentinel", Fprocess_sentinel, Sprocess_sentinel,
797 1, 1, 0,
798 "Return the sentinel of PROCESS; nil if none.\n\
799See `set-process-sentinel' for more info on sentinels.")
800 (proc)
801 register Lisp_Object proc;
802{
803 CHECK_PROCESS (proc, 0);
804 return XPROCESS (proc)->sentinel;
805}
806
396df322
RS
807DEFUN ("set-process-window-size", Fset_process_window_size,
808 Sset_process_window_size, 3, 3, 0,
809 "Tell PROCESS that it has logical window size HEIGHT and WIDTH.")
810 (proc, height, width)
811 register Lisp_Object proc, height, width;
812{
813 CHECK_PROCESS (proc, 0);
814 CHECK_NATNUM (height, 0);
815 CHECK_NATNUM (width, 0);
816 if (set_window_size (XINT (XPROCESS (proc)->infd),
817 XINT (height), XINT(width)) <= 0)
818 return Qnil;
819 else
820 return Qt;
821}
822
d0d6b7c5
JB
823DEFUN ("process-kill-without-query", Fprocess_kill_without_query,
824 Sprocess_kill_without_query, 1, 2, 0,
825 "Say no query needed if PROCESS is running when Emacs is exited.\n\
f2d2dbfe 826Optional second argument if non-nil says to require a query.\n\
d0d6b7c5
JB
827Value is t if a query was formerly required.")
828 (proc, value)
829 register Lisp_Object proc, value;
830{
831 Lisp_Object tem;
832
833 CHECK_PROCESS (proc, 0);
834 tem = XPROCESS (proc)->kill_without_query;
835 XPROCESS (proc)->kill_without_query = Fnull (value);
836
837 return Fnull (tem);
838}
312c9964
RS
839
840#if 0 /* Turned off because we don't currently record this info
841 in the process. Perhaps add it. */
842DEFUN ("process-connection", Fprocess_connection, Sprocess_connection, 1, 1, 0,
843 "Return the connection type of `PROCESS'.\n\
844The value is `nil' for a pipe,\n\
845`t' or `pty' for a pty, or `stream' for a socket connection.")
846 (process)
847 Lisp_Object process;
848{
849 return XPROCESS (process)->type;
850}
851#endif
d0d6b7c5
JB
852\f
853Lisp_Object
854list_processes_1 ()
855{
856 register Lisp_Object tail, tem;
857 Lisp_Object proc, minspace, tem1;
858 register struct buffer *old = current_buffer;
859 register struct Lisp_Process *p;
860 register int state;
861 char tembuf[80];
862
22719df2 863 XSETFASTINT (minspace, 1);
d0d6b7c5
JB
864
865 set_buffer_internal (XBUFFER (Vstandard_output));
866 Fbuffer_disable_undo (Vstandard_output);
867
868 current_buffer->truncate_lines = Qt;
869
870 write_string ("\
a9fde32e
KH
871Proc Status Buffer Tty Command\n\
872---- ------ ------ --- -------\n", -1);
d0d6b7c5
JB
873
874 for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail))
875 {
876 Lisp_Object symbol;
877
878 proc = Fcdr (Fcar (tail));
879 p = XPROCESS (proc);
880 if (NILP (p->childp))
881 continue;
882
883 Finsert (1, &p->name);
884 Findent_to (make_number (13), minspace);
885
886 if (!NILP (p->raw_status_low))
887 update_status (p);
888 symbol = p->status;
bcd69aea 889 if (CONSP (p->status))
d0d6b7c5
JB
890 symbol = XCONS (p->status)->car;
891
892
893 if (EQ (symbol, Qsignal))
894 {
895 Lisp_Object tem;
896 tem = Fcar (Fcdr (p->status));
897#ifdef VMS
898 if (XINT (tem) < NSIG)
b0310da4 899 write_string (sys_errlist [XINT (tem)], -1);
d0d6b7c5
JB
900 else
901#endif
902 Fprinc (symbol, Qnil);
903 }
904 else if (NETCONN_P (proc))
905 {
906 if (EQ (symbol, Qrun))
907 write_string ("open", -1);
908 else if (EQ (symbol, Qexit))
909 write_string ("closed", -1);
910 else
911 Fprinc (symbol, Qnil);
912 }
913 else
914 Fprinc (symbol, Qnil);
915
916 if (EQ (symbol, Qexit))
917 {
918 Lisp_Object tem;
919 tem = Fcar (Fcdr (p->status));
920 if (XFASTINT (tem))
921 {
922 sprintf (tembuf, " %d", XFASTINT (tem));
923 write_string (tembuf, -1);
924 }
925 }
926
927 if (EQ (symbol, Qsignal) || EQ (symbol, Qexit))
928 remove_process (proc);
929
930 Findent_to (make_number (22), minspace);
931 if (NILP (p->buffer))
932 insert_string ("(none)");
933 else if (NILP (XBUFFER (p->buffer)->name))
934 insert_string ("(Killed)");
935 else
936 Finsert (1, &XBUFFER (p->buffer)->name);
937
938 Findent_to (make_number (37), minspace);
939
a9fde32e
KH
940 if (STRINGP (p->tty_name))
941 Finsert (1, &p->tty_name);
942 else
943 insert_string ("(none)");
944
945 Findent_to (make_number (49), minspace);
946
d0d6b7c5
JB
947 if (NETCONN_P (proc))
948 {
949 sprintf (tembuf, "(network stream connection to %s)\n",
950 XSTRING (p->childp)->data);
951 insert_string (tembuf);
952 }
953 else
954 {
955 tem = p->command;
956 while (1)
957 {
958 tem1 = Fcar (tem);
959 Finsert (1, &tem1);
960 tem = Fcdr (tem);
961 if (NILP (tem))
962 break;
963 insert_string (" ");
964 }
965 insert_string ("\n");
966 }
967 }
968 return Qnil;
969}
970
971DEFUN ("list-processes", Flist_processes, Slist_processes, 0, 0, "",
972 "Display a list of all processes.\n\
973\(Any processes listed as Exited or Signaled are actually eliminated\n\
974after the listing is made.)")
975 ()
976{
977 internal_with_output_to_temp_buffer ("*Process List*",
978 list_processes_1, Qnil);
979 return Qnil;
980}
981
982DEFUN ("process-list", Fprocess_list, Sprocess_list, 0, 0, 0,
983 "Return a list of all processes.")
984 ()
985{
986 return Fmapcar (Qcdr, Vprocess_alist);
987}
988\f
b0310da4
JB
989/* Starting asynchronous inferior processes. */
990
991static Lisp_Object start_process_unwind ();
992
d0d6b7c5
JB
993DEFUN ("start-process", Fstart_process, Sstart_process, 3, MANY, 0,
994 "Start a program in a subprocess. Return the process object for it.\n\
995Args are NAME BUFFER PROGRAM &rest PROGRAM-ARGS\n\
996NAME is name for process. It is modified if necessary to make it unique.\n\
997BUFFER is the buffer or (buffer-name) to associate with the process.\n\
998 Process output goes at end of that buffer, unless you specify\n\
999 an output stream or filter function to handle the output.\n\
1000 BUFFER may be also nil, meaning that this process is not associated\n\
1001 with any buffer\n\
1002Third arg is program file name. It is searched for as in the shell.\n\
1003Remaining arguments are strings to give program as arguments.")
1004 (nargs, args)
1005 int nargs;
1006 register Lisp_Object *args;
1007{
1e30af70 1008 Lisp_Object buffer, name, program, proc, current_dir, tem;
d0d6b7c5
JB
1009#ifdef VMS
1010 register unsigned char *new_argv;
1011 int len;
1012#else
1013 register unsigned char **new_argv;
1014#endif
1015 register int i;
b0310da4 1016 int count = specpdl_ptr - specpdl;
d0d6b7c5
JB
1017
1018 buffer = args[1];
1019 if (!NILP (buffer))
1020 buffer = Fget_buffer_create (buffer);
1021
1e30af70
JB
1022 /* Make sure that the child will be able to chdir to the current
1023 buffer's current directory, or its unhandled equivalent. We
1024 can't just have the child check for an error when it does the
1025 chdir, since it's in a vfork.
1026
1027 We have to GCPRO around this because Fexpand_file_name and
1028 Funhandled_file_name_directory might call a file name handling
1029 function. The argument list is protected by the caller, so all
1030 we really have to worry about is buffer. */
1031 {
1032 struct gcpro gcpro1, gcpro2;
1033
1034 current_dir = current_buffer->directory;
1035
1036 GCPRO2 (buffer, current_dir);
1037
7af71e17
RS
1038 current_dir
1039 = expand_and_dir_to_file (Funhandled_file_name_directory (current_dir),
1040 Qnil);
1e30af70
JB
1041 if (NILP (Ffile_accessible_directory_p (current_dir)))
1042 report_file_error ("Setting current directory",
1043 Fcons (current_buffer->directory, Qnil));
1044
1045 UNGCPRO;
1046 }
1047
d0d6b7c5
JB
1048 name = args[0];
1049 CHECK_STRING (name, 0);
1050
1051 program = args[2];
1052
1053 CHECK_STRING (program, 2);
1054
1055#ifdef VMS
1056 /* Make a one member argv with all args concatenated
1057 together separated by a blank. */
1058 len = XSTRING (program)->size + 2;
1059 for (i = 3; i < nargs; i++)
1060 {
1061 tem = args[i];
1062 CHECK_STRING (tem, i);
1063 len += XSTRING (tem)->size + 1; /* count the blank */
1064 }
1065 new_argv = (unsigned char *) alloca (len);
1066 strcpy (new_argv, XSTRING (program)->data);
1067 for (i = 3; i < nargs; i++)
1068 {
1069 tem = args[i];
1070 CHECK_STRING (tem, i);
1071 strcat (new_argv, " ");
1072 strcat (new_argv, XSTRING (tem)->data);
1073 }
b0310da4
JB
1074 /* Need to add code here to check for program existence on VMS */
1075
d0d6b7c5
JB
1076#else /* not VMS */
1077 new_argv = (unsigned char **) alloca ((nargs - 1) * sizeof (char *));
1078
d0d6b7c5 1079 /* If program file name is not absolute, search our path for it */
e98d950b
RS
1080 if (!IS_DIRECTORY_SEP (XSTRING (program)->data[0])
1081 && !(XSTRING (program)->size > 1
1082 && IS_DEVICE_SEP (XSTRING (program)->data[1])))
d0d6b7c5 1083 {
3b639868
KH
1084 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
1085
d0d6b7c5 1086 tem = Qnil;
3b639868 1087 GCPRO4 (name, program, buffer, current_dir);
5437e9f9 1088 openp (Vexec_path, program, EXEC_SUFFIXES, &tem, 1);
3b639868 1089 UNGCPRO;
d0d6b7c5
JB
1090 if (NILP (tem))
1091 report_file_error ("Searching for program", Fcons (program, Qnil));
1092 new_argv[0] = XSTRING (tem)->data;
1093 }
3b639868
KH
1094 else
1095 new_argv[0] = XSTRING (program)->data;
1096
1097 for (i = 3; i < nargs; i++)
1098 {
1099 tem = args[i];
1100 CHECK_STRING (tem, i);
1101 new_argv[i - 2] = XSTRING (tem)->data;
1102 }
1103 new_argv[i - 2] = 0;
d0d6b7c5
JB
1104#endif /* not VMS */
1105
1106 proc = make_process (name);
b0310da4
JB
1107 /* If an error occurs and we can't start the process, we want to
1108 remove it from the process list. This means that each error
1109 check in create_process doesn't need to call remove_process
1110 itself; it's all taken care of here. */
1111 record_unwind_protect (start_process_unwind, proc);
d0d6b7c5
JB
1112
1113 XPROCESS (proc)->childp = Qt;
1114 XPROCESS (proc)->command_channel_p = Qnil;
1115 XPROCESS (proc)->buffer = buffer;
1116 XPROCESS (proc)->sentinel = Qnil;
1117 XPROCESS (proc)->filter = Qnil;
1118 XPROCESS (proc)->command = Flist (nargs - 2, args + 2);
1119
7af71e17
RS
1120 /* Make the process marker point into the process buffer (if any). */
1121 if (!NILP (buffer))
1122 Fset_marker (XPROCESS (proc)->mark,
1123 make_number (BUF_ZV (XBUFFER (buffer))), buffer);
1124
1e30af70 1125 create_process (proc, new_argv, current_dir);
d0d6b7c5 1126
b0310da4 1127 return unbind_to (count, proc);
d0d6b7c5
JB
1128}
1129
b0310da4
JB
1130/* This function is the unwind_protect form for Fstart_process. If
1131 PROC doesn't have its pid set, then we know someone has signalled
1132 an error and the process wasn't started successfully, so we should
1133 remove it from the process list. */
1134static Lisp_Object
1135start_process_unwind (proc)
1136 Lisp_Object proc;
1137{
bcd69aea 1138 if (!PROCESSP (proc))
b0310da4
JB
1139 abort ();
1140
1141 /* Was PROC started successfully? */
188d6c4e 1142 if (XINT (XPROCESS (proc)->pid) <= 0)
b0310da4
JB
1143 remove_process (proc);
1144
1145 return Qnil;
1146}
1147
1148
d0d6b7c5
JB
1149SIGTYPE
1150create_process_1 (signo)
1151 int signo;
1152{
1153#ifdef USG
1154 /* USG systems forget handlers when they are used;
1155 must reestablish each time */
1156 signal (signo, create_process_1);
1157#endif /* USG */
1158}
1159
1160#if 0 /* This doesn't work; see the note before sigchld_handler. */
1161#ifdef USG
1162#ifdef SIGCHLD
1163/* Mimic blocking of signals on system V, which doesn't really have it. */
1164
1165/* Nonzero means we got a SIGCHLD when it was supposed to be blocked. */
1166int sigchld_deferred;
1167
1168SIGTYPE
1169create_process_sigchld ()
1170{
1171 signal (SIGCHLD, create_process_sigchld);
1172
1173 sigchld_deferred = 1;
1174}
1175#endif
1176#endif
1177#endif
1178
1179#ifndef VMS /* VMS version of this function is in vmsproc.c. */
1e30af70 1180create_process (process, new_argv, current_dir)
d0d6b7c5
JB
1181 Lisp_Object process;
1182 char **new_argv;
1e30af70 1183 Lisp_Object current_dir;
d0d6b7c5
JB
1184{
1185 int pid, inchannel, outchannel, forkin, forkout;
1186 int sv[2];
1187#ifdef SIGCHLD
1188 SIGTYPE (*sigchld)();
1189#endif
1190 int pty_flag = 0;
d0d6b7c5
JB
1191 extern char **environ;
1192
d0d6b7c5
JB
1193 inchannel = outchannel = -1;
1194
1195#ifdef HAVE_PTYS
fe45da4e 1196 if (!NILP (Vprocess_connection_type))
d0d6b7c5
JB
1197 outchannel = inchannel = allocate_pty ();
1198
d0d6b7c5
JB
1199 if (inchannel >= 0)
1200 {
1201#ifndef USG
1202 /* On USG systems it does not work to open the pty's tty here
1203 and then close and reopen it in the child. */
1204#ifdef O_NOCTTY
1205 /* Don't let this terminal become our controlling terminal
1206 (in case we don't have one). */
1207 forkout = forkin = open (pty_name, O_RDWR | O_NOCTTY, 0);
1208#else
1209 forkout = forkin = open (pty_name, O_RDWR, 0);
1210#endif
1211 if (forkin < 0)
1212 report_file_error ("Opening pty", Qnil);
1213#else
1214 forkin = forkout = -1;
1215#endif /* not USG */
1216 pty_flag = 1;
1217 }
1218 else
1219#endif /* HAVE_PTYS */
1220#ifdef SKTPAIR
1221 {
1222 if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) < 0)
1223 report_file_error ("Opening socketpair", Qnil);
1224 outchannel = inchannel = sv[0];
1225 forkout = forkin = sv[1];
1226 }
1227#else /* not SKTPAIR */
1228 {
e98d950b
RS
1229#ifdef WINDOWSNT
1230 pipe_with_inherited_out (sv);
1231 inchannel = sv[0];
1232 forkout = sv[1];
1233
1234 pipe_with_inherited_in (sv);
1235 forkin = sv[0];
1236 outchannel = sv[1];
1237#else /* not WINDOWSNT */
d0d6b7c5
JB
1238 pipe (sv);
1239 inchannel = sv[0];
1240 forkout = sv[1];
1241 pipe (sv);
1242 outchannel = sv[1];
1243 forkin = sv[0];
e98d950b 1244#endif /* not WINDOWSNT */
d0d6b7c5
JB
1245 }
1246#endif /* not SKTPAIR */
1247
1248#if 0
1249 /* Replaced by close_process_descs */
1250 set_exclusive_use (inchannel);
1251 set_exclusive_use (outchannel);
1252#endif
1253
1254/* Stride people say it's a mystery why this is needed
1255 as well as the O_NDELAY, but that it fails without this. */
1256#if defined (STRIDE) || (defined (pfa) && defined (HAVE_PTYS))
1257 {
1258 int one = 1;
1259 ioctl (inchannel, FIONBIO, &one);
1260 }
1261#endif
1262
1263#ifdef O_NONBLOCK
1264 fcntl (inchannel, F_SETFL, O_NONBLOCK);
1265#else
1266#ifdef O_NDELAY
1267 fcntl (inchannel, F_SETFL, O_NDELAY);
1268#endif
1269#endif
1270
1271 /* Record this as an active process, with its channels.
1272 As a result, child_setup will close Emacs's side of the pipes. */
1273 chan_process[inchannel] = process;
1d056e64
KH
1274 XSETINT (XPROCESS (process)->infd, inchannel);
1275 XSETINT (XPROCESS (process)->outfd, outchannel);
d0d6b7c5
JB
1276 /* Record the tty descriptor used in the subprocess. */
1277 if (forkin < 0)
1278 XPROCESS (process)->subtty = Qnil;
1279 else
22719df2 1280 XSETFASTINT (XPROCESS (process)->subtty, forkin);
d0d6b7c5
JB
1281 XPROCESS (process)->pty_flag = (pty_flag ? Qt : Qnil);
1282 XPROCESS (process)->status = Qrun;
1283
1284 /* Delay interrupts until we have a chance to store
1285 the new fork's pid in its process structure */
1286#ifdef SIGCHLD
1287#ifdef BSD4_1
1288 sighold (SIGCHLD);
1289#else /* not BSD4_1 */
1290#if defined (BSD) || defined (UNIPLUS) || defined (HPUX)
1291 sigsetmask (sigmask (SIGCHLD));
1292#else /* ordinary USG */
1293#if 0
1294 sigchld_deferred = 0;
1295 sigchld = signal (SIGCHLD, create_process_sigchld);
1296#endif
1297#endif /* ordinary USG */
1298#endif /* not BSD4_1 */
1299#endif /* SIGCHLD */
1300
3081bf8d 1301 FD_SET (inchannel, &input_wait_mask);
a69281ff 1302 FD_SET (inchannel, &non_keyboard_wait_mask);
3081bf8d
KH
1303 if (inchannel > max_process_desc)
1304 max_process_desc = inchannel;
1305
d0d6b7c5
JB
1306 /* Until we store the proper pid, enable sigchld_handler
1307 to recognize an unknown pid as standing for this process.
1308 It is very important not to let this `marker' value stay
1309 in the table after this function has returned; if it does
1310 it might cause call-process to hang and subsequent asynchronous
1311 processes to get their return values scrambled. */
1312 XSETINT (XPROCESS (process)->pid, -1);
1313
1314 {
1315 /* child_setup must clobber environ on systems with true vfork.
1316 Protect it from permanent change. */
1317 char **save_environ = environ;
1318
e98d950b 1319#ifndef WINDOWSNT
d0d6b7c5
JB
1320 pid = vfork ();
1321 if (pid == 0)
e98d950b 1322#endif /* not WINDOWSNT */
d0d6b7c5
JB
1323 {
1324 int xforkin = forkin;
1325 int xforkout = forkout;
1326
1327#if 0 /* This was probably a mistake--it duplicates code later on,
1328 but fails to handle all the cases. */
1329 /* Make sure SIGCHLD is not blocked in the child. */
1330 sigsetmask (SIGEMPTYMASK);
1331#endif
1332
1333 /* Make the pty be the controlling terminal of the process. */
1334#ifdef HAVE_PTYS
1335 /* First, disconnect its current controlling terminal. */
1336#ifdef HAVE_SETSID
7ce48618
RS
1337 /* We tried doing setsid only if pty_flag, but it caused
1338 process_set_signal to fail on SGI when using a pipe. */
1339 setsid ();
ce4c9c90 1340 /* Make the pty's terminal the controlling terminal. */
084fd64a 1341 if (pty_flag)
39e9ebcd 1342 {
39e9ebcd
RS
1343#ifdef TIOCSCTTY
1344 /* We ignore the return value
1345 because faith@cs.unc.edu says that is necessary on Linux. */
1346 ioctl (xforkin, TIOCSCTTY, 0);
ce4c9c90 1347#endif
39e9ebcd 1348 }
d0d6b7c5 1349#else /* not HAVE_SETSID */
c14e53a4 1350#ifdef USG
000ab717 1351 /* It's very important to call setpgrp here and no time
d0d6b7c5
JB
1352 afterwards. Otherwise, we lose our controlling tty which
1353 is set when we open the pty. */
1354 setpgrp ();
1355#endif /* USG */
1356#endif /* not HAVE_SETSID */
9bcf8ec6
KH
1357#if defined (HAVE_TERMIOS) && defined (LDISC1)
1358 if (pty_flag && xforkin >= 0)
1359 {
1360 struct termios t;
1361 tcgetattr (xforkin, &t);
1362 t.c_lflag = LDISC1;
1363 if (tcsetattr (xforkin, TCSANOW, &t) < 0)
1364 write (1, "create_process/tcsetattr LDISC1 failed\n", 39);
1365 }
1366#else
aafadd9f 1367#if defined (NTTYDISC) && defined (TIOCSETD)
ff773a4e 1368 if (pty_flag && xforkin >= 0)
afc549fd
RS
1369 {
1370 /* Use new line discipline. */
1371 int ldisc = NTTYDISC;
4458f555 1372 ioctl (xforkin, TIOCSETD, &ldisc);
afc549fd 1373 }
000ab717 1374#endif
9bcf8ec6 1375#endif
d0d6b7c5
JB
1376#ifdef TIOCNOTTY
1377 /* In 4.3BSD, the TIOCSPGRP bug has been fixed, and now you
1378 can do TIOCSPGRP only to the process's controlling tty. */
1379 if (pty_flag)
1380 {
1381 /* I wonder: would just ioctl (0, TIOCNOTTY, 0) work here?
1382 I can't test it since I don't have 4.3. */
1383 int j = open ("/dev/tty", O_RDWR, 0);
1384 ioctl (j, TIOCNOTTY, 0);
1385 close (j);
5a570e37 1386#ifndef USG
d0d6b7c5
JB
1387 /* In order to get a controlling terminal on some versions
1388 of BSD, it is necessary to put the process in pgrp 0
1389 before it opens the terminal. */
3ea1d291
RS
1390#ifdef OSF1
1391 setpgid (0, 0);
1392#else
d0d6b7c5 1393 setpgrp (0, 0);
3ea1d291 1394#endif
d0d6b7c5
JB
1395#endif
1396 }
1397#endif /* TIOCNOTTY */
1398
1399#if !defined (RTU) && !defined (UNIPLUS)
1400/*** There is a suggestion that this ought to be a
1401 conditional on TIOCSPGRP. */
1402 /* Now close the pty (if we had it open) and reopen it.
1403 This makes the pty the controlling terminal of the subprocess. */
1404 if (pty_flag)
1405 {
99e3d726
RS
1406#ifdef SET_CHILD_PTY_PGRP
1407 int pgrp = getpid ();
1408#endif
1409
d0d6b7c5
JB
1410 /* I wonder if close (open (pty_name, ...)) would work? */
1411 if (xforkin >= 0)
1412 close (xforkin);
1413 xforkout = xforkin = open (pty_name, O_RDWR, 0);
1414
99e3d726
RS
1415#ifdef SET_CHILD_PTY_PGRP
1416 ioctl (xforkin, TIOCSPGRP, &pgrp);
1417 ioctl (xforkout, TIOCSPGRP, &pgrp);
1418#endif
1419
d0d6b7c5
JB
1420 if (xforkin < 0)
1421 abort ();
1422 }
1423#endif /* not UNIPLUS and not RTU */
1424#ifdef SETUP_SLAVE_PTY
13a72104
RS
1425 if (pty_flag)
1426 {
1427 SETUP_SLAVE_PTY;
1428 }
d0d6b7c5
JB
1429#endif /* SETUP_SLAVE_PTY */
1430#ifdef AIX
1431 /* On AIX, we've disabled SIGHUP above once we start a child on a pty.
1432 Now reenable it in the child, so it will die when we want it to. */
1433 if (pty_flag)
1434 signal (SIGHUP, SIG_DFL);
1435#endif
1436#endif /* HAVE_PTYS */
1437
1438#ifdef SIGCHLD
1439#ifdef BSD4_1
1440 sigrelse (SIGCHLD);
1441#else /* not BSD4_1 */
1442#if defined (BSD) || defined (UNIPLUS) || defined (HPUX)
1443 sigsetmask (SIGEMPTYMASK);
1444#else /* ordinary USG */
63528b78 1445#if 0
d0d6b7c5 1446 signal (SIGCHLD, sigchld);
63528b78 1447#endif
d0d6b7c5
JB
1448#endif /* ordinary USG */
1449#endif /* not BSD4_1 */
1450#endif /* SIGCHLD */
1451
5e7e1da2
RS
1452 signal (SIGINT, SIG_DFL);
1453 signal (SIGQUIT, SIG_DFL);
1454
ab01d0a8
RS
1455 if (pty_flag)
1456 child_setup_tty (xforkout);
e98d950b
RS
1457#ifdef WINDOWSNT
1458 pid = child_setup (xforkin, xforkout, xforkout,
1459 new_argv, 1, current_dir);
1460#else /* not WINDOWSNT */
d0d6b7c5 1461 child_setup (xforkin, xforkout, xforkout,
e065a56e 1462 new_argv, 1, current_dir);
e98d950b 1463#endif /* not WINDOWSNT */
d0d6b7c5
JB
1464 }
1465 environ = save_environ;
1466 }
1467
1468 if (pid < 0)
6311cf58
RS
1469 {
1470 if (forkin >= 0)
1471 close (forkin);
1472 if (forkin != forkout && forkout >= 0)
1473 close (forkout);
1474 report_file_error ("Doing vfork", Qnil);
1475 }
b0310da4 1476
22719df2 1477 XSETFASTINT (XPROCESS (process)->pid, pid);
d0d6b7c5 1478
e98d950b
RS
1479#ifdef WINDOWSNT
1480 register_child (pid, inchannel);
1481#endif /* WINDOWSNT */
1482
d0d6b7c5
JB
1483 /* If the subfork execv fails, and it exits,
1484 this close hangs. I don't know why.
1485 So have an interrupt jar it loose. */
1486 stop_polling ();
1487 signal (SIGALRM, create_process_1);
1488 alarm (1);
99e3d726
RS
1489 XPROCESS (process)->subtty = Qnil;
1490 if (forkin >= 0)
1491 close (forkin);
d0d6b7c5
JB
1492 alarm (0);
1493 start_polling ();
1494 if (forkin != forkout && forkout >= 0)
1495 close (forkout);
1496
3b9a3dfa
RS
1497 XPROCESS (process)->tty_name = build_string (pty_name);
1498
d0d6b7c5
JB
1499#ifdef SIGCHLD
1500#ifdef BSD4_1
1501 sigrelse (SIGCHLD);
1502#else /* not BSD4_1 */
1503#if defined (BSD) || defined (UNIPLUS) || defined (HPUX)
1504 sigsetmask (SIGEMPTYMASK);
1505#else /* ordinary USG */
1506#if 0
1507 signal (SIGCHLD, sigchld);
1508 /* Now really handle any of these signals
1509 that came in during this function. */
1510 if (sigchld_deferred)
1511 kill (getpid (), SIGCHLD);
1512#endif
1513#endif /* ordinary USG */
1514#endif /* not BSD4_1 */
1515#endif /* SIGCHLD */
1516}
1517#endif /* not VMS */
1518
1519#ifdef HAVE_SOCKETS
1520
1521/* open a TCP network connection to a given HOST/SERVICE. Treated
1522 exactly like a normal process when reading and writing. Only
1523 differences are in status display and process deletion. A network
1524 connection has no PID; you cannot signal it. All you can do is
1525 deactivate and close it via delete-process */
1526
1527DEFUN ("open-network-stream", Fopen_network_stream, Sopen_network_stream,
1528 4, 4, 0,
1529 "Open a TCP connection for a service to a host.\n\
1530Returns a subprocess-object to represent the connection.\n\
1531Input and output work as for subprocesses; `delete-process' closes it.\n\
1532Args are NAME BUFFER HOST SERVICE.\n\
1533NAME is name for process. It is modified if necessary to make it unique.\n\
1534BUFFER is the buffer (or buffer-name) to associate with the process.\n\
1535 Process output goes at end of that buffer, unless you specify\n\
1536 an output stream or filter function to handle the output.\n\
1537 BUFFER may be also nil, meaning that this process is not associated\n\
1538 with any buffer\n\
1539Third arg is name of the host to connect to, or its IP address.\n\
1540Fourth arg SERVICE is name of the service desired, or an integer\n\
1541 specifying a port number to connect to.")
1542 (name, buffer, host, service)
1543 Lisp_Object name, buffer, host, service;
1544{
1545 Lisp_Object proc;
1546 register int i;
1547 struct sockaddr_in address;
1548 struct servent *svc_info;
1549 struct hostent *host_info_ptr, host_info;
1550 char *(addr_list[2]);
79967d5e 1551 IN_ADDR numeric_addr;
d0d6b7c5
JB
1552 int s, outch, inch;
1553 char errstring[80];
1554 int port;
1555 struct hostent host_info_fixed;
1556 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
e333e864 1557 int retry = 0;
44ade2e9 1558 int count = specpdl_ptr - specpdl;
d0d6b7c5
JB
1559
1560 GCPRO4 (name, buffer, host, service);
1561 CHECK_STRING (name, 0);
1562 CHECK_STRING (host, 0);
bcd69aea 1563 if (INTEGERP (service))
d0d6b7c5
JB
1564 port = htons ((unsigned short) XINT (service));
1565 else
1566 {
1567 CHECK_STRING (service, 0);
1568 svc_info = getservbyname (XSTRING (service)->data, "tcp");
1569 if (svc_info == 0)
1570 error ("Unknown service \"%s\"", XSTRING (service)->data);
1571 port = svc_info->s_port;
1572 }
1573
1d2c16fa 1574#ifndef TERM
616da37c
RS
1575 while (1)
1576 {
5f0929a7
RS
1577#ifdef TRY_AGAIN
1578 h_errno = 0;
1579#endif
616da37c
RS
1580 host_info_ptr = gethostbyname (XSTRING (host)->data);
1581#ifdef TRY_AGAIN
1582 if (! (host_info_ptr == 0 && h_errno == TRY_AGAIN))
1583#endif
1584 break;
1585 Fsleep_for (make_number (1), Qnil);
1586 }
d0d6b7c5
JB
1587 if (host_info_ptr == 0)
1588 /* Attempt to interpret host as numeric inet address */
1589 {
393a9679 1590 numeric_addr = inet_addr ((char *) XSTRING (host)->data);
79967d5e 1591 if (NUMERIC_ADDR_ERROR)
d0d6b7c5
JB
1592 error ("Unknown host \"%s\"", XSTRING (host)->data);
1593
1594 host_info_ptr = &host_info;
1595 host_info.h_name = 0;
1596 host_info.h_aliases = 0;
1597 host_info.h_addrtype = AF_INET;
39a21be6
JB
1598#ifdef h_addr
1599 /* Older machines have only one address slot called h_addr.
1600 Newer machines have h_addr_list, but #define h_addr to
1601 be its first element. */
1602 host_info.h_addr_list = &(addr_list[0]);
1603#endif
1604 host_info.h_addr = (char*)(&numeric_addr);
d0d6b7c5
JB
1605 addr_list[1] = 0;
1606 host_info.h_length = strlen (addr_list[0]);
1607 }
1608
1609 bzero (&address, sizeof address);
1610 bcopy (host_info_ptr->h_addr, (char *) &address.sin_addr,
1611 host_info_ptr->h_length);
1612 address.sin_family = host_info_ptr->h_addrtype;
1613 address.sin_port = port;
1614
1615 s = socket (host_info_ptr->h_addrtype, SOCK_STREAM, 0);
1616 if (s < 0)
1617 report_file_error ("error creating socket", Fcons (name, Qnil));
1618
457a9bee
RS
1619 /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
1620 when connect is interrupted. So let's not let it get interrupted.
1621 Note we do not turn off polling, because polling is only used
1622 when not interrupt_input, and thus not normally used on the systems
1623 which have this bug. On systems which use polling, there's no way
1624 to quit if polling is turned off. */
1625 if (interrupt_input)
1626 unrequest_sigio ();
1627
44ade2e9
RS
1628 /* Slow down polling to every ten seconds.
1629 Some kernels have a bug which causes retrying connect to fail
1630 after a connect. */
1631#ifdef POLL_FOR_INPUT
1632 bind_polling_period (10);
1633#endif
1634
d0d6b7c5 1635 loop:
e333e864
RS
1636 if (connect (s, (struct sockaddr *) &address, sizeof address) == -1
1637 && errno != EISCONN)
d0d6b7c5
JB
1638 {
1639 int xerrno = errno;
e333e864 1640
d0d6b7c5
JB
1641 if (errno == EINTR)
1642 goto loop;
e333e864
RS
1643 if (errno == EADDRINUSE && retry < 20)
1644 {
1645 retry++;
1646 goto loop;
1647 }
1648
d0d6b7c5 1649 close (s);
457a9bee
RS
1650
1651 if (interrupt_input)
1652 request_sigio ();
1653
d0d6b7c5
JB
1654 errno = xerrno;
1655 report_file_error ("connection failed",
1656 Fcons (host, Fcons (name, Qnil)));
1657 }
457a9bee 1658
44ade2e9
RS
1659#ifdef POLL_FOR_INPUT
1660 unbind_to (count, Qnil);
1661#endif
1662
457a9bee
RS
1663 if (interrupt_input)
1664 request_sigio ();
1665
1d2c16fa
RS
1666#else /* TERM */
1667 s = connect_server (0);
1668 if (s < 0)
1669 report_file_error ("error creating socket", Fcons (name, Qnil));
1670 send_command (s, C_PORT, 0, "%s:%d", XSTRING (host)->data, ntohs (port));
1671 send_command (s, C_DUMB, 1, 0);
1672#endif /* TERM */
d0d6b7c5
JB
1673
1674 inch = s;
1675 outch = dup (s);
1676 if (outch < 0)
1677 report_file_error ("error duplicating socket", Fcons (name, Qnil));
1678
1679 if (!NILP (buffer))
1680 buffer = Fget_buffer_create (buffer);
1681 proc = make_process (name);
1682
1683 chan_process[inch] = proc;
1684
1685#ifdef O_NONBLOCK
1686 fcntl (inch, F_SETFL, O_NONBLOCK);
1687#else
1688#ifdef O_NDELAY
1689 fcntl (inch, F_SETFL, O_NDELAY);
1690#endif
1691#endif
1692
1693 XPROCESS (proc)->childp = host;
1694 XPROCESS (proc)->command_channel_p = Qnil;
1695 XPROCESS (proc)->buffer = buffer;
1696 XPROCESS (proc)->sentinel = Qnil;
1697 XPROCESS (proc)->filter = Qnil;
1698 XPROCESS (proc)->command = Qnil;
1699 XPROCESS (proc)->pid = Qnil;
1d056e64
KH
1700 XSETINT (XPROCESS (proc)->infd, s);
1701 XSETINT (XPROCESS (proc)->outfd, outch);
d0d6b7c5
JB
1702 XPROCESS (proc)->status = Qrun;
1703 FD_SET (inch, &input_wait_mask);
a69281ff 1704 FD_SET (inch, &non_keyboard_wait_mask);
7d0e672e
RS
1705 if (inch > max_process_desc)
1706 max_process_desc = inch;
d0d6b7c5
JB
1707
1708 UNGCPRO;
1709 return proc;
1710}
1711#endif /* HAVE_SOCKETS */
1712
1713deactivate_process (proc)
1714 Lisp_Object proc;
1715{
1716 register int inchannel, outchannel;
1717 register struct Lisp_Process *p = XPROCESS (proc);
1718
a9f2c884
RS
1719 inchannel = XINT (p->infd);
1720 outchannel = XINT (p->outfd);
d0d6b7c5 1721
a9f2c884 1722 if (inchannel >= 0)
d0d6b7c5
JB
1723 {
1724 /* Beware SIGCHLD hereabouts. */
1725 flush_pending_output (inchannel);
1726#ifdef VMS
1727 {
1728 VMS_PROC_STUFF *get_vms_process_pointer (), *vs;
1729 sys$dassgn (outchannel);
c6c6865d 1730 vs = get_vms_process_pointer (p->pid);
d0d6b7c5
JB
1731 if (vs)
1732 give_back_vms_process_stuff (vs);
1733 }
1734#else
1735 close (inchannel);
a9f2c884 1736 if (outchannel >= 0 && outchannel != inchannel)
d0d6b7c5
JB
1737 close (outchannel);
1738#endif
1739
1d056e64
KH
1740 XSETINT (p->infd, -1);
1741 XSETINT (p->outfd, -1);
d0d6b7c5
JB
1742 chan_process[inchannel] = Qnil;
1743 FD_CLR (inchannel, &input_wait_mask);
a69281ff 1744 FD_CLR (inchannel, &non_keyboard_wait_mask);
7d0e672e
RS
1745 if (inchannel == max_process_desc)
1746 {
1747 int i;
1748 /* We just closed the highest-numbered process input descriptor,
1749 so recompute the highest-numbered one now. */
1750 max_process_desc = 0;
1751 for (i = 0; i < MAXDESC; i++)
1752 if (!NILP (chan_process[i]))
1753 max_process_desc = i;
1754 }
d0d6b7c5
JB
1755 }
1756}
1757
1758/* Close all descriptors currently in use for communication
1759 with subprocess. This is used in a newly-forked subprocess
1760 to get rid of irrelevant descriptors. */
1761
1762close_process_descs ()
1763{
e98d950b 1764#ifndef WINDOWSNT
d0d6b7c5
JB
1765 int i;
1766 for (i = 0; i < MAXDESC; i++)
1767 {
1768 Lisp_Object process;
1769 process = chan_process[i];
1770 if (!NILP (process))
1771 {
a9f2c884
RS
1772 int in = XINT (XPROCESS (process)->infd);
1773 int out = XINT (XPROCESS (process)->outfd);
1774 if (in >= 0)
d0d6b7c5 1775 close (in);
a9f2c884 1776 if (out >= 0 && in != out)
d0d6b7c5
JB
1777 close (out);
1778 }
1779 }
e98d950b 1780#endif
d0d6b7c5
JB
1781}
1782\f
1783DEFUN ("accept-process-output", Faccept_process_output, Saccept_process_output,
1784 0, 3, 0,
1785 "Allow any pending output from subprocesses to be read by Emacs.\n\
1786It is read into the process' buffers or given to their filter functions.\n\
1787Non-nil arg PROCESS means do not return until some output has been received\n\
1788from PROCESS.\n\
1789Non-nil second arg TIMEOUT and third arg TIMEOUT-MSECS are number of\n\
1790seconds and microseconds to wait; return after that much time whether\n\
1791or not there is input.\n\
1792Return non-nil iff we received any output before the timeout expired.")
1793 (proc, timeout, timeout_msecs)
1794 register Lisp_Object proc, timeout, timeout_msecs;
1795{
1796 int seconds;
1797 int useconds;
1798
1799 if (! NILP (timeout_msecs))
1800 {
1801 CHECK_NUMBER (timeout_msecs, 2);
1802 useconds = XINT (timeout_msecs);
bcd69aea 1803 if (!INTEGERP (timeout))
1d056e64 1804 XSETINT (timeout, 0);
d0d6b7c5
JB
1805
1806 {
1807 int carry = useconds / 1000000;
1808
1809 XSETINT (timeout, XINT (timeout) + carry);
1810 useconds -= carry * 1000000;
1811
1812 /* I think this clause is necessary because C doesn't
1813 guarantee a particular rounding direction for negative
1814 integers. */
1815 if (useconds < 0)
1816 {
1817 XSETINT (timeout, XINT (timeout) - 1);
1818 useconds += 1000000;
1819 }
1820 }
1821 }
de946e5a
RS
1822 else
1823 useconds = 0;
d0d6b7c5
JB
1824
1825 if (! NILP (timeout))
1826 {
1827 CHECK_NUMBER (timeout, 1);
1828 seconds = XINT (timeout);
1829 if (seconds <= 0)
1830 seconds = -1;
1831 }
1832 else
1833 {
1834 if (NILP (proc))
1835 seconds = -1;
1836 else
1837 seconds = 0;
1838 }
1839
f76475ad 1840 if (NILP (proc))
22719df2 1841 XSETFASTINT (proc, 0);
f76475ad 1842
d0d6b7c5 1843 return
f76475ad 1844 (wait_reading_process_input (seconds, useconds, proc, 0)
d0d6b7c5
JB
1845 ? Qt : Qnil);
1846}
1847
1848/* This variable is different from waiting_for_input in keyboard.c.
1849 It is used to communicate to a lisp process-filter/sentinel (via the
1850 function Fwaiting_for_user_input_p below) whether emacs was waiting
1851 for user-input when that process-filter was called.
1852 waiting_for_input cannot be used as that is by definition 0 when
d430ee71
RS
1853 lisp code is being evalled.
1854 This is also used in record_asynch_buffer_change.
1855 For that purpose, this must be 0
1856 when not inside wait_reading_process_input. */
d0d6b7c5
JB
1857static int waiting_for_user_input_p;
1858
1859/* Read and dispose of subprocess output while waiting for timeout to
1860 elapse and/or keyboard input to be available.
1861
de6fd4b9 1862 TIME_LIMIT is:
d0d6b7c5
JB
1863 timeout in seconds, or
1864 zero for no limit, or
1865 -1 means gobble data immediately available but don't wait for any.
1866
de6fd4b9
RS
1867 MICROSECS is:
1868 an additional duration to wait, measured in microseconds.
1869 If this is nonzero and time_limit is 0, then the timeout
1870 consists of MICROSECS only.
6e4f3667 1871
de6fd4b9 1872 READ_KBD is a lisp value:
d0d6b7c5
JB
1873 0 to ignore keyboard input, or
1874 1 to return when input is available, or
84aa3ace 1875 -1 meaning caller will actually read the input, so don't throw to
d0d6b7c5 1876 the quit handler, or
e6194ffc 1877 a cons cell, meaning wait until its car is non-nil
de6fd4b9 1878 (and gobble terminal input into the buffer if any arrives), or
f76475ad
JB
1879 a process object, meaning wait until something arrives from that
1880 process. The return value is true iff we read some input from
1881 that process.
d0d6b7c5 1882
de6fd4b9 1883 DO_DISPLAY != 0 means redisplay should be done to show subprocess
d0d6b7c5
JB
1884 output that arrives.
1885
de6fd4b9 1886 If READ_KBD is a pointer to a struct Lisp_Process, then the
d0d6b7c5
JB
1887 function returns true iff we received input from that process
1888 before the timeout elapsed.
eb8c3be9 1889 Otherwise, return true iff we received input from any process. */
d0d6b7c5
JB
1890
1891wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
f76475ad
JB
1892 int time_limit, microsecs;
1893 Lisp_Object read_kbd;
1894 int do_display;
d0d6b7c5
JB
1895{
1896 register int channel, nfds, m;
1897 static SELECT_TYPE Available;
1898 int xerrno;
1899 Lisp_Object proc;
1900 EMACS_TIME timeout, end_time, garbage;
1901 SELECT_TYPE Atemp;
a9f2c884 1902 int wait_channel = -1;
d0d6b7c5
JB
1903 struct Lisp_Process *wait_proc = 0;
1904 int got_some_input = 0;
84aa3ace 1905 Lisp_Object *wait_for_cell = 0;
d0d6b7c5
JB
1906
1907 FD_ZERO (&Available);
1908
f76475ad
JB
1909 /* If read_kbd is a process to watch, set wait_proc and wait_channel
1910 accordingly. */
bcd69aea 1911 if (PROCESSP (read_kbd))
d0d6b7c5 1912 {
f76475ad 1913 wait_proc = XPROCESS (read_kbd);
a9f2c884 1914 wait_channel = XINT (wait_proc->infd);
22719df2 1915 XSETFASTINT (read_kbd, 0);
d0d6b7c5
JB
1916 }
1917
84aa3ace 1918 /* If waiting for non-nil in a cell, record where. */
bcd69aea 1919 if (CONSP (read_kbd))
84aa3ace
RS
1920 {
1921 wait_for_cell = &XCONS (read_kbd)->car;
22719df2 1922 XSETFASTINT (read_kbd, 0);
84aa3ace
RS
1923 }
1924
f76475ad 1925 waiting_for_user_input_p = XINT (read_kbd);
d0d6b7c5
JB
1926
1927 /* Since we may need to wait several times,
1928 compute the absolute time to return at. */
1929 if (time_limit || microsecs)
1930 {
1931 EMACS_GET_TIME (end_time);
1932 EMACS_SET_SECS_USECS (timeout, time_limit, microsecs);
1933 EMACS_ADD_TIME (end_time, end_time, timeout);
1934 }
1935
99e3d726
RS
1936 /* It would not be safe to call this below,
1937 where we call redisplay_preserve_echo_area. */
8b4d685f
RS
1938 if (do_display && frame_garbaged)
1939 prepare_menu_bars ();
99e3d726 1940
d0d6b7c5
JB
1941 while (1)
1942 {
1943 /* If calling from keyboard input, do not quit
1944 since we want to return C-g as an input character.
1945 Otherwise, do pending quit if requested. */
f76475ad 1946 if (XINT (read_kbd) >= 0)
d0d6b7c5
JB
1947 QUIT;
1948
889255b4
RS
1949 /* Exit now if the cell we're waiting for became non-nil. */
1950 if (wait_for_cell && ! NILP (*wait_for_cell))
1951 break;
1952
d0d6b7c5
JB
1953 /* Compute time from now till when time limit is up */
1954 /* Exit if already run out */
1955 if (time_limit == -1)
1956 {
1957 /* -1 specified for timeout means
1958 gobble output available now
1959 but don't wait at all. */
1960
1961 EMACS_SET_SECS_USECS (timeout, 0, 0);
1962 }
1963 else if (time_limit || microsecs)
1964 {
1965 EMACS_GET_TIME (timeout);
1966 EMACS_SUB_TIME (timeout, end_time, timeout);
1967 if (EMACS_TIME_NEG_P (timeout))
1968 break;
1969 }
1970 else
1971 {
1972 EMACS_SET_SECS_USECS (timeout, 100000, 0);
1973 }
1974
90ab1a81
JB
1975 /* Cause C-g and alarm signals to take immediate action,
1976 and cause input available signals to zero out timeout.
1977
1978 It is important that we do this before checking for process
1979 activity. If we get a SIGCHLD after the explicit checks for
1980 process activity, timeout is the only way we will know. */
1981 if (XINT (read_kbd) < 0)
1982 set_waiting_for_input (&timeout);
1983
6be429b1
JB
1984 /* If status of something has changed, and no input is
1985 available, notify the user of the change right away. After
1986 this explicit check, we'll let the SIGCHLD handler zap
1987 timeout to get our attention. */
1988 if (update_tick != process_tick && do_display)
1989 {
1990 Atemp = input_wait_mask;
1991 EMACS_SET_SECS_USECS (timeout, 0, 0);
1992 if (select (MAXDESC, &Atemp, 0, 0, &timeout) <= 0)
90ab1a81
JB
1993 {
1994 /* It's okay for us to do this and then continue with
a0e4d3f3 1995 the loop, since timeout has already been zeroed out. */
90ab1a81
JB
1996 clear_waiting_for_input ();
1997 status_notify ();
1998 }
6be429b1
JB
1999 }
2000
2001 /* Don't wait for output from a non-running process. */
2002 if (wait_proc != 0 && !NILP (wait_proc->raw_status_low))
2003 update_status (wait_proc);
2004 if (wait_proc != 0
2005 && ! EQ (wait_proc->status, Qrun))
9aa2a7f4
JB
2006 {
2007 clear_waiting_for_input ();
2008 break;
2009 }
6be429b1 2010
d0d6b7c5
JB
2011 /* Wait till there is something to do */
2012
5e7e1da2 2013 if (! XINT (read_kbd) && wait_for_cell == 0)
a69281ff
RS
2014 Available = non_keyboard_wait_mask;
2015 else
2016 Available = input_wait_mask;
d0d6b7c5 2017
ff11dfa1 2018 /* If frame size has changed or the window is newly mapped,
ffd56f97
JB
2019 redisplay now, before we start to wait. There is a race
2020 condition here; if a SIGIO arrives between now and the select
016899c0
JB
2021 and indicates that a frame is trashed, the select may block
2022 displaying a trashed screen. */
5164ee8e 2023 if (frame_garbaged && do_display)
ffd56f97
JB
2024 redisplay_preserve_echo_area ();
2025
f76475ad 2026 if (XINT (read_kbd) && detect_input_pending ())
a9f2c884
RS
2027 {
2028 nfds = 0;
2029 FD_ZERO (&Available);
2030 }
d0d6b7c5 2031 else
d0d6b7c5 2032 nfds = select (MAXDESC, &Available, 0, 0, &timeout);
6720a7fb 2033
d0d6b7c5
JB
2034 xerrno = errno;
2035
2036 /* Make C-g and alarm signals set flags again */
2037 clear_waiting_for_input ();
2038
2039 /* If we woke up due to SIGWINCH, actually change size now. */
2040 do_pending_window_change ();
2041
ffd56f97 2042 if (time_limit && nfds == 0) /* timeout elapsed */
d0d6b7c5
JB
2043 break;
2044 if (nfds < 0)
2045 {
2046 if (xerrno == EINTR)
2047 FD_ZERO (&Available);
b0310da4
JB
2048#ifdef ultrix
2049 /* Ultrix select seems to return ENOMEM when it is
2050 interrupted. Treat it just like EINTR. Bleah. Note
2051 that we want to test for the "ultrix" CPP symbol, not
2052 "__ultrix__"; the latter is only defined under GCC, but
2053 not by DEC's bundled CC. -JimB */
8058415c
JB
2054 else if (xerrno == ENOMEM)
2055 FD_ZERO (&Available);
2056#endif
d0d6b7c5
JB
2057#ifdef ALLIANT
2058 /* This happens for no known reason on ALLIANT.
2059 I am guessing that this is the right response. -- RMS. */
2060 else if (xerrno == EFAULT)
2061 FD_ZERO (&Available);
2062#endif
2063 else if (xerrno == EBADF)
2064 {
2065#ifdef AIX
2066 /* AIX doesn't handle PTY closure the same way BSD does. On AIX,
2067 the child's closure of the pts gives the parent a SIGHUP, and
2068 the ptc file descriptor is automatically closed,
2069 yielding EBADF here or at select() call above.
2070 So, SIGHUP is ignored (see def of PTY_TTY_NAME_SPRINTF
a0e4d3f3 2071 in m/ibmrt-aix.h), and here we just ignore the select error.
d0d6b7c5 2072 Cleanup occurs c/o status_notify after SIGCLD. */
ffd56f97 2073 FD_ZERO (&Available); /* Cannot depend on values returned */
d0d6b7c5
JB
2074#else
2075 abort ();
2076#endif
2077 }
2078 else
b062d1fe 2079 error("select error: %s", strerror (xerrno));
d0d6b7c5 2080 }
26ec91de 2081#if defined(sun) && !defined(USG5_4)
a69281ff 2082 else if (nfds > 0 && keyboard_bit_set (&Available)
dd2281ae 2083 && interrupt_input)
e0109153
JB
2084 /* System sometimes fails to deliver SIGIO.
2085
2086 David J. Mackenzie says that Emacs doesn't compile under
2087 Solaris if this code is enabled, thus the USG5_4 in the CPP
2088 conditional. "I haven't noticed any ill effects so far.
2089 If you find a Solaris expert somewhere, they might know
2090 better." */
d0d6b7c5
JB
2091 kill (getpid (), SIGIO);
2092#endif
2093
2094 /* Check for keyboard input */
2095 /* If there is any, return immediately
2096 to give it higher priority than subprocesses */
2097
e6194ffc 2098 /* We used to do this if wait_for_cell,
6cbc22ed 2099 but that caused infinite recursion in selection request events. */
5e7e1da2 2100 if ((XINT (read_kbd) || wait_for_cell)
97f3b3d6 2101 && detect_input_pending ())
6e103bac
RS
2102 {
2103 swallow_events ();
2104 if (detect_input_pending ())
2105 break;
2106 }
d0d6b7c5 2107
84aa3ace
RS
2108 /* Exit now if the cell we're waiting for became non-nil. */
2109 if (wait_for_cell && ! NILP (*wait_for_cell))
2110 break;
2111
4746118a 2112#ifdef SIGIO
d0d6b7c5
JB
2113 /* If we think we have keyboard input waiting, but didn't get SIGIO
2114 go read it. This can happen with X on BSD after logging out.
2115 In that case, there really is no input and no SIGIO,
2116 but select says there is input. */
2117
dd2281ae 2118 if (XINT (read_kbd) && interrupt_input
a69281ff 2119 && (keyboard_bit_set (&Available)))
d0d6b7c5 2120 kill (0, SIGIO);
4746118a 2121#endif
d0d6b7c5 2122
d0d6b7c5
JB
2123 if (! wait_proc)
2124 got_some_input |= nfds > 0;
2125
32676c08
JB
2126 /* If checking input just got us a size-change event from X,
2127 obey it now if we should. */
97f3b3d6 2128 if (XINT (read_kbd) || wait_for_cell)
32676c08
JB
2129 do_pending_window_change ();
2130
a9f2c884
RS
2131 /* Check for data from a process. */
2132 /* Really FIRST_PROC_DESC should be 0 on Unix,
2133 but this is safer in the short run. */
a69281ff 2134 for (channel = 0; channel <= max_process_desc; channel++)
d0d6b7c5 2135 {
a69281ff
RS
2136 if (FD_ISSET (channel, &Available)
2137 && FD_ISSET (channel, &non_keyboard_wait_mask))
d0d6b7c5
JB
2138 {
2139 int nread;
2140
2141 /* If waiting for this channel, arrange to return as
2142 soon as no more input to be processed. No more
2143 waiting. */
2144 if (wait_channel == channel)
2145 {
a9f2c884 2146 wait_channel = -1;
d0d6b7c5
JB
2147 time_limit = -1;
2148 got_some_input = 1;
2149 }
2150 proc = chan_process[channel];
2151 if (NILP (proc))
2152 continue;
2153
d0d6b7c5
JB
2154 /* Read data from the process, starting with our
2155 buffered-ahead character if we have one. */
2156
2157 nread = read_process_output (proc, channel);
2158 if (nread > 0)
2159 {
2160 /* Since read_process_output can run a filter,
2161 which can call accept-process-output,
2162 don't try to read from any other processes
2163 before doing the select again. */
2164 FD_ZERO (&Available);
2165
2166 if (do_display)
2167 redisplay_preserve_echo_area ();
2168 }
2169#ifdef EWOULDBLOCK
2170 else if (nread == -1 && errno == EWOULDBLOCK)
2171 ;
2172#else
2173#ifdef O_NONBLOCK
2174 else if (nread == -1 && errno == EAGAIN)
2175 ;
2176#else
2177#ifdef O_NDELAY
2178 else if (nread == -1 && errno == EAGAIN)
2179 ;
2180 /* Note that we cannot distinguish between no input
2181 available now and a closed pipe.
2182 With luck, a closed pipe will be accompanied by
2183 subprocess termination and SIGCHLD. */
2184 else if (nread == 0 && !NETCONN_P (proc))
2185 ;
ffd56f97
JB
2186#endif /* O_NDELAY */
2187#endif /* O_NONBLOCK */
2188#endif /* EWOULDBLOCK */
d0d6b7c5
JB
2189#ifdef HAVE_PTYS
2190 /* On some OSs with ptys, when the process on one end of
2191 a pty exits, the other end gets an error reading with
2192 errno = EIO instead of getting an EOF (0 bytes read).
2193 Therefore, if we get an error reading and errno =
2194 EIO, just continue, because the child process has
2195 exited and should clean itself up soon (e.g. when we
2196 get a SIGCHLD). */
2197 else if (nread == -1 && errno == EIO)
2198 ;
ffd56f97
JB
2199#endif /* HAVE_PTYS */
2200 /* If we can detect process termination, don't consider the process
2201 gone just because its pipe is closed. */
d0d6b7c5
JB
2202#ifdef SIGCHLD
2203 else if (nread == 0 && !NETCONN_P (proc))
2204 ;
2205#endif
2206 else
2207 {
2208 /* Preserve status of processes already terminated. */
2209 XSETINT (XPROCESS (proc)->tick, ++process_tick);
2210 deactivate_process (proc);
2211 if (!NILP (XPROCESS (proc)->raw_status_low))
2212 update_status (XPROCESS (proc));
2213 if (EQ (XPROCESS (proc)->status, Qrun))
2214 XPROCESS (proc)->status
2215 = Fcons (Qexit, Fcons (make_number (256), Qnil));
2216 }
2217 }
ffd56f97
JB
2218 } /* end for each file descriptor */
2219 } /* end while exit conditions not met */
d0d6b7c5 2220
d430ee71
RS
2221 waiting_for_user_input_p = 0;
2222
ffd56f97
JB
2223 /* If calling from keyboard input, do not quit
2224 since we want to return C-g as an input character.
2225 Otherwise, do pending quit if requested. */
f76475ad 2226 if (XINT (read_kbd) >= 0)
ffd56f97
JB
2227 {
2228 /* Prevent input_pending from remaining set if we quit. */
2229 clear_input_pending ();
2230 QUIT;
2231 }
d0d6b7c5
JB
2232
2233 return got_some_input;
2234}
2235\f
3b9a3dfa
RS
2236/* Given a list (FUNCTION ARGS...), apply FUNCTION to the ARGS. */
2237
2238static Lisp_Object
2239read_process_output_call (fun_and_args)
2240 Lisp_Object fun_and_args;
2241{
2242 return apply1 (XCONS (fun_and_args)->car, XCONS (fun_and_args)->cdr);
2243}
2244
2245static Lisp_Object
2246read_process_output_error_handler (error)
2247 Lisp_Object error;
2248{
2249 cmd_error_internal (error, "error in process filter: ");
2250 Vinhibit_quit = Qt;
2251 update_echo_area ();
2252 Fsleep_for (make_number (2));
2253}
2254
d0d6b7c5
JB
2255/* Read pending output from the process channel,
2256 starting with our buffered-ahead character if we have one.
2257 Yield number of characters read.
2258
2259 This function reads at most 1024 characters.
2260 If you want to read all available subprocess output,
2261 you must call it repeatedly until it returns zero. */
2262
2263read_process_output (proc, channel)
2264 Lisp_Object proc;
2265 register int channel;
2266{
2267 register int nchars;
2268#ifdef VMS
2269 char *chars;
2270#else
2271 char chars[1024];
2272#endif
2273 register Lisp_Object outstream;
2274 register struct buffer *old = current_buffer;
2275 register struct Lisp_Process *p = XPROCESS (proc);
2276 register int opoint;
2277
2278#ifdef VMS
2279 VMS_PROC_STUFF *vs, *get_vms_process_pointer();
2280
2281 vs = get_vms_process_pointer (p->pid);
2282 if (vs)
2283 {
2284 if (!vs->iosb[0])
2285 return(0); /* Really weird if it does this */
2286 if (!(vs->iosb[0] & 1))
2287 return -1; /* I/O error */
2288 }
2289 else
2290 error ("Could not get VMS process pointer");
2291 chars = vs->inputBuffer;
2292 nchars = clean_vms_buffer (chars, vs->iosb[1]);
2293 if (nchars <= 0)
2294 {
2295 start_vms_process_read (vs); /* Crank up the next read on the process */
2296 return 1; /* Nothing worth printing, say we got 1 */
2297 }
2298#else /* not VMS */
2299
2300 if (proc_buffered_char[channel] < 0)
e98d950b
RS
2301#ifdef WINDOWSNT
2302 nchars = read_child_output (channel, chars, sizeof (chars));
2303#else
d0d6b7c5 2304 nchars = read (channel, chars, sizeof chars);
e98d950b 2305#endif
d0d6b7c5
JB
2306 else
2307 {
2308 chars[0] = proc_buffered_char[channel];
2309 proc_buffered_char[channel] = -1;
e98d950b
RS
2310#ifdef WINDOWSNT
2311 nchars = read_child_output (channel, chars + 1, sizeof (chars) - 1);
2312#else
d0d6b7c5 2313 nchars = read (channel, chars + 1, sizeof chars - 1);
e98d950b 2314#endif
d0d6b7c5
JB
2315 if (nchars < 0)
2316 nchars = 1;
2317 else
2318 nchars = nchars + 1;
2319 }
2320#endif /* not VMS */
2321
2322 if (nchars <= 0) return nchars;
2323
2324 outstream = p->filter;
2325 if (!NILP (outstream))
2326 {
2327 /* We inhibit quit here instead of just catching it so that
2328 hitting ^G when a filter happens to be running won't screw
2329 it up. */
2330 int count = specpdl_ptr - specpdl;
30c78175 2331 Lisp_Object odeactivate;
dfc21838 2332 Lisp_Object obuffer, okeymap;
30c78175 2333
dfc21838
RS
2334 /* No need to gcpro these, because all we do with them later
2335 is test them for EQness, and none of them should be a string. */
30c78175 2336 odeactivate = Vdeactivate_mark;
dfc21838
RS
2337 XSETBUFFER (obuffer, current_buffer);
2338 okeymap = current_buffer->keymap;
30c78175 2339
d0d6b7c5 2340 specbind (Qinhibit_quit, Qt);
6545aada 2341 specbind (Qlast_nonmenu_event, Qt);
3b9a3dfa 2342
7074fde6 2343 running_asynch_code = 1;
3b9a3dfa
RS
2344 internal_condition_case_1 (read_process_output_call,
2345 Fcons (outstream,
2346 Fcons (proc,
7074fde6
FP
2347 Fcons (make_string (chars,
2348 nchars),
3b9a3dfa
RS
2349 Qnil))),
2350 !NILP (Vdebug_on_error) ? Qnil : Qerror,
2351 read_process_output_error_handler);
7074fde6
FP
2352 running_asynch_code = 0;
2353 restore_match_data ();
d0d6b7c5 2354
592ce97f 2355 /* Handling the process output should not deactivate the mark. */
30c78175
RS
2356 Vdeactivate_mark = odeactivate;
2357
dfc21838
RS
2358 if (! EQ (Fcurrent_buffer (), obuffer)
2359 || ! EQ (current_buffer->keymap, okeymap))
d72534ba
KH
2360 record_asynch_buffer_change ();
2361
8b4d685f
RS
2362 if (waiting_for_user_input_p)
2363 prepare_menu_bars ();
2364
d0d6b7c5
JB
2365#ifdef VMS
2366 start_vms_process_read (vs);
2367#endif
2ea6d561 2368 unbind_to (count, Qnil);
d0d6b7c5
JB
2369 return nchars;
2370 }
2371
2372 /* If no filter, write into buffer if it isn't dead. */
2373 if (!NILP (p->buffer) && !NILP (XBUFFER (p->buffer)->name))
2374 {
b0310da4
JB
2375 Lisp_Object old_read_only;
2376 Lisp_Object old_begv, old_zv;
30c78175
RS
2377 Lisp_Object odeactivate;
2378
2379 odeactivate = Vdeactivate_mark;
d0d6b7c5
JB
2380
2381 Fset_buffer (p->buffer);
2382 opoint = point;
b0310da4 2383 old_read_only = current_buffer->read_only;
22719df2
KH
2384 XSETFASTINT (old_begv, BEGV);
2385 XSETFASTINT (old_zv, ZV);
b0310da4
JB
2386
2387 current_buffer->read_only = Qnil;
d0d6b7c5
JB
2388
2389 /* Insert new output into buffer
2390 at the current end-of-output marker,
2391 thus preserving logical ordering of input and output. */
2392 if (XMARKER (p->mark)->buffer)
53aad33f 2393 SET_PT (clip_to_bounds (BEGV, marker_position (p->mark), ZV));
d0d6b7c5
JB
2394 else
2395 SET_PT (ZV);
b0310da4
JB
2396
2397 /* If the output marker is outside of the visible region, save
2398 the restriction and widen. */
2399 if (! (BEGV <= point && point <= ZV))
2400 Fwiden ();
2401
2402 /* Make sure opoint floats ahead of any new text, just as point
2403 would. */
d0d6b7c5
JB
2404 if (point <= opoint)
2405 opoint += nchars;
2406
b0310da4
JB
2407 /* Insert after old_begv, but before old_zv. */
2408 if (point < XFASTINT (old_begv))
7c6f34f0 2409 XSETFASTINT (old_begv, XFASTINT (old_begv) + nchars);
b0310da4 2410 if (point <= XFASTINT (old_zv))
7c6f34f0 2411 XSETFASTINT (old_zv, XFASTINT (old_zv) + nchars);
b0310da4 2412
d0d6b7c5
JB
2413 /* Insert before markers in case we are inserting where
2414 the buffer's mark is, and the user's next command is Meta-y. */
2415 insert_before_markers (chars, nchars);
d0d6b7c5 2416 Fset_marker (p->mark, make_number (point), p->buffer);
b0310da4 2417
d0d6b7c5
JB
2418 update_mode_lines++;
2419
b0310da4
JB
2420 /* If the restriction isn't what it should be, set it. */
2421 if (XFASTINT (old_begv) != BEGV || XFASTINT (old_zv) != ZV)
2422 Fnarrow_to_region (old_begv, old_zv);
2423
592ce97f 2424 /* Handling the process output should not deactivate the mark. */
30c78175
RS
2425 Vdeactivate_mark = odeactivate;
2426
b0310da4 2427 current_buffer->read_only = old_read_only;
d0d6b7c5
JB
2428 SET_PT (opoint);
2429 set_buffer_internal (old);
2430 }
2431#ifdef VMS
2432 start_vms_process_read (vs);
2433#endif
2434 return nchars;
2435}
2436
2437DEFUN ("waiting-for-user-input-p", Fwaiting_for_user_input_p, Swaiting_for_user_input_p,
2438 0, 0, 0,
8b4d685f 2439 "Returns non-nil if emacs is waiting for input from the user.\n\
d0d6b7c5
JB
2440This is intended for use by asynchronous process output filters and sentinels.")
2441 ()
2442{
8b4d685f 2443 return (waiting_for_user_input_p ? Qt : Qnil);
d0d6b7c5
JB
2444}
2445\f
2446/* Sending data to subprocess */
2447
2448jmp_buf send_process_frame;
2449
2450SIGTYPE
2451send_process_trap ()
2452{
2453#ifdef BSD4_1
2454 sigrelse (SIGPIPE);
2455 sigrelse (SIGALRM);
2456#endif /* BSD4_1 */
2457 longjmp (send_process_frame, 1);
2458}
2459
4556b700
RS
2460/* Send some data to process PROC.
2461 BUF is the beginning of the data; LEN is the number of characters.
2462 OBJECT is the Lisp object that the data comes from. */
2463
2464send_process (proc, buf, len, object)
d0d6b7c5
JB
2465 Lisp_Object proc;
2466 char *buf;
2467 int len;
4556b700 2468 Lisp_Object object;
d0d6b7c5
JB
2469{
2470 /* Don't use register vars; longjmp can lose them. */
2471 int rv;
2472 unsigned char *procname = XSTRING (XPROCESS (proc)->name)->data;
2473
d0d6b7c5
JB
2474#ifdef VMS
2475 struct Lisp_Process *p = XPROCESS (proc);
2476 VMS_PROC_STUFF *vs, *get_vms_process_pointer();
2477#endif /* VMS */
2478
2479 if (! NILP (XPROCESS (proc)->raw_status_low))
2480 update_status (XPROCESS (proc));
2481 if (! EQ (XPROCESS (proc)->status, Qrun))
2482 error ("Process %s not running", procname);
2483
2484#ifdef VMS
2485 vs = get_vms_process_pointer (p->pid);
2486 if (vs == 0)
2487 error ("Could not find this process: %x", p->pid);
2488 else if (write_to_vms_process (vs, buf, len))
2489 ;
2490#else
4556b700
RS
2491
2492 if (pty_max_bytes == 0)
2493 {
2494#if defined (HAVE_FPATHCONF) && defined (_PC_MAX_CANON)
2495 pty_max_bytes = fpathconf (XFASTINT (XPROCESS (proc)->outfd),
2496 _PC_MAX_CANON);
2497 if (pty_max_bytes < 0)
2498 pty_max_bytes = 250;
2499#else
2500 pty_max_bytes = 250;
2501#endif
2502 /* Deduct one, to leave space for the eof. */
2503 pty_max_bytes--;
2504 }
2505
d0d6b7c5
JB
2506 if (!setjmp (send_process_frame))
2507 while (len > 0)
2508 {
2509 int this = len;
4746118a 2510 SIGTYPE (*old_sigpipe)();
93b4f699
RS
2511 int flush_pty = 0;
2512
4556b700
RS
2513 /* Decide how much data we can send in one batch.
2514 Long lines need to be split into multiple batches. */
2515 if (!NILP (XPROCESS (proc)->pty_flag))
93b4f699 2516 {
4556b700
RS
2517 /* Starting this at zero is always correct when not the first iteration
2518 because the previous iteration ended by sending C-d.
2519 It may not be correct for the first iteration
2520 if a partial line was sent in a separate send_process call.
2521 If that proves worth handling, we need to save linepos
2522 in the process object. */
2523 int linepos = 0;
2524 char *ptr = buf;
2525 char *end = buf + len;
2526
2527 /* Scan through this text for a line that is too long. */
2528 while (ptr != end && linepos < pty_max_bytes)
2529 {
2530 if (*ptr == '\n')
2531 linepos = 0;
2532 else
2533 linepos++;
2534 ptr++;
2535 }
2536 /* If we found one, break the line there
2537 and put in a C-d to force the buffer through. */
2538 this = ptr - buf;
93b4f699
RS
2539 }
2540
4556b700
RS
2541 /* Send this batch, using one or more write calls. */
2542 while (this > 0)
d0d6b7c5 2543 {
4556b700
RS
2544 old_sigpipe = (SIGTYPE (*) ()) signal (SIGPIPE, send_process_trap);
2545 rv = write (XINT (XPROCESS (proc)->outfd), buf, this);
2546 signal (SIGPIPE, old_sigpipe);
2547
2548 if (rv < 0)
2549 {
2550 if (0
d0d6b7c5 2551#ifdef EWOULDBLOCK
4556b700 2552 || errno == EWOULDBLOCK
d0d6b7c5
JB
2553#endif
2554#ifdef EAGAIN
4556b700 2555 || errno == EAGAIN
d0d6b7c5 2556#endif
4556b700
RS
2557 )
2558 /* Buffer is full. Wait, accepting input;
2559 that may allow the program
2560 to finish doing output and read more. */
2561 {
2562 Lisp_Object zero;
2563 int offset;
2564
2565 /* Running filters might relocate buffers or strings.
2566 Arrange to relocate BUF. */
2567 if (BUFFERP (object))
2568 offset = BUF_PTR_CHAR_POS (XBUFFER (object),
2569 (unsigned char *) buf);
2570 else if (STRINGP (object))
2571 offset = buf - (char *) XSTRING (object)->data;
2572
22719df2 2573 XSETFASTINT (zero, 0);
4556b700
RS
2574 wait_reading_process_input (1, 0, zero, 0);
2575
2576 if (BUFFERP (object))
2577 buf = (char *) BUF_CHAR_ADDRESS (XBUFFER (object), offset);
2578 else if (STRINGP (object))
2579 buf = offset + (char *) XSTRING (object)->data;
2580
2581 rv = 0;
2582 }
2583 else
2584 /* This is a real error. */
2585 report_file_error ("writing to process", Fcons (proc, Qnil));
d0d6b7c5 2586 }
4556b700
RS
2587 buf += rv;
2588 len -= rv;
2589 this -= rv;
d0d6b7c5 2590 }
f76475ad 2591
4556b700
RS
2592 /* If we sent just part of the string, put in an EOF
2593 to force it through, before we send the rest. */
2594 if (len > 0)
2595 Fprocess_send_eof (proc);
d0d6b7c5
JB
2596 }
2597#endif
2598 else
2599 {
2600 XPROCESS (proc)->raw_status_low = Qnil;
2601 XPROCESS (proc)->raw_status_high = Qnil;
2602 XPROCESS (proc)->status = Fcons (Qexit, Fcons (make_number (256), Qnil));
2603 XSETINT (XPROCESS (proc)->tick, ++process_tick);
2604 deactivate_process (proc);
2605#ifdef VMS
2606 error ("Error writing to process %s; closed it", procname);
2607#else
2608 error ("SIGPIPE raised on process %s; closed it", procname);
2609#endif
2610 }
2611}
2612
2613DEFUN ("process-send-region", Fprocess_send_region, Sprocess_send_region,
2614 3, 3, 0,
2615 "Send current contents of region as input to PROCESS.\n\
ebb9e16f
JB
2616PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
2617nil, indicating the current buffer's process.\n\
d0d6b7c5
JB
2618Called from program, takes three arguments, PROCESS, START and END.\n\
2619If the region is more than 500 characters long,\n\
2620it is sent in several bunches. This may happen even for shorter regions.\n\
2621Output from processes can arrive in between bunches.")
2622 (process, start, end)
2623 Lisp_Object process, start, end;
2624{
2625 Lisp_Object proc;
2626 int start1;
2627
2628 proc = get_process (process);
2629 validate_region (&start, &end);
2630
2631 if (XINT (start) < GPT && XINT (end) > GPT)
2632 move_gap (start);
2633
2634 start1 = XINT (start);
4556b700
RS
2635 send_process (proc, &FETCH_CHAR (start1), XINT (end) - XINT (start),
2636 Fcurrent_buffer ());
d0d6b7c5
JB
2637
2638 return Qnil;
2639}
2640
2641DEFUN ("process-send-string", Fprocess_send_string, Sprocess_send_string,
2642 2, 2, 0,
2643 "Send PROCESS the contents of STRING as input.\n\
ebb9e16f
JB
2644PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
2645nil, indicating the current buffer's process.\n\
d0d6b7c5
JB
2646If STRING is more than 500 characters long,\n\
2647it is sent in several bunches. This may happen even for shorter strings.\n\
2648Output from processes can arrive in between bunches.")
2649 (process, string)
2650 Lisp_Object process, string;
2651{
2652 Lisp_Object proc;
2653 CHECK_STRING (string, 1);
2654 proc = get_process (process);
4556b700 2655 send_process (proc, XSTRING (string)->data, XSTRING (string)->size, string);
d0d6b7c5
JB
2656 return Qnil;
2657}
2658\f
2659/* send a signal number SIGNO to PROCESS.
2660 CURRENT_GROUP means send to the process group that currently owns
2661 the terminal being used to communicate with PROCESS.
2662 This is used for various commands in shell mode.
2663 If NOMSG is zero, insert signal-announcements into process's buffers
b0310da4
JB
2664 right away.
2665
2666 If we can, we try to signal PROCESS by sending control characters
e333e864 2667 down the pty. This allows us to signal inferiors who have changed
b0310da4 2668 their uid, for which killpg would return an EPERM error. */
d0d6b7c5 2669
f9738840 2670static void
d0d6b7c5
JB
2671process_send_signal (process, signo, current_group, nomsg)
2672 Lisp_Object process;
2673 int signo;
2674 Lisp_Object current_group;
2675 int nomsg;
2676{
2677 Lisp_Object proc;
2678 register struct Lisp_Process *p;
2679 int gid;
2680 int no_pgrp = 0;
2681
2682 proc = get_process (process);
2683 p = XPROCESS (proc);
2684
2685 if (!EQ (p->childp, Qt))
2686 error ("Process %s is not a subprocess",
2687 XSTRING (p->name)->data);
a9f2c884 2688 if (XINT (p->infd) < 0)
d0d6b7c5
JB
2689 error ("Process %s is not active",
2690 XSTRING (p->name)->data);
2691
2692 if (NILP (p->pty_flag))
2693 current_group = Qnil;
2694
d0d6b7c5
JB
2695 /* If we are using pgrps, get a pgrp number and make it negative. */
2696 if (!NILP (current_group))
2697 {
b0310da4 2698#ifdef SIGNALS_VIA_CHARACTERS
d0d6b7c5
JB
2699 /* If possible, send signals to the entire pgrp
2700 by sending an input character to it. */
b0310da4 2701
6be429b1
JB
2702 /* TERMIOS is the latest and bestest, and seems most likely to
2703 work. If the system has it, use it. */
2704#ifdef HAVE_TERMIOS
2705 struct termios t;
2706
2707 switch (signo)
2708 {
2709 case SIGINT:
a9f2c884 2710 tcgetattr (XINT (p->infd), &t);
4556b700 2711 send_process (proc, &t.c_cc[VINTR], 1, Qnil);
a87b802f 2712 return;
6be429b1
JB
2713
2714 case SIGQUIT:
a9f2c884 2715 tcgetattr (XINT (p->infd), &t);
4556b700 2716 send_process (proc, &t.c_cc[VQUIT], 1, Qnil);
a87b802f 2717 return;
6be429b1
JB
2718
2719 case SIGTSTP:
a9f2c884 2720 tcgetattr (XINT (p->infd), &t);
d0adf46f 2721#if defined (VSWTCH) && !defined (PREFER_VSUSP)
4556b700 2722 send_process (proc, &t.c_cc[VSWTCH], 1, Qnil);
6be429b1 2723#else
4556b700 2724 send_process (proc, &t.c_cc[VSUSP], 1, Qnil);
6be429b1 2725#endif
a87b802f 2726 return;
6be429b1
JB
2727 }
2728
2729#else /* ! HAVE_TERMIOS */
2730
b0310da4
JB
2731 /* On Berkeley descendants, the following IOCTL's retrieve the
2732 current control characters. */
d0d6b7c5 2733#if defined (TIOCGLTC) && defined (TIOCGETC)
b0310da4 2734
d0d6b7c5
JB
2735 struct tchars c;
2736 struct ltchars lc;
2737
2738 switch (signo)
2739 {
2740 case SIGINT:
a9f2c884 2741 ioctl (XINT (p->infd), TIOCGETC, &c);
4556b700 2742 send_process (proc, &c.t_intrc, 1, Qnil);
f9738840 2743 return;
d0d6b7c5 2744 case SIGQUIT:
a9f2c884 2745 ioctl (XINT (p->infd), TIOCGETC, &c);
4556b700 2746 send_process (proc, &c.t_quitc, 1, Qnil);
f9738840 2747 return;
0ad77c54 2748#ifdef SIGTSTP
d0d6b7c5 2749 case SIGTSTP:
a9f2c884 2750 ioctl (XINT (p->infd), TIOCGLTC, &lc);
4556b700 2751 send_process (proc, &lc.t_suspc, 1, Qnil);
f9738840 2752 return;
b0310da4 2753#endif /* ! defined (SIGTSTP) */
d0d6b7c5 2754 }
b0310da4
JB
2755
2756#else /* ! defined (TIOCGLTC) && defined (TIOCGETC) */
2757
2758 /* On SYSV descendants, the TCGETA ioctl retrieves the current control
2759 characters. */
2760#ifdef TCGETA
d0d6b7c5
JB
2761 struct termio t;
2762 switch (signo)
2763 {
2764 case SIGINT:
a9f2c884 2765 ioctl (XINT (p->infd), TCGETA, &t);
4556b700 2766 send_process (proc, &t.c_cc[VINTR], 1, Qnil);
f9738840 2767 return;
d0d6b7c5 2768 case SIGQUIT:
a9f2c884 2769 ioctl (XINT (p->infd), TCGETA, &t);
4556b700 2770 send_process (proc, &t.c_cc[VQUIT], 1, Qnil);
f9738840 2771 return;
7d79e3b4 2772#ifdef SIGTSTP
d0d6b7c5 2773 case SIGTSTP:
a9f2c884 2774 ioctl (XINT (p->infd), TCGETA, &t);
4556b700 2775 send_process (proc, &t.c_cc[VSWTCH], 1, Qnil);
f9738840 2776 return;
b0310da4 2777#endif /* ! defined (SIGTSTP) */
d0d6b7c5 2778 }
b0310da4
JB
2779#else /* ! defined (TCGETA) */
2780 Your configuration files are messed up.
2781 /* If your system configuration files define SIGNALS_VIA_CHARACTERS,
2782 you'd better be using one of the alternatives above! */
2783#endif /* ! defined (TCGETA) */
2784#endif /* ! defined (TIOCGLTC) && defined (TIOCGETC) */
6be429b1 2785#endif /* ! defined HAVE_TERMIOS */
b0310da4 2786#endif /* ! defined (SIGNALS_VIA_CHARACTERS) */
d0d6b7c5 2787
301c3fe4 2788#ifdef TIOCGPGRP
d0d6b7c5
JB
2789 /* Get the pgrp using the tty itself, if we have that.
2790 Otherwise, use the pty to get the pgrp.
2791 On pfa systems, saka@pfu.fujitsu.co.JP writes:
b0310da4
JB
2792 "TIOCGPGRP symbol defined in sys/ioctl.h at E50.
2793 But, TIOCGPGRP does not work on E50 ;-P works fine on E60"
d0d6b7c5
JB
2794 His patch indicates that if TIOCGPGRP returns an error, then
2795 we should just assume that p->pid is also the process group id. */
2796 {
2797 int err;
2798
2799 if (!NILP (p->subtty))
2800 err = ioctl (XFASTINT (p->subtty), TIOCGPGRP, &gid);
2801 else
a9f2c884 2802 err = ioctl (XINT (p->infd), TIOCGPGRP, &gid);
d0d6b7c5
JB
2803
2804#ifdef pfa
2805 if (err == -1)
2806 gid = - XFASTINT (p->pid);
301c3fe4 2807#endif /* ! defined (pfa) */
d0d6b7c5
JB
2808 }
2809 if (gid == -1)
2810 no_pgrp = 1;
2811 else
2812 gid = - gid;
b0310da4 2813#else /* ! defined (TIOCGPGRP ) */
301c3fe4
JB
2814 /* Can't select pgrps on this system, so we know that
2815 the child itself heads the pgrp. */
2816 gid = - XFASTINT (p->pid);
2817#endif /* ! defined (TIOCGPGRP ) */
d0d6b7c5
JB
2818 }
2819 else
2820 gid = - XFASTINT (p->pid);
d0d6b7c5
JB
2821
2822 switch (signo)
2823 {
2824#ifdef SIGCONT
2825 case SIGCONT:
2826 p->raw_status_low = Qnil;
2827 p->raw_status_high = Qnil;
2828 p->status = Qrun;
2829 XSETINT (p->tick, ++process_tick);
2830 if (!nomsg)
2831 status_notify ();
2832 break;
301c3fe4 2833#endif /* ! defined (SIGCONT) */
d0d6b7c5
JB
2834 case SIGINT:
2835#ifdef VMS
4556b700 2836 send_process (proc, "\003", 1, Qnil); /* ^C */
d0d6b7c5
JB
2837 goto whoosh;
2838#endif
2839 case SIGQUIT:
2840#ifdef VMS
4556b700 2841 send_process (proc, "\031", 1, Qnil); /* ^Y */
d0d6b7c5
JB
2842 goto whoosh;
2843#endif
2844 case SIGKILL:
2845#ifdef VMS
2846 sys$forcex (&(XFASTINT (p->pid)), 0, 1);
2847 whoosh:
2848#endif
a9f2c884 2849 flush_pending_output (XINT (p->infd));
d0d6b7c5
JB
2850 break;
2851 }
2852
2853 /* If we don't have process groups, send the signal to the immediate
2854 subprocess. That isn't really right, but it's better than any
2855 obvious alternative. */
2856 if (no_pgrp)
2857 {
2858 kill (XFASTINT (p->pid), signo);
2859 return;
2860 }
2861
2862 /* gid may be a pid, or minus a pgrp's number */
2863#ifdef TIOCSIGSEND
2864 if (!NILP (current_group))
a9f2c884 2865 ioctl (XINT (p->infd), TIOCSIGSEND, signo);
d0d6b7c5
JB
2866 else
2867 {
2868 gid = - XFASTINT (p->pid);
2869 kill (gid, signo);
2870 }
301c3fe4 2871#else /* ! defined (TIOCSIGSEND) */
d0d6b7c5 2872 EMACS_KILLPG (-gid, signo);
301c3fe4 2873#endif /* ! defined (TIOCSIGSEND) */
d0d6b7c5
JB
2874}
2875
2876DEFUN ("interrupt-process", Finterrupt_process, Sinterrupt_process, 0, 2, 0,
2877 "Interrupt process PROCESS. May be process or name of one.\n\
ebb9e16f 2878PROCESS may be a process, a buffer, or the name of a process or buffer.\n\
e333e864 2879nil or no arg means current buffer's process.\n\
d0d6b7c5
JB
2880Second arg CURRENT-GROUP non-nil means send signal to\n\
2881the current process-group of the process's controlling terminal\n\
2882rather than to the process's own process group.\n\
2883If the process is a shell, this means interrupt current subjob\n\
2884rather than the shell.")
2885 (process, current_group)
2886 Lisp_Object process, current_group;
2887{
2888 process_send_signal (process, SIGINT, current_group, 0);
2889 return process;
2890}
2891
2892DEFUN ("kill-process", Fkill_process, Skill_process, 0, 2, 0,
2893 "Kill process PROCESS. May be process or name of one.\n\
2894See function `interrupt-process' for more details on usage.")
2895 (process, current_group)
2896 Lisp_Object process, current_group;
2897{
2898 process_send_signal (process, SIGKILL, current_group, 0);
2899 return process;
2900}
2901
2902DEFUN ("quit-process", Fquit_process, Squit_process, 0, 2, 0,
2903 "Send QUIT signal to process PROCESS. May be process or name of one.\n\
2904See function `interrupt-process' for more details on usage.")
2905 (process, current_group)
2906 Lisp_Object process, current_group;
2907{
2908 process_send_signal (process, SIGQUIT, current_group, 0);
2909 return process;
2910}
2911
2912DEFUN ("stop-process", Fstop_process, Sstop_process, 0, 2, 0,
2913 "Stop process PROCESS. May be process or name of one.\n\
2914See function `interrupt-process' for more details on usage.")
2915 (process, current_group)
2916 Lisp_Object process, current_group;
2917{
2918#ifndef SIGTSTP
2919 error ("no SIGTSTP support");
2920#else
2921 process_send_signal (process, SIGTSTP, current_group, 0);
2922#endif
2923 return process;
2924}
2925
2926DEFUN ("continue-process", Fcontinue_process, Scontinue_process, 0, 2, 0,
2927 "Continue process PROCESS. May be process or name of one.\n\
2928See function `interrupt-process' for more details on usage.")
2929 (process, current_group)
2930 Lisp_Object process, current_group;
2931{
2932#ifdef SIGCONT
2933 process_send_signal (process, SIGCONT, current_group, 0);
2934#else
2935 error ("no SIGCONT support");
2936#endif
2937 return process;
2938}
2939
2940DEFUN ("signal-process", Fsignal_process, Ssignal_process,
2941 2, 2, "nProcess number: \nnSignal code: ",
4766242d
RS
2942 "Send the process with process id PID the signal with code SIGCODE.\n\
2943PID must be an integer. The process need not be a child of this Emacs.\n\
2944SIGCODE may be an integer, or a symbol whose name is a signal name.")
2945 (pid, sigcode)
2946 Lisp_Object pid, sigcode;
d0d6b7c5
JB
2947{
2948 CHECK_NUMBER (pid, 0);
4766242d
RS
2949
2950#define handle_signal(NAME, VALUE) \
2951 else if (!strcmp (name, NAME)) \
2952 XSETINT (sigcode, VALUE)
2953
2954 if (INTEGERP (sigcode))
2955 ;
2956 else
2957 {
2958 unsigned char *name;
2959
2960 CHECK_SYMBOL (sigcode, 1);
2961 name = XSYMBOL (sigcode)->name->data;
2962
2963 if (0)
2964 ;
2965#ifdef SIGHUP
2966 handle_signal ("SIGHUP", SIGHUP);
2967#endif
2968#ifdef SIGINT
2969 handle_signal ("SIGINT", SIGINT);
2970#endif
2971#ifdef SIGQUIT
2972 handle_signal ("SIGQUIT", SIGQUIT);
2973#endif
2974#ifdef SIGILL
2975 handle_signal ("SIGILL", SIGILL);
2976#endif
2977#ifdef SIGABRT
2978 handle_signal ("SIGABRT", SIGABRT);
2979#endif
2980#ifdef SIGEMT
2981 handle_signal ("SIGEMT", SIGEMT);
2982#endif
2983#ifdef SIGKILL
2984 handle_signal ("SIGKILL", SIGKILL);
2985#endif
2986#ifdef SIGFPE
2987 handle_signal ("SIGFPE", SIGFPE);
2988#endif
2989#ifdef SIGBUS
2990 handle_signal ("SIGBUS", SIGBUS);
2991#endif
2992#ifdef SIGSEGV
2993 handle_signal ("SIGSEGV", SIGSEGV);
2994#endif
2995#ifdef SIGSYS
2996 handle_signal ("SIGSYS", SIGSYS);
2997#endif
2998#ifdef SIGPIPE
2999 handle_signal ("SIGPIPE", SIGPIPE);
3000#endif
3001#ifdef SIGALRM
3002 handle_signal ("SIGALRM", SIGALRM);
3003#endif
3004#ifdef SIGTERM
3005 handle_signal ("SIGTERM", SIGTERM);
3006#endif
3007#ifdef SIGURG
3008 handle_signal ("SIGURG", SIGURG);
3009#endif
3010#ifdef SIGSTOP
3011 handle_signal ("SIGSTOP", SIGSTOP);
3012#endif
3013#ifdef SIGTSTP
3014 handle_signal ("SIGTSTP", SIGTSTP);
3015#endif
3016#ifdef SIGCONT
3017 handle_signal ("SIGCONT", SIGCONT);
3018#endif
3019#ifdef SIGCHLD
3020 handle_signal ("SIGCHLD", SIGCHLD);
3021#endif
3022#ifdef SIGTTIN
3023 handle_signal ("SIGTTIN", SIGTTIN);
3024#endif
3025#ifdef SIGTTOU
3026 handle_signal ("SIGTTOU", SIGTTOU);
3027#endif
3028#ifdef SIGIO
3029 handle_signal ("SIGIO", SIGIO);
3030#endif
3031#ifdef SIGXCPU
3032 handle_signal ("SIGXCPU", SIGXCPU);
3033#endif
3034#ifdef SIGXFSZ
3035 handle_signal ("SIGXFSZ", SIGXFSZ);
3036#endif
3037#ifdef SIGVTALRM
3038 handle_signal ("SIGVTALRM", SIGVTALRM);
3039#endif
3040#ifdef SIGPROF
3041 handle_signal ("SIGPROF", SIGPROF);
3042#endif
3043#ifdef SIGWINCH
3044 handle_signal ("SIGWINCH", SIGWINCH);
3045#endif
3046#ifdef SIGINFO
3047 handle_signal ("SIGINFO", SIGINFO);
3048#endif
3049#ifdef SIGUSR1
3050 handle_signal ("SIGUSR1", SIGUSR1);
3051#endif
3052#ifdef SIGUSR2
3053 handle_signal ("SIGUSR2", SIGUSR2);
3054#endif
3055 else
9fa195a2 3056 error ("Undefined signal name %s", name);
4766242d
RS
3057 }
3058
3059#undef handle_signal
3060
e98d950b
RS
3061#ifdef WINDOWSNT
3062 /* Only works for kill-type signals */
4766242d 3063 return make_number (win32_kill_process (XINT (pid), XINT (sigcode)));
e98d950b 3064#else
4766242d 3065 return make_number (kill (XINT (pid), XINT (sigcode)));
e98d950b 3066#endif
d0d6b7c5
JB
3067}
3068
3069DEFUN ("process-send-eof", Fprocess_send_eof, Sprocess_send_eof, 0, 1, 0,
3070 "Make PROCESS see end-of-file in its input.\n\
3071Eof comes after any text already sent to it.\n\
ebb9e16f 3072PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
d33a00f2
RS
3073nil, indicating the current buffer's process.\n\
3074If PROCESS is a network connection, or is a process communicating\n\
3075through a pipe (as opposed to a pty), then you cannot send any more\n\
3076text to PROCESS after you call this function.")
d0d6b7c5
JB
3077 (process)
3078 Lisp_Object process;
3079{
3080 Lisp_Object proc;
3081
3082 proc = get_process (process);
577d03d5
RS
3083
3084 /* Make sure the process is really alive. */
3085 if (! NILP (XPROCESS (proc)->raw_status_low))
3086 update_status (XPROCESS (proc));
3087 if (! EQ (XPROCESS (proc)->status, Qrun))
dcf970e6 3088 error ("Process %s not running", XSTRING (XPROCESS (proc)->name)->data);
577d03d5 3089
d0d6b7c5 3090#ifdef VMS
4556b700 3091 send_process (proc, "\032", 1, Qnil); /* ^z */
d0d6b7c5
JB
3092#else
3093 if (!NILP (XPROCESS (proc)->pty_flag))
4556b700 3094 send_process (proc, "\004", 1, Qnil);
d0d6b7c5
JB
3095 else
3096 {
a9f2c884 3097 close (XINT (XPROCESS (proc)->outfd));
1d056e64 3098 XSETINT (XPROCESS (proc)->outfd, open (NULL_DEVICE, O_WRONLY));
d0d6b7c5
JB
3099 }
3100#endif /* VMS */
d0d6b7c5
JB
3101 return process;
3102}
3103
3104/* Kill all processes associated with `buffer'.
3105 If `buffer' is nil, kill all processes */
3106
3107kill_buffer_processes (buffer)
3108 Lisp_Object buffer;
3109{
3110 Lisp_Object tail, proc;
3111
b5b502d6 3112 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCONS (tail)->cdr)
d0d6b7c5
JB
3113 {
3114 proc = XCONS (XCONS (tail)->car)->cdr;
b5b502d6 3115 if (GC_PROCESSP (proc)
d0d6b7c5
JB
3116 && (NILP (buffer) || EQ (XPROCESS (proc)->buffer, buffer)))
3117 {
3118 if (NETCONN_P (proc))
e1ab4959 3119 Fdelete_process (proc);
a9f2c884 3120 else if (XINT (XPROCESS (proc)->infd) >= 0)
d0d6b7c5
JB
3121 process_send_signal (proc, SIGHUP, Qnil, 1);
3122 }
3123 }
3124}
3125\f
3126/* On receipt of a signal that a child status has changed,
3127 loop asking about children with changed statuses until
3128 the system says there are no more.
3129 All we do is change the status;
3130 we do not run sentinels or print notifications.
3131 That is saved for the next time keyboard input is done,
3132 in order to avoid timing errors. */
3133
3134/** WARNING: this can be called during garbage collection.
3135 Therefore, it must not be fooled by the presence of mark bits in
3136 Lisp objects. */
3137
3138/** USG WARNING: Although it is not obvious from the documentation
3139 in signal(2), on a USG system the SIGCLD handler MUST NOT call
3140 signal() before executing at least one wait(), otherwise the handler
3141 will be called again, resulting in an infinite loop. The relevant
3142 portion of the documentation reads "SIGCLD signals will be queued
3143 and the signal-catching function will be continually reentered until
3144 the queue is empty". Invoking signal() causes the kernel to reexamine
3145 the SIGCLD queue. Fred Fish, UniSoft Systems Inc. */
3146
3147SIGTYPE
3148sigchld_handler (signo)
3149 int signo;
3150{
3151 int old_errno = errno;
3152 Lisp_Object proc;
3153 register struct Lisp_Process *p;
6be429b1 3154 extern EMACS_TIME *input_available_clear_time;
d0d6b7c5
JB
3155
3156#ifdef BSD4_1
3157 extern int sigheld;
3158 sigheld |= sigbit (SIGCHLD);
3159#endif
3160
3161 while (1)
3162 {
3163 register int pid;
3164 WAITTYPE w;
3165 Lisp_Object tail;
3166
3167#ifdef WNOHANG
3168#ifndef WUNTRACED
3169#define WUNTRACED 0
3170#endif /* no WUNTRACED */
3171 /* Keep trying to get a status until we get a definitive result. */
3172 do
3173 {
3174 errno = 0;
3175 pid = wait3 (&w, WNOHANG | WUNTRACED, 0);
3176 }
3177 while (pid <= 0 && errno == EINTR);
3178
3179 if (pid <= 0)
3180 {
3181 /* A real failure. We have done all our job, so return. */
3182
3183 /* USG systems forget handlers when they are used;
3184 must reestablish each time */
3185#ifdef USG
3186 signal (signo, sigchld_handler); /* WARNING - must come after wait3() */
3187#endif
3188#ifdef BSD4_1
3189 sigheld &= ~sigbit (SIGCHLD);
3190 sigrelse (SIGCHLD);
3191#endif
3192 errno = old_errno;
3193 return;
3194 }
3195#else
3196 pid = wait (&w);
3197#endif /* no WNOHANG */
3198
3199 /* Find the process that signaled us, and record its status. */
3200
3201 p = 0;
3202 for (tail = Vprocess_alist; XSYMBOL (tail) != XSYMBOL (Qnil); tail = XCONS (tail)->cdr)
3203 {
3204 proc = XCONS (XCONS (tail)->car)->cdr;
3205 p = XPROCESS (proc);
3206 if (EQ (p->childp, Qt) && XFASTINT (p->pid) == pid)
3207 break;
3208 p = 0;
3209 }
3210
3211 /* Look for an asynchronous process whose pid hasn't been filled
3212 in yet. */
3213 if (p == 0)
3214 for (tail = Vprocess_alist; XSYMBOL (tail) != XSYMBOL (Qnil); tail = XCONS (tail)->cdr)
3215 {
3216 proc = XCONS (XCONS (tail)->car)->cdr;
3217 p = XPROCESS (proc);
bcd69aea 3218 if (INTEGERP (p->pid) && XINT (p->pid) == -1)
d0d6b7c5
JB
3219 break;
3220 p = 0;
3221 }
3222
3223 /* Change the status of the process that was found. */
3224 if (p != 0)
3225 {
3226 union { int i; WAITTYPE wt; } u;
e98d950b 3227 int clear_desc_flag = 0;
d0d6b7c5
JB
3228
3229 XSETINT (p->tick, ++process_tick);
3230 u.wt = w;
22719df2
KH
3231 XSETFASTINT (p->raw_status_low, u.i & 0xffff);
3232 XSETFASTINT (p->raw_status_high, u.i >> 16);
d0d6b7c5
JB
3233
3234 /* If process has terminated, stop waiting for its output. */
e98d950b
RS
3235 if ((WIFSIGNALED (w) || WIFEXITED (w))
3236 && XINT (p->infd) >= 0)
3237 clear_desc_flag = 1;
3238
3239 /* We use clear_desc_flag to avoid a compiler bug in Microsoft C. */
3240 if (clear_desc_flag)
3241 {
3242 FD_CLR (XINT (p->infd), &input_wait_mask);
3243 FD_CLR (XINT (p->infd), &non_keyboard_wait_mask);
3244 }
6be429b1
JB
3245
3246 /* Tell wait_reading_process_input that it needs to wake up and
3247 look around. */
3248 if (input_available_clear_time)
3249 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
d0d6b7c5
JB
3250 }
3251
3252 /* There was no asynchronous process found for that id. Check
3253 if we have a synchronous process. */
3254 else
3255 {
3256 synch_process_alive = 0;
3257
3258 /* Report the status of the synchronous process. */
3259 if (WIFEXITED (w))
3260 synch_process_retcode = WRETCODE (w);
3261 else if (WIFSIGNALED (w))
b97ad9ea
RS
3262 {
3263 int code = WTERMSIG (w);
3264 char *signame = 0;
3265
3266 if (code < NSIG)
3267 {
b0310da4 3268#ifndef VMS
ed0cae05
RS
3269 /* Suppress warning if the table has const char *. */
3270 signame = (char *) sys_siglist[code];
b0310da4 3271#else
b97ad9ea 3272 signame = sys_errlist[code];
b0310da4 3273#endif
b97ad9ea
RS
3274 }
3275 if (signame == 0)
3276 signame = "unknown";
3277
3278 synch_process_death = signame;
3279 }
6be429b1
JB
3280
3281 /* Tell wait_reading_process_input that it needs to wake up and
3282 look around. */
3283 if (input_available_clear_time)
3284 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
d0d6b7c5
JB
3285 }
3286
3287 /* On some systems, we must return right away.
3288 If any more processes want to signal us, we will
3289 get another signal.
3290 Otherwise (on systems that have WNOHANG), loop around
3291 to use up all the processes that have something to tell us. */
e98d950b 3292#if defined (USG) && ! (defined (HPUX) && defined (WNOHANG)) || defined (WINDOWSNT)
d0d6b7c5
JB
3293#ifdef USG
3294 signal (signo, sigchld_handler);
3295#endif
3296 errno = old_errno;
3297 return;
3298#endif /* USG, but not HPUX with WNOHANG */
3299 }
3300}
3301\f
3302
3303static Lisp_Object
3304exec_sentinel_unwind (data)
3305 Lisp_Object data;
3306{
3307 XPROCESS (XCONS (data)->car)->sentinel = XCONS (data)->cdr;
3308 return Qnil;
3309}
3310
3b9a3dfa
RS
3311static Lisp_Object
3312exec_sentinel_error_handler (error)
3313 Lisp_Object error;
3314{
3315 cmd_error_internal (error, "error in process sentinel: ");
3316 Vinhibit_quit = Qt;
3317 update_echo_area ();
3318 Fsleep_for (make_number (2));
3319}
3320
d0d6b7c5
JB
3321static void
3322exec_sentinel (proc, reason)
3323 Lisp_Object proc, reason;
3324{
dfc21838 3325 Lisp_Object sentinel, obuffer, odeactivate, okeymap;
d0d6b7c5
JB
3326 register struct Lisp_Process *p = XPROCESS (proc);
3327 int count = specpdl_ptr - specpdl;
3328
dfc21838
RS
3329 /* No need to gcpro these, because all we do with them later
3330 is test them for EQness, and none of them should be a string. */
8fb3cf64 3331 odeactivate = Vdeactivate_mark;
dfc21838
RS
3332 XSETBUFFER (obuffer, current_buffer);
3333 okeymap = current_buffer->keymap;
3334
d0d6b7c5
JB
3335 sentinel = p->sentinel;
3336 if (NILP (sentinel))
3337 return;
3338
3339 /* Zilch the sentinel while it's running, to avoid recursive invocations;
3340 assure that it gets restored no matter how the sentinel exits. */
3341 p->sentinel = Qnil;
3342 record_unwind_protect (exec_sentinel_unwind, Fcons (proc, sentinel));
3343 /* Inhibit quit so that random quits don't screw up a running filter. */
3344 specbind (Qinhibit_quit, Qt);
6545aada 3345 specbind (Qlast_nonmenu_event, Qt);
3b9a3dfa 3346
7074fde6 3347 running_asynch_code = 1;
3b9a3dfa
RS
3348 internal_condition_case_1 (read_process_output_call,
3349 Fcons (sentinel,
3350 Fcons (proc, Fcons (reason, Qnil))),
3351 !NILP (Vdebug_on_error) ? Qnil : Qerror,
3352 exec_sentinel_error_handler);
7074fde6
FP
3353 running_asynch_code = 0;
3354 restore_match_data ();
8fb3cf64
KH
3355
3356 Vdeactivate_mark = odeactivate;
dfc21838
RS
3357 if (! EQ (Fcurrent_buffer (), obuffer)
3358 || ! EQ (current_buffer->keymap, okeymap))
8fb3cf64
KH
3359 record_asynch_buffer_change ();
3360
8b4d685f
RS
3361 if (waiting_for_user_input_p)
3362 prepare_menu_bars ();
2ea6d561 3363 unbind_to (count, Qnil);
d0d6b7c5
JB
3364}
3365
3366/* Report all recent events of a change in process status
3367 (either run the sentinel or output a message).
3368 This is done while Emacs is waiting for keyboard input. */
3369
3370status_notify ()
3371{
3372 register Lisp_Object proc, buffer;
2e4149a8 3373 Lisp_Object tail, msg;
d0d6b7c5
JB
3374 struct gcpro gcpro1, gcpro2;
3375
2e4149a8
KH
3376 tail = Qnil;
3377 msg = Qnil;
d0d6b7c5
JB
3378 /* We need to gcpro tail; if read_process_output calls a filter
3379 which deletes a process and removes the cons to which tail points
3380 from Vprocess_alist, and then causes a GC, tail is an unprotected
3381 reference. */
3382 GCPRO2 (tail, msg);
3383
3384 for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail))
3385 {
3386 Lisp_Object symbol;
3387 register struct Lisp_Process *p;
3388
3389 proc = Fcdr (Fcar (tail));
3390 p = XPROCESS (proc);
3391
3392 if (XINT (p->tick) != XINT (p->update_tick))
3393 {
3394 XSETINT (p->update_tick, XINT (p->tick));
3395
3396 /* If process is still active, read any output that remains. */
a9f2c884 3397 if (XINT (p->infd) >= 0)
20ddfff7 3398 while (! EQ (p->filter, Qt)
a9f2c884 3399 && read_process_output (proc, XINT (p->infd)) > 0);
d0d6b7c5
JB
3400
3401 buffer = p->buffer;
3402
3403 /* Get the text to use for the message. */
3404 if (!NILP (p->raw_status_low))
3405 update_status (p);
3406 msg = status_message (p->status);
3407
3408 /* If process is terminated, deactivate it or delete it. */
3409 symbol = p->status;
bcd69aea 3410 if (CONSP (p->status))
d0d6b7c5
JB
3411 symbol = XCONS (p->status)->car;
3412
3413 if (EQ (symbol, Qsignal) || EQ (symbol, Qexit)
3414 || EQ (symbol, Qclosed))
3415 {
3416 if (delete_exited_processes)
3417 remove_process (proc);
3418 else
3419 deactivate_process (proc);
3420 }
3421
3422 /* Now output the message suitably. */
3423 if (!NILP (p->sentinel))
3424 exec_sentinel (proc, msg);
3425 /* Don't bother with a message in the buffer
3426 when a process becomes runnable. */
3427 else if (!EQ (symbol, Qrun) && !NILP (buffer))
3428 {
2e4149a8 3429 Lisp_Object ro, tem;
d0d6b7c5
JB
3430 struct buffer *old = current_buffer;
3431 int opoint;
3432
2e4149a8
KH
3433 ro = XBUFFER (buffer)->read_only;
3434
d0d6b7c5
JB
3435 /* Avoid error if buffer is deleted
3436 (probably that's why the process is dead, too) */
3437 if (NILP (XBUFFER (buffer)->name))
3438 continue;
3439 Fset_buffer (buffer);
3440 opoint = point;
3441 /* Insert new output into buffer
3442 at the current end-of-output marker,
3443 thus preserving logical ordering of input and output. */
3444 if (XMARKER (p->mark)->buffer)
3445 SET_PT (marker_position (p->mark));
3446 else
3447 SET_PT (ZV);
3448 if (point <= opoint)
3449 opoint += XSTRING (msg)->size + XSTRING (p->name)->size + 10;
3450
3451 tem = current_buffer->read_only;
3452 current_buffer->read_only = Qnil;
3453 insert_string ("\nProcess ");
3454 Finsert (1, &p->name);
3455 insert_string (" ");
3456 Finsert (1, &msg);
3457 current_buffer->read_only = tem;
3458 Fset_marker (p->mark, make_number (point), p->buffer);
3459
3460 SET_PT (opoint);
3461 set_buffer_internal (old);
3462 }
3463 }
3464 } /* end for */
3465
3466 update_mode_lines++; /* in case buffers use %s in mode-line-format */
3467 redisplay_preserve_echo_area ();
3468
3469 update_tick = process_tick;
3470
3471 UNGCPRO;
3472}
3473\f
a69281ff
RS
3474/* The first time this is called, assume keyboard input comes from DESC
3475 instead of from where we used to expect it.
3476 Subsequent calls mean assume input keyboard can come from DESC
3477 in addition to other places. */
3478
3479static int add_keyboard_wait_descriptor_called_flag;
3480
3481void
3482add_keyboard_wait_descriptor (desc)
3483 int desc;
3484{
3485 if (! add_keyboard_wait_descriptor_called_flag)
3486 FD_CLR (0, &input_wait_mask);
3487 add_keyboard_wait_descriptor_called_flag = 1;
3488 FD_SET (desc, &input_wait_mask);
3489 if (desc > max_keyboard_desc)
3490 max_keyboard_desc = desc;
3491}
3492
3493/* From now on, do not expect DESC to give keyboard input. */
3494
3495void
3496delete_keyboard_wait_descriptor (desc)
3497 int desc;
3498{
3499 int fd;
3500 int lim = max_keyboard_desc;
3501
3502 FD_CLR (desc, &input_wait_mask);
3503
3504 if (desc == max_keyboard_desc)
3505 for (fd = 0; fd < lim; fd++)
3506 if (FD_ISSET (fd, &input_wait_mask)
3507 && !FD_ISSET (fd, &non_keyboard_wait_mask))
3508 max_keyboard_desc = fd;
3509}
3510
3511/* Return nonzero if *MASK has a bit set
3512 that corresponds to one of the keyboard input descriptors. */
3513
3514int
3515keyboard_bit_set (mask)
3516 SELECT_TYPE *mask;
3517{
3518 int fd;
3519
3520 for (fd = 0; fd < max_keyboard_desc; fd++)
3521 if (FD_ISSET (fd, mask) && FD_ISSET (fd, &input_wait_mask)
3522 && !FD_ISSET (fd, &non_keyboard_wait_mask))
3523 return 1;
3524
3525 return 0;
3526}
3527\f
d0d6b7c5
JB
3528init_process ()
3529{
3530 register int i;
3531
3532#ifdef SIGCHLD
3533#ifndef CANNOT_DUMP
3534 if (! noninteractive || initialized)
3535#endif
3536 signal (SIGCHLD, sigchld_handler);
3537#endif
3538
3539 FD_ZERO (&input_wait_mask);
a69281ff 3540 FD_ZERO (&non_keyboard_wait_mask);
7d0e672e 3541 max_process_desc = 0;
dd2281ae 3542
a69281ff 3543 FD_SET (0, &input_wait_mask);
dd2281ae 3544
d0d6b7c5
JB
3545 Vprocess_alist = Qnil;
3546 for (i = 0; i < MAXDESC; i++)
3547 {
3548 chan_process[i] = Qnil;
3549 proc_buffered_char[i] = -1;
3550 }
3551}
312c9964 3552
d0d6b7c5
JB
3553syms_of_process ()
3554{
d0d6b7c5
JB
3555#ifdef HAVE_SOCKETS
3556 stream_process = intern ("stream");
3557#endif
3558 Qprocessp = intern ("processp");
3559 staticpro (&Qprocessp);
3560 Qrun = intern ("run");
3561 staticpro (&Qrun);
3562 Qstop = intern ("stop");
3563 staticpro (&Qstop);
3564 Qsignal = intern ("signal");
3565 staticpro (&Qsignal);
3566
3567 /* Qexit is already staticpro'd by syms_of_eval; don't staticpro it
3568 here again.
3569
3570 Qexit = intern ("exit");
3571 staticpro (&Qexit); */
3572
3573 Qopen = intern ("open");
3574 staticpro (&Qopen);
3575 Qclosed = intern ("closed");
3576 staticpro (&Qclosed);
3577
6545aada
RS
3578 Qlast_nonmenu_event = intern ("last-nonmenu-event");
3579 staticpro (&Qlast_nonmenu_event);
3580
d0d6b7c5
JB
3581 staticpro (&Vprocess_alist);
3582
3583 DEFVAR_BOOL ("delete-exited-processes", &delete_exited_processes,
3584 "*Non-nil means delete processes immediately when they exit.\n\
3585nil means don't delete them until `list-processes' is run.");
3586
3587 delete_exited_processes = 1;
3588
3589 DEFVAR_LISP ("process-connection-type", &Vprocess_connection_type,
3590 "Control type of device used to communicate with subprocesses.\n\
e333e864
RS
3591Values are nil to use a pipe, or t or `pty' to use a pty.\n\
3592The value has no effect if the system has no ptys or if all ptys are busy:\n\
3593then a pipe is used in any case.\n\
3594The value takes effect when `start-process' is called.");
d0d6b7c5
JB
3595 Vprocess_connection_type = Qt;
3596
3597 defsubr (&Sprocessp);
3598 defsubr (&Sget_process);
3599 defsubr (&Sget_buffer_process);
3600 defsubr (&Sdelete_process);
3601 defsubr (&Sprocess_status);
3602 defsubr (&Sprocess_exit_status);
3603 defsubr (&Sprocess_id);
3604 defsubr (&Sprocess_name);
3b9a3dfa 3605 defsubr (&Sprocess_tty_name);
d0d6b7c5
JB
3606 defsubr (&Sprocess_command);
3607 defsubr (&Sset_process_buffer);
3608 defsubr (&Sprocess_buffer);
3609 defsubr (&Sprocess_mark);
3610 defsubr (&Sset_process_filter);
3611 defsubr (&Sprocess_filter);
3612 defsubr (&Sset_process_sentinel);
396df322 3613 defsubr (&Sset_process_window_size);
d0d6b7c5
JB
3614 defsubr (&Sprocess_sentinel);
3615 defsubr (&Sprocess_kill_without_query);
3616 defsubr (&Slist_processes);
3617 defsubr (&Sprocess_list);
3618 defsubr (&Sstart_process);
3619#ifdef HAVE_SOCKETS
3620 defsubr (&Sopen_network_stream);
3621#endif /* HAVE_SOCKETS */
3622 defsubr (&Saccept_process_output);
3623 defsubr (&Sprocess_send_region);
3624 defsubr (&Sprocess_send_string);
3625 defsubr (&Sinterrupt_process);
3626 defsubr (&Skill_process);
3627 defsubr (&Squit_process);
3628 defsubr (&Sstop_process);
3629 defsubr (&Scontinue_process);
3630 defsubr (&Sprocess_send_eof);
3631 defsubr (&Ssignal_process);
3632 defsubr (&Swaiting_for_user_input_p);
3633/* defsubr (&Sprocess_connection); */
3634}
3635
6720a7fb
JB
3636\f
3637#else /* not subprocesses */
3638
3639#include <sys/types.h>
3640#include <errno.h>
3641
3642#include "lisp.h"
3643#include "systime.h"
3644#include "termopts.h"
3645
ff11dfa1 3646extern int frame_garbaged;
6720a7fb
JB
3647
3648
3649/* As described above, except assuming that there are no subprocesses:
3650
3651 Wait for timeout to elapse and/or keyboard input to be available.
3652
3653 time_limit is:
3654 timeout in seconds, or
3655 zero for no limit, or
3656 -1 means gobble data immediately available but don't wait for any.
3657
f76475ad 3658 read_kbd is a Lisp_Object:
6720a7fb
JB
3659 0 to ignore keyboard input, or
3660 1 to return when input is available, or
3661 -1 means caller will actually read the input, so don't throw to
3662 the quit handler.
3663 We know that read_kbd will never be a Lisp_Process, since
3664 `subprocesses' isn't defined.
3665
3666 do_display != 0 means redisplay should be done to show subprocess
5164ee8e 3667 output that arrives.
6720a7fb 3668
eb8c3be9 3669 Return true iff we received input from any process. */
6720a7fb
JB
3670
3671int
3672wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
f76475ad
JB
3673 int time_limit, microsecs;
3674 Lisp_Object read_kbd;
3675 int do_display;
6720a7fb
JB
3676{
3677 EMACS_TIME end_time, timeout, *timeout_p;
3678 int waitchannels;
3679
3680 /* What does time_limit really mean? */
3681 if (time_limit || microsecs)
3682 {
3683 /* It's not infinite. */
3684 timeout_p = &timeout;
3685
3686 if (time_limit == -1)
3687 /* In fact, it's zero. */
3688 EMACS_SET_SECS_USECS (timeout, 0, 0);
3689 else
3690 EMACS_SET_SECS_USECS (timeout, time_limit, microsecs);
3691
3692 /* How far in the future is that? */
3693 EMACS_GET_TIME (end_time);
3694 EMACS_ADD_TIME (end_time, end_time, timeout);
3695 }
3696 else
3697 /* It's infinite. */
3698 timeout_p = 0;
3699
99e3d726
RS
3700 /* This must come before stop_polling. */
3701 prepare_menu_bars ();
3702
6720a7fb
JB
3703 /* Turn off periodic alarms (in case they are in use)
3704 because the select emulator uses alarms. */
3705 stop_polling ();
3706
3707 for (;;)
3708 {
3709 int nfds;
3710
f76475ad 3711 waitchannels = XINT (read_kbd) ? 1 : 0;
6720a7fb
JB
3712
3713 /* If calling from keyboard input, do not quit
3714 since we want to return C-g as an input character.
3715 Otherwise, do pending quit if requested. */
f76475ad 3716 if (XINT (read_kbd) >= 0)
6720a7fb
JB
3717 QUIT;
3718
3719 if (timeout_p)
3720 {
3721 EMACS_GET_TIME (*timeout_p);
3722 EMACS_SUB_TIME (*timeout_p, end_time, *timeout_p);
3723 if (EMACS_TIME_NEG_P (*timeout_p))
3724 break;
3725 }
3726
3727 /* Cause C-g and alarm signals to take immediate action,
3728 and cause input available signals to zero out timeout. */
f76475ad 3729 if (XINT (read_kbd) < 0)
6720a7fb
JB
3730 set_waiting_for_input (&timeout);
3731
ff11dfa1 3732 /* If a frame has been newly mapped and needs updating,
6720a7fb 3733 reprocess its display stuff. */
5164ee8e 3734 if (frame_garbaged && do_display)
6720a7fb
JB
3735 redisplay_preserve_echo_area ();
3736
f76475ad 3737 if (XINT (read_kbd) && detect_input_pending ())
6720a7fb
JB
3738 nfds = 0;
3739 else
3740 nfds = select (1, &waitchannels, 0, 0, timeout_p);
3741
3742 /* Make C-g and alarm signals set flags again */
3743 clear_waiting_for_input ();
3744
3745 /* If we woke up due to SIGWINCH, actually change size now. */
3746 do_pending_window_change ();
3747
3748 if (nfds == -1)
3749 {
3750 /* If the system call was interrupted, then go around the
3751 loop again. */
3752 if (errno == EINTR)
3753 waitchannels = 0;
3754 }
3755#ifdef sun
3756 else if (nfds > 0 && (waitchannels & 1) && interrupt_input)
3757 /* System sometimes fails to deliver SIGIO. */
3758 kill (getpid (), SIGIO);
3759#endif
7324d660 3760#ifdef SIGIO
f76475ad 3761 if (XINT (read_kbd) && interrupt_input && (waitchannels & 1))
6720a7fb 3762 kill (0, SIGIO);
7324d660 3763#endif
6720a7fb
JB
3764
3765 /* If we have timed out (nfds == 0) or found some input (nfds > 0),
3766 we should exit. */
3767 if (nfds >= 0)
3768 break;
3769 }
3770
a87b802f
JB
3771 start_polling ();
3772
6720a7fb
JB
3773 return 0;
3774}
3775
3776
3777DEFUN ("get-buffer-process", Fget_buffer_process, Sget_buffer_process, 1, 1, 0,
51ab806a 3778 /* Don't confuse make-docfile by having two doc strings for this function.
312c9964
RS
3779 make-docfile does not pay attention to #if, for good reason! */
3780 0)
6720a7fb
JB
3781 (name)
3782 register Lisp_Object name;
3783{
3784 return Qnil;
3785}
3786
3787/* Kill all processes associated with `buffer'.
3788 If `buffer' is nil, kill all processes.
3789 Since we have no subprocesses, this does nothing. */
3790
3791kill_buffer_processes (buffer)
3792 Lisp_Object buffer;
3793{
3794}
3795
3796init_process ()
3797{
3798}
3799
3800syms_of_process ()
3801{
3802 defsubr (&Sget_buffer_process);
3803}
3804
3805\f
3806#endif /* not subprocesses */