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