(xmenu_show): If !HAVE_X_WINDOWS, don't reference X display.
[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));
1096 new_argv[0] = XSTRING (tem)->data;
1097 }
3b639868
KH
1098 else
1099 new_argv[0] = XSTRING (program)->data;
1100
1101 for (i = 3; i < nargs; i++)
1102 {
1103 tem = args[i];
1104 CHECK_STRING (tem, i);
1105 new_argv[i - 2] = XSTRING (tem)->data;
1106 }
1107 new_argv[i - 2] = 0;
d0d6b7c5
JB
1108#endif /* not VMS */
1109
1110 proc = make_process (name);
b0310da4
JB
1111 /* If an error occurs and we can't start the process, we want to
1112 remove it from the process list. This means that each error
1113 check in create_process doesn't need to call remove_process
1114 itself; it's all taken care of here. */
1115 record_unwind_protect (start_process_unwind, proc);
d0d6b7c5
JB
1116
1117 XPROCESS (proc)->childp = Qt;
1118 XPROCESS (proc)->command_channel_p = Qnil;
1119 XPROCESS (proc)->buffer = buffer;
1120 XPROCESS (proc)->sentinel = Qnil;
1121 XPROCESS (proc)->filter = Qnil;
1122 XPROCESS (proc)->command = Flist (nargs - 2, args + 2);
1123
7af71e17
RS
1124 /* Make the process marker point into the process buffer (if any). */
1125 if (!NILP (buffer))
1126 Fset_marker (XPROCESS (proc)->mark,
1127 make_number (BUF_ZV (XBUFFER (buffer))), buffer);
1128
1e30af70 1129 create_process (proc, new_argv, current_dir);
d0d6b7c5 1130
b0310da4 1131 return unbind_to (count, proc);
d0d6b7c5
JB
1132}
1133
b0310da4
JB
1134/* This function is the unwind_protect form for Fstart_process. If
1135 PROC doesn't have its pid set, then we know someone has signalled
1136 an error and the process wasn't started successfully, so we should
1137 remove it from the process list. */
1138static Lisp_Object
1139start_process_unwind (proc)
1140 Lisp_Object proc;
1141{
bcd69aea 1142 if (!PROCESSP (proc))
b0310da4
JB
1143 abort ();
1144
1145 /* Was PROC started successfully? */
188d6c4e 1146 if (XINT (XPROCESS (proc)->pid) <= 0)
b0310da4
JB
1147 remove_process (proc);
1148
1149 return Qnil;
1150}
1151
1152
d0d6b7c5
JB
1153SIGTYPE
1154create_process_1 (signo)
1155 int signo;
1156{
1157#ifdef USG
1158 /* USG systems forget handlers when they are used;
1159 must reestablish each time */
1160 signal (signo, create_process_1);
1161#endif /* USG */
1162}
1163
1164#if 0 /* This doesn't work; see the note before sigchld_handler. */
1165#ifdef USG
1166#ifdef SIGCHLD
1167/* Mimic blocking of signals on system V, which doesn't really have it. */
1168
1169/* Nonzero means we got a SIGCHLD when it was supposed to be blocked. */
1170int sigchld_deferred;
1171
1172SIGTYPE
1173create_process_sigchld ()
1174{
1175 signal (SIGCHLD, create_process_sigchld);
1176
1177 sigchld_deferred = 1;
1178}
1179#endif
1180#endif
1181#endif
1182
1183#ifndef VMS /* VMS version of this function is in vmsproc.c. */
1e30af70 1184create_process (process, new_argv, current_dir)
d0d6b7c5
JB
1185 Lisp_Object process;
1186 char **new_argv;
1e30af70 1187 Lisp_Object current_dir;
d0d6b7c5 1188{
ecd1f654 1189 int pid, inchannel, outchannel;
d0d6b7c5
JB
1190 int sv[2];
1191#ifdef SIGCHLD
1192 SIGTYPE (*sigchld)();
1193#endif
ecd1f654
KH
1194 /* Use volatile to protect variables from being clobbered by longjmp. */
1195 volatile int forkin, forkout;
1196 volatile int pty_flag = 0;
d0d6b7c5
JB
1197 extern char **environ;
1198
d0d6b7c5
JB
1199 inchannel = outchannel = -1;
1200
1201#ifdef HAVE_PTYS
fe45da4e 1202 if (!NILP (Vprocess_connection_type))
d0d6b7c5
JB
1203 outchannel = inchannel = allocate_pty ();
1204
d0d6b7c5
JB
1205 if (inchannel >= 0)
1206 {
1207#ifndef USG
1208 /* On USG systems it does not work to open the pty's tty here
1209 and then close and reopen it in the child. */
1210#ifdef O_NOCTTY
1211 /* Don't let this terminal become our controlling terminal
1212 (in case we don't have one). */
1213 forkout = forkin = open (pty_name, O_RDWR | O_NOCTTY, 0);
1214#else
1215 forkout = forkin = open (pty_name, O_RDWR, 0);
1216#endif
1217 if (forkin < 0)
1218 report_file_error ("Opening pty", Qnil);
1219#else
1220 forkin = forkout = -1;
1221#endif /* not USG */
1222 pty_flag = 1;
1223 }
1224 else
1225#endif /* HAVE_PTYS */
1226#ifdef SKTPAIR
1227 {
1228 if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) < 0)
1229 report_file_error ("Opening socketpair", Qnil);
1230 outchannel = inchannel = sv[0];
1231 forkout = forkin = sv[1];
1232 }
1233#else /* not SKTPAIR */
1234 {
e98d950b
RS
1235#ifdef WINDOWSNT
1236 pipe_with_inherited_out (sv);
1237 inchannel = sv[0];
1238 forkout = sv[1];
1239
1240 pipe_with_inherited_in (sv);
1241 forkin = sv[0];
1242 outchannel = sv[1];
1243#else /* not WINDOWSNT */
d0d6b7c5
JB
1244 pipe (sv);
1245 inchannel = sv[0];
1246 forkout = sv[1];
1247 pipe (sv);
1248 outchannel = sv[1];
1249 forkin = sv[0];
e98d950b 1250#endif /* not WINDOWSNT */
d0d6b7c5
JB
1251 }
1252#endif /* not SKTPAIR */
1253
1254#if 0
1255 /* Replaced by close_process_descs */
1256 set_exclusive_use (inchannel);
1257 set_exclusive_use (outchannel);
1258#endif
1259
1260/* Stride people say it's a mystery why this is needed
1261 as well as the O_NDELAY, but that it fails without this. */
1262#if defined (STRIDE) || (defined (pfa) && defined (HAVE_PTYS))
1263 {
1264 int one = 1;
1265 ioctl (inchannel, FIONBIO, &one);
1266 }
1267#endif
1268
1269#ifdef O_NONBLOCK
1270 fcntl (inchannel, F_SETFL, O_NONBLOCK);
1271#else
1272#ifdef O_NDELAY
1273 fcntl (inchannel, F_SETFL, O_NDELAY);
1274#endif
1275#endif
1276
1277 /* Record this as an active process, with its channels.
1278 As a result, child_setup will close Emacs's side of the pipes. */
1279 chan_process[inchannel] = process;
1d056e64
KH
1280 XSETINT (XPROCESS (process)->infd, inchannel);
1281 XSETINT (XPROCESS (process)->outfd, outchannel);
d0d6b7c5
JB
1282 /* Record the tty descriptor used in the subprocess. */
1283 if (forkin < 0)
1284 XPROCESS (process)->subtty = Qnil;
1285 else
22719df2 1286 XSETFASTINT (XPROCESS (process)->subtty, forkin);
d0d6b7c5
JB
1287 XPROCESS (process)->pty_flag = (pty_flag ? Qt : Qnil);
1288 XPROCESS (process)->status = Qrun;
1289
1290 /* Delay interrupts until we have a chance to store
1291 the new fork's pid in its process structure */
1292#ifdef SIGCHLD
1293#ifdef BSD4_1
1294 sighold (SIGCHLD);
1295#else /* not BSD4_1 */
1296#if defined (BSD) || defined (UNIPLUS) || defined (HPUX)
1297 sigsetmask (sigmask (SIGCHLD));
1298#else /* ordinary USG */
1299#if 0
1300 sigchld_deferred = 0;
1301 sigchld = signal (SIGCHLD, create_process_sigchld);
1302#endif
1303#endif /* ordinary USG */
1304#endif /* not BSD4_1 */
1305#endif /* SIGCHLD */
1306
3081bf8d 1307 FD_SET (inchannel, &input_wait_mask);
a69281ff 1308 FD_SET (inchannel, &non_keyboard_wait_mask);
3081bf8d
KH
1309 if (inchannel > max_process_desc)
1310 max_process_desc = inchannel;
1311
d0d6b7c5
JB
1312 /* Until we store the proper pid, enable sigchld_handler
1313 to recognize an unknown pid as standing for this process.
1314 It is very important not to let this `marker' value stay
1315 in the table after this function has returned; if it does
1316 it might cause call-process to hang and subsequent asynchronous
1317 processes to get their return values scrambled. */
1318 XSETINT (XPROCESS (process)->pid, -1);
1319
1320 {
1321 /* child_setup must clobber environ on systems with true vfork.
1322 Protect it from permanent change. */
1323 char **save_environ = environ;
1324
e98d950b 1325#ifndef WINDOWSNT
d0d6b7c5
JB
1326 pid = vfork ();
1327 if (pid == 0)
e98d950b 1328#endif /* not WINDOWSNT */
d0d6b7c5
JB
1329 {
1330 int xforkin = forkin;
1331 int xforkout = forkout;
1332
1333#if 0 /* This was probably a mistake--it duplicates code later on,
1334 but fails to handle all the cases. */
1335 /* Make sure SIGCHLD is not blocked in the child. */
1336 sigsetmask (SIGEMPTYMASK);
1337#endif
1338
1339 /* Make the pty be the controlling terminal of the process. */
1340#ifdef HAVE_PTYS
1341 /* First, disconnect its current controlling terminal. */
1342#ifdef HAVE_SETSID
7ce48618
RS
1343 /* We tried doing setsid only if pty_flag, but it caused
1344 process_set_signal to fail on SGI when using a pipe. */
1345 setsid ();
ce4c9c90 1346 /* Make the pty's terminal the controlling terminal. */
084fd64a 1347 if (pty_flag)
39e9ebcd 1348 {
39e9ebcd
RS
1349#ifdef TIOCSCTTY
1350 /* We ignore the return value
1351 because faith@cs.unc.edu says that is necessary on Linux. */
1352 ioctl (xforkin, TIOCSCTTY, 0);
ce4c9c90 1353#endif
39e9ebcd 1354 }
d0d6b7c5 1355#else /* not HAVE_SETSID */
c14e53a4 1356#ifdef USG
000ab717 1357 /* It's very important to call setpgrp here and no time
d0d6b7c5
JB
1358 afterwards. Otherwise, we lose our controlling tty which
1359 is set when we open the pty. */
1360 setpgrp ();
1361#endif /* USG */
1362#endif /* not HAVE_SETSID */
9bcf8ec6
KH
1363#if defined (HAVE_TERMIOS) && defined (LDISC1)
1364 if (pty_flag && xforkin >= 0)
1365 {
1366 struct termios t;
1367 tcgetattr (xforkin, &t);
1368 t.c_lflag = LDISC1;
1369 if (tcsetattr (xforkin, TCSANOW, &t) < 0)
1370 write (1, "create_process/tcsetattr LDISC1 failed\n", 39);
1371 }
1372#else
aafadd9f 1373#if defined (NTTYDISC) && defined (TIOCSETD)
ff773a4e 1374 if (pty_flag && xforkin >= 0)
afc549fd
RS
1375 {
1376 /* Use new line discipline. */
1377 int ldisc = NTTYDISC;
4458f555 1378 ioctl (xforkin, TIOCSETD, &ldisc);
afc549fd 1379 }
000ab717 1380#endif
9bcf8ec6 1381#endif
d0d6b7c5
JB
1382#ifdef TIOCNOTTY
1383 /* In 4.3BSD, the TIOCSPGRP bug has been fixed, and now you
1384 can do TIOCSPGRP only to the process's controlling tty. */
1385 if (pty_flag)
1386 {
1387 /* I wonder: would just ioctl (0, TIOCNOTTY, 0) work here?
1388 I can't test it since I don't have 4.3. */
1389 int j = open ("/dev/tty", O_RDWR, 0);
1390 ioctl (j, TIOCNOTTY, 0);
1391 close (j);
5a570e37 1392#ifndef USG
d0d6b7c5
JB
1393 /* In order to get a controlling terminal on some versions
1394 of BSD, it is necessary to put the process in pgrp 0
1395 before it opens the terminal. */
3ea1d291
RS
1396#ifdef OSF1
1397 setpgid (0, 0);
1398#else
d0d6b7c5 1399 setpgrp (0, 0);
3ea1d291 1400#endif
d0d6b7c5
JB
1401#endif
1402 }
1403#endif /* TIOCNOTTY */
1404
1405#if !defined (RTU) && !defined (UNIPLUS)
1406/*** There is a suggestion that this ought to be a
1407 conditional on TIOCSPGRP. */
1408 /* Now close the pty (if we had it open) and reopen it.
1409 This makes the pty the controlling terminal of the subprocess. */
1410 if (pty_flag)
1411 {
99e3d726
RS
1412#ifdef SET_CHILD_PTY_PGRP
1413 int pgrp = getpid ();
1414#endif
1415
d0d6b7c5
JB
1416 /* I wonder if close (open (pty_name, ...)) would work? */
1417 if (xforkin >= 0)
1418 close (xforkin);
1419 xforkout = xforkin = open (pty_name, O_RDWR, 0);
1420
4aa54ba8
RS
1421 if (xforkin < 0)
1422 {
1423 write (1, "Couldn't open the pty terminal ", 31);
1424 write (1, pty_name, strlen (pty_name));
1425 write (1, "\n", 1);
1426 _exit (1);
1427 }
1428
99e3d726
RS
1429#ifdef SET_CHILD_PTY_PGRP
1430 ioctl (xforkin, TIOCSPGRP, &pgrp);
1431 ioctl (xforkout, TIOCSPGRP, &pgrp);
1432#endif
d0d6b7c5
JB
1433 }
1434#endif /* not UNIPLUS and not RTU */
1435#ifdef SETUP_SLAVE_PTY
13a72104
RS
1436 if (pty_flag)
1437 {
1438 SETUP_SLAVE_PTY;
1439 }
d0d6b7c5
JB
1440#endif /* SETUP_SLAVE_PTY */
1441#ifdef AIX
1442 /* On AIX, we've disabled SIGHUP above once we start a child on a pty.
1443 Now reenable it in the child, so it will die when we want it to. */
1444 if (pty_flag)
1445 signal (SIGHUP, SIG_DFL);
1446#endif
1447#endif /* HAVE_PTYS */
1448
1449#ifdef SIGCHLD
1450#ifdef BSD4_1
1451 sigrelse (SIGCHLD);
1452#else /* not BSD4_1 */
1453#if defined (BSD) || defined (UNIPLUS) || defined (HPUX)
1454 sigsetmask (SIGEMPTYMASK);
1455#else /* ordinary USG */
63528b78 1456#if 0
d0d6b7c5 1457 signal (SIGCHLD, sigchld);
63528b78 1458#endif
d0d6b7c5
JB
1459#endif /* ordinary USG */
1460#endif /* not BSD4_1 */
1461#endif /* SIGCHLD */
1462
5e7e1da2
RS
1463 signal (SIGINT, SIG_DFL);
1464 signal (SIGQUIT, SIG_DFL);
1465
ab01d0a8
RS
1466 if (pty_flag)
1467 child_setup_tty (xforkout);
e98d950b
RS
1468#ifdef WINDOWSNT
1469 pid = child_setup (xforkin, xforkout, xforkout,
1470 new_argv, 1, current_dir);
1471#else /* not WINDOWSNT */
d0d6b7c5 1472 child_setup (xforkin, xforkout, xforkout,
e065a56e 1473 new_argv, 1, current_dir);
e98d950b 1474#endif /* not WINDOWSNT */
d0d6b7c5
JB
1475 }
1476 environ = save_environ;
1477 }
1478
1479 if (pid < 0)
6311cf58
RS
1480 {
1481 if (forkin >= 0)
1482 close (forkin);
1483 if (forkin != forkout && forkout >= 0)
1484 close (forkout);
1485 report_file_error ("Doing vfork", Qnil);
1486 }
b0310da4 1487
22719df2 1488 XSETFASTINT (XPROCESS (process)->pid, pid);
d0d6b7c5 1489
e98d950b
RS
1490#ifdef WINDOWSNT
1491 register_child (pid, inchannel);
1492#endif /* WINDOWSNT */
1493
d0d6b7c5
JB
1494 /* If the subfork execv fails, and it exits,
1495 this close hangs. I don't know why.
1496 So have an interrupt jar it loose. */
1497 stop_polling ();
1498 signal (SIGALRM, create_process_1);
1499 alarm (1);
99e3d726
RS
1500 XPROCESS (process)->subtty = Qnil;
1501 if (forkin >= 0)
1502 close (forkin);
d0d6b7c5
JB
1503 alarm (0);
1504 start_polling ();
1505 if (forkin != forkout && forkout >= 0)
1506 close (forkout);
1507
875e6b94
KH
1508#ifdef HAVE_PTYS
1509 if (pty_flag)
1510 XPROCESS (process)->tty_name = build_string (pty_name);
1511 else
1512#endif
1513 XPROCESS (process)->tty_name = Qnil;
3b9a3dfa 1514
d0d6b7c5
JB
1515#ifdef SIGCHLD
1516#ifdef BSD4_1
1517 sigrelse (SIGCHLD);
1518#else /* not BSD4_1 */
1519#if defined (BSD) || defined (UNIPLUS) || defined (HPUX)
1520 sigsetmask (SIGEMPTYMASK);
1521#else /* ordinary USG */
1522#if 0
1523 signal (SIGCHLD, sigchld);
1524 /* Now really handle any of these signals
1525 that came in during this function. */
1526 if (sigchld_deferred)
1527 kill (getpid (), SIGCHLD);
1528#endif
1529#endif /* ordinary USG */
1530#endif /* not BSD4_1 */
1531#endif /* SIGCHLD */
1532}
1533#endif /* not VMS */
1534
1535#ifdef HAVE_SOCKETS
1536
1537/* open a TCP network connection to a given HOST/SERVICE. Treated
1538 exactly like a normal process when reading and writing. Only
1539 differences are in status display and process deletion. A network
1540 connection has no PID; you cannot signal it. All you can do is
1541 deactivate and close it via delete-process */
1542
1543DEFUN ("open-network-stream", Fopen_network_stream, Sopen_network_stream,
1544 4, 4, 0,
1545 "Open a TCP connection for a service to a host.\n\
1546Returns a subprocess-object to represent the connection.\n\
1547Input and output work as for subprocesses; `delete-process' closes it.\n\
1548Args are NAME BUFFER HOST SERVICE.\n\
1549NAME is name for process. It is modified if necessary to make it unique.\n\
1550BUFFER is the buffer (or buffer-name) to associate with the process.\n\
1551 Process output goes at end of that buffer, unless you specify\n\
1552 an output stream or filter function to handle the output.\n\
1553 BUFFER may be also nil, meaning that this process is not associated\n\
1554 with any buffer\n\
1555Third arg is name of the host to connect to, or its IP address.\n\
1556Fourth arg SERVICE is name of the service desired, or an integer\n\
1557 specifying a port number to connect to.")
1558 (name, buffer, host, service)
1559 Lisp_Object name, buffer, host, service;
1560{
1561 Lisp_Object proc;
1562 register int i;
1563 struct sockaddr_in address;
1564 struct servent *svc_info;
1565 struct hostent *host_info_ptr, host_info;
1566 char *(addr_list[2]);
79967d5e 1567 IN_ADDR numeric_addr;
d0d6b7c5
JB
1568 int s, outch, inch;
1569 char errstring[80];
1570 int port;
1571 struct hostent host_info_fixed;
1572 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
e333e864 1573 int retry = 0;
44ade2e9 1574 int count = specpdl_ptr - specpdl;
d0d6b7c5
JB
1575
1576 GCPRO4 (name, buffer, host, service);
1577 CHECK_STRING (name, 0);
1578 CHECK_STRING (host, 0);
bcd69aea 1579 if (INTEGERP (service))
d0d6b7c5
JB
1580 port = htons ((unsigned short) XINT (service));
1581 else
1582 {
1583 CHECK_STRING (service, 0);
1584 svc_info = getservbyname (XSTRING (service)->data, "tcp");
1585 if (svc_info == 0)
1586 error ("Unknown service \"%s\"", XSTRING (service)->data);
1587 port = svc_info->s_port;
1588 }
1589
1d2c16fa 1590#ifndef TERM
616da37c
RS
1591 while (1)
1592 {
5f0929a7
RS
1593#ifdef TRY_AGAIN
1594 h_errno = 0;
1595#endif
616da37c
RS
1596 host_info_ptr = gethostbyname (XSTRING (host)->data);
1597#ifdef TRY_AGAIN
1598 if (! (host_info_ptr == 0 && h_errno == TRY_AGAIN))
1599#endif
1600 break;
1601 Fsleep_for (make_number (1), Qnil);
1602 }
d0d6b7c5
JB
1603 if (host_info_ptr == 0)
1604 /* Attempt to interpret host as numeric inet address */
1605 {
393a9679 1606 numeric_addr = inet_addr ((char *) XSTRING (host)->data);
79967d5e 1607 if (NUMERIC_ADDR_ERROR)
d0d6b7c5
JB
1608 error ("Unknown host \"%s\"", XSTRING (host)->data);
1609
1610 host_info_ptr = &host_info;
1611 host_info.h_name = 0;
1612 host_info.h_aliases = 0;
1613 host_info.h_addrtype = AF_INET;
39a21be6
JB
1614#ifdef h_addr
1615 /* Older machines have only one address slot called h_addr.
1616 Newer machines have h_addr_list, but #define h_addr to
1617 be its first element. */
1618 host_info.h_addr_list = &(addr_list[0]);
1619#endif
1620 host_info.h_addr = (char*)(&numeric_addr);
d0d6b7c5
JB
1621 addr_list[1] = 0;
1622 host_info.h_length = strlen (addr_list[0]);
1623 }
1624
1625 bzero (&address, sizeof address);
1626 bcopy (host_info_ptr->h_addr, (char *) &address.sin_addr,
1627 host_info_ptr->h_length);
1628 address.sin_family = host_info_ptr->h_addrtype;
1629 address.sin_port = port;
1630
1631 s = socket (host_info_ptr->h_addrtype, SOCK_STREAM, 0);
1632 if (s < 0)
1633 report_file_error ("error creating socket", Fcons (name, Qnil));
1634
457a9bee
RS
1635 /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
1636 when connect is interrupted. So let's not let it get interrupted.
1637 Note we do not turn off polling, because polling is only used
1638 when not interrupt_input, and thus not normally used on the systems
1639 which have this bug. On systems which use polling, there's no way
1640 to quit if polling is turned off. */
1641 if (interrupt_input)
1642 unrequest_sigio ();
1643
44ade2e9
RS
1644 /* Slow down polling to every ten seconds.
1645 Some kernels have a bug which causes retrying connect to fail
1646 after a connect. */
1647#ifdef POLL_FOR_INPUT
1648 bind_polling_period (10);
1649#endif
1650
d0d6b7c5 1651 loop:
e333e864
RS
1652 if (connect (s, (struct sockaddr *) &address, sizeof address) == -1
1653 && errno != EISCONN)
d0d6b7c5
JB
1654 {
1655 int xerrno = errno;
e333e864 1656
d0d6b7c5
JB
1657 if (errno == EINTR)
1658 goto loop;
e333e864
RS
1659 if (errno == EADDRINUSE && retry < 20)
1660 {
1661 retry++;
1662 goto loop;
1663 }
1664
d0d6b7c5 1665 close (s);
457a9bee
RS
1666
1667 if (interrupt_input)
1668 request_sigio ();
1669
d0d6b7c5
JB
1670 errno = xerrno;
1671 report_file_error ("connection failed",
1672 Fcons (host, Fcons (name, Qnil)));
1673 }
457a9bee 1674
44ade2e9
RS
1675#ifdef POLL_FOR_INPUT
1676 unbind_to (count, Qnil);
1677#endif
1678
457a9bee
RS
1679 if (interrupt_input)
1680 request_sigio ();
1681
1d2c16fa
RS
1682#else /* TERM */
1683 s = connect_server (0);
1684 if (s < 0)
1685 report_file_error ("error creating socket", Fcons (name, Qnil));
1686 send_command (s, C_PORT, 0, "%s:%d", XSTRING (host)->data, ntohs (port));
1687 send_command (s, C_DUMB, 1, 0);
1688#endif /* TERM */
d0d6b7c5
JB
1689
1690 inch = s;
1691 outch = dup (s);
1692 if (outch < 0)
1693 report_file_error ("error duplicating socket", Fcons (name, Qnil));
1694
1695 if (!NILP (buffer))
1696 buffer = Fget_buffer_create (buffer);
1697 proc = make_process (name);
1698
1699 chan_process[inch] = proc;
1700
1701#ifdef O_NONBLOCK
1702 fcntl (inch, F_SETFL, O_NONBLOCK);
1703#else
1704#ifdef O_NDELAY
1705 fcntl (inch, F_SETFL, O_NDELAY);
1706#endif
1707#endif
1708
1709 XPROCESS (proc)->childp = host;
1710 XPROCESS (proc)->command_channel_p = Qnil;
1711 XPROCESS (proc)->buffer = buffer;
1712 XPROCESS (proc)->sentinel = Qnil;
1713 XPROCESS (proc)->filter = Qnil;
1714 XPROCESS (proc)->command = Qnil;
1715 XPROCESS (proc)->pid = Qnil;
1d056e64
KH
1716 XSETINT (XPROCESS (proc)->infd, s);
1717 XSETINT (XPROCESS (proc)->outfd, outch);
d0d6b7c5
JB
1718 XPROCESS (proc)->status = Qrun;
1719 FD_SET (inch, &input_wait_mask);
a69281ff 1720 FD_SET (inch, &non_keyboard_wait_mask);
7d0e672e
RS
1721 if (inch > max_process_desc)
1722 max_process_desc = inch;
d0d6b7c5
JB
1723
1724 UNGCPRO;
1725 return proc;
1726}
1727#endif /* HAVE_SOCKETS */
1728
1729deactivate_process (proc)
1730 Lisp_Object proc;
1731{
1732 register int inchannel, outchannel;
1733 register struct Lisp_Process *p = XPROCESS (proc);
1734
a9f2c884
RS
1735 inchannel = XINT (p->infd);
1736 outchannel = XINT (p->outfd);
d0d6b7c5 1737
a9f2c884 1738 if (inchannel >= 0)
d0d6b7c5
JB
1739 {
1740 /* Beware SIGCHLD hereabouts. */
1741 flush_pending_output (inchannel);
1742#ifdef VMS
1743 {
1744 VMS_PROC_STUFF *get_vms_process_pointer (), *vs;
1745 sys$dassgn (outchannel);
c6c6865d 1746 vs = get_vms_process_pointer (p->pid);
d0d6b7c5
JB
1747 if (vs)
1748 give_back_vms_process_stuff (vs);
1749 }
1750#else
1751 close (inchannel);
a9f2c884 1752 if (outchannel >= 0 && outchannel != inchannel)
d0d6b7c5
JB
1753 close (outchannel);
1754#endif
1755
1d056e64
KH
1756 XSETINT (p->infd, -1);
1757 XSETINT (p->outfd, -1);
d0d6b7c5
JB
1758 chan_process[inchannel] = Qnil;
1759 FD_CLR (inchannel, &input_wait_mask);
a69281ff 1760 FD_CLR (inchannel, &non_keyboard_wait_mask);
7d0e672e
RS
1761 if (inchannel == max_process_desc)
1762 {
1763 int i;
1764 /* We just closed the highest-numbered process input descriptor,
1765 so recompute the highest-numbered one now. */
1766 max_process_desc = 0;
1767 for (i = 0; i < MAXDESC; i++)
1768 if (!NILP (chan_process[i]))
1769 max_process_desc = i;
1770 }
d0d6b7c5
JB
1771 }
1772}
1773
1774/* Close all descriptors currently in use for communication
1775 with subprocess. This is used in a newly-forked subprocess
1776 to get rid of irrelevant descriptors. */
1777
1778close_process_descs ()
1779{
e98d950b 1780#ifndef WINDOWSNT
d0d6b7c5
JB
1781 int i;
1782 for (i = 0; i < MAXDESC; i++)
1783 {
1784 Lisp_Object process;
1785 process = chan_process[i];
1786 if (!NILP (process))
1787 {
a9f2c884
RS
1788 int in = XINT (XPROCESS (process)->infd);
1789 int out = XINT (XPROCESS (process)->outfd);
1790 if (in >= 0)
d0d6b7c5 1791 close (in);
a9f2c884 1792 if (out >= 0 && in != out)
d0d6b7c5
JB
1793 close (out);
1794 }
1795 }
e98d950b 1796#endif
d0d6b7c5
JB
1797}
1798\f
1799DEFUN ("accept-process-output", Faccept_process_output, Saccept_process_output,
1800 0, 3, 0,
1801 "Allow any pending output from subprocesses to be read by Emacs.\n\
1802It is read into the process' buffers or given to their filter functions.\n\
1803Non-nil arg PROCESS means do not return until some output has been received\n\
1804from PROCESS.\n\
1805Non-nil second arg TIMEOUT and third arg TIMEOUT-MSECS are number of\n\
1806seconds and microseconds to wait; return after that much time whether\n\
1807or not there is input.\n\
1808Return non-nil iff we received any output before the timeout expired.")
1809 (proc, timeout, timeout_msecs)
1810 register Lisp_Object proc, timeout, timeout_msecs;
1811{
1812 int seconds;
1813 int useconds;
1814
1815 if (! NILP (timeout_msecs))
1816 {
1817 CHECK_NUMBER (timeout_msecs, 2);
1818 useconds = XINT (timeout_msecs);
bcd69aea 1819 if (!INTEGERP (timeout))
1d056e64 1820 XSETINT (timeout, 0);
d0d6b7c5
JB
1821
1822 {
1823 int carry = useconds / 1000000;
1824
1825 XSETINT (timeout, XINT (timeout) + carry);
1826 useconds -= carry * 1000000;
1827
1828 /* I think this clause is necessary because C doesn't
1829 guarantee a particular rounding direction for negative
1830 integers. */
1831 if (useconds < 0)
1832 {
1833 XSETINT (timeout, XINT (timeout) - 1);
1834 useconds += 1000000;
1835 }
1836 }
1837 }
de946e5a
RS
1838 else
1839 useconds = 0;
d0d6b7c5
JB
1840
1841 if (! NILP (timeout))
1842 {
1843 CHECK_NUMBER (timeout, 1);
1844 seconds = XINT (timeout);
1845 if (seconds <= 0)
1846 seconds = -1;
1847 }
1848 else
1849 {
1850 if (NILP (proc))
1851 seconds = -1;
1852 else
1853 seconds = 0;
1854 }
1855
f76475ad 1856 if (NILP (proc))
22719df2 1857 XSETFASTINT (proc, 0);
f76475ad 1858
d0d6b7c5 1859 return
f76475ad 1860 (wait_reading_process_input (seconds, useconds, proc, 0)
d0d6b7c5
JB
1861 ? Qt : Qnil);
1862}
1863
1864/* This variable is different from waiting_for_input in keyboard.c.
1865 It is used to communicate to a lisp process-filter/sentinel (via the
1866 function Fwaiting_for_user_input_p below) whether emacs was waiting
1867 for user-input when that process-filter was called.
1868 waiting_for_input cannot be used as that is by definition 0 when
d430ee71
RS
1869 lisp code is being evalled.
1870 This is also used in record_asynch_buffer_change.
1871 For that purpose, this must be 0
1872 when not inside wait_reading_process_input. */
d0d6b7c5
JB
1873static int waiting_for_user_input_p;
1874
1875/* Read and dispose of subprocess output while waiting for timeout to
1876 elapse and/or keyboard input to be available.
1877
de6fd4b9 1878 TIME_LIMIT is:
d0d6b7c5
JB
1879 timeout in seconds, or
1880 zero for no limit, or
1881 -1 means gobble data immediately available but don't wait for any.
1882
de6fd4b9
RS
1883 MICROSECS is:
1884 an additional duration to wait, measured in microseconds.
1885 If this is nonzero and time_limit is 0, then the timeout
1886 consists of MICROSECS only.
6e4f3667 1887
de6fd4b9 1888 READ_KBD is a lisp value:
d0d6b7c5
JB
1889 0 to ignore keyboard input, or
1890 1 to return when input is available, or
84aa3ace 1891 -1 meaning caller will actually read the input, so don't throw to
d0d6b7c5 1892 the quit handler, or
e6194ffc 1893 a cons cell, meaning wait until its car is non-nil
de6fd4b9 1894 (and gobble terminal input into the buffer if any arrives), or
f76475ad
JB
1895 a process object, meaning wait until something arrives from that
1896 process. The return value is true iff we read some input from
1897 that process.
d0d6b7c5 1898
de6fd4b9 1899 DO_DISPLAY != 0 means redisplay should be done to show subprocess
d0d6b7c5
JB
1900 output that arrives.
1901
de6fd4b9 1902 If READ_KBD is a pointer to a struct Lisp_Process, then the
d0d6b7c5
JB
1903 function returns true iff we received input from that process
1904 before the timeout elapsed.
eb8c3be9 1905 Otherwise, return true iff we received input from any process. */
d0d6b7c5
JB
1906
1907wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
f76475ad
JB
1908 int time_limit, microsecs;
1909 Lisp_Object read_kbd;
1910 int do_display;
d0d6b7c5
JB
1911{
1912 register int channel, nfds, m;
1913 static SELECT_TYPE Available;
1914 int xerrno;
1915 Lisp_Object proc;
1916 EMACS_TIME timeout, end_time, garbage;
1917 SELECT_TYPE Atemp;
a9f2c884 1918 int wait_channel = -1;
d0d6b7c5
JB
1919 struct Lisp_Process *wait_proc = 0;
1920 int got_some_input = 0;
84aa3ace 1921 Lisp_Object *wait_for_cell = 0;
d0d6b7c5
JB
1922
1923 FD_ZERO (&Available);
1924
f76475ad
JB
1925 /* If read_kbd is a process to watch, set wait_proc and wait_channel
1926 accordingly. */
bcd69aea 1927 if (PROCESSP (read_kbd))
d0d6b7c5 1928 {
f76475ad 1929 wait_proc = XPROCESS (read_kbd);
a9f2c884 1930 wait_channel = XINT (wait_proc->infd);
22719df2 1931 XSETFASTINT (read_kbd, 0);
d0d6b7c5
JB
1932 }
1933
84aa3ace 1934 /* If waiting for non-nil in a cell, record where. */
bcd69aea 1935 if (CONSP (read_kbd))
84aa3ace
RS
1936 {
1937 wait_for_cell = &XCONS (read_kbd)->car;
22719df2 1938 XSETFASTINT (read_kbd, 0);
84aa3ace
RS
1939 }
1940
f76475ad 1941 waiting_for_user_input_p = XINT (read_kbd);
d0d6b7c5
JB
1942
1943 /* Since we may need to wait several times,
1944 compute the absolute time to return at. */
1945 if (time_limit || microsecs)
1946 {
1947 EMACS_GET_TIME (end_time);
1948 EMACS_SET_SECS_USECS (timeout, time_limit, microsecs);
1949 EMACS_ADD_TIME (end_time, end_time, timeout);
1950 }
1951
d0d6b7c5
JB
1952 while (1)
1953 {
1954 /* If calling from keyboard input, do not quit
1955 since we want to return C-g as an input character.
1956 Otherwise, do pending quit if requested. */
f76475ad 1957 if (XINT (read_kbd) >= 0)
d0d6b7c5
JB
1958 QUIT;
1959
889255b4
RS
1960 /* Exit now if the cell we're waiting for became non-nil. */
1961 if (wait_for_cell && ! NILP (*wait_for_cell))
1962 break;
1963
d0d6b7c5
JB
1964 /* Compute time from now till when time limit is up */
1965 /* Exit if already run out */
1966 if (time_limit == -1)
1967 {
1968 /* -1 specified for timeout means
1969 gobble output available now
1970 but don't wait at all. */
1971
1972 EMACS_SET_SECS_USECS (timeout, 0, 0);
1973 }
1974 else if (time_limit || microsecs)
1975 {
1976 EMACS_GET_TIME (timeout);
1977 EMACS_SUB_TIME (timeout, end_time, timeout);
1978 if (EMACS_TIME_NEG_P (timeout))
1979 break;
1980 }
1981 else
1982 {
1983 EMACS_SET_SECS_USECS (timeout, 100000, 0);
1984 }
1985
90ab1a81
JB
1986 /* Cause C-g and alarm signals to take immediate action,
1987 and cause input available signals to zero out timeout.
1988
1989 It is important that we do this before checking for process
1990 activity. If we get a SIGCHLD after the explicit checks for
1991 process activity, timeout is the only way we will know. */
1992 if (XINT (read_kbd) < 0)
1993 set_waiting_for_input (&timeout);
1994
6be429b1
JB
1995 /* If status of something has changed, and no input is
1996 available, notify the user of the change right away. After
1997 this explicit check, we'll let the SIGCHLD handler zap
1998 timeout to get our attention. */
1999 if (update_tick != process_tick && do_display)
2000 {
2001 Atemp = input_wait_mask;
2002 EMACS_SET_SECS_USECS (timeout, 0, 0);
ecd1f654
KH
2003 if ((select (MAXDESC, &Atemp, (SELECT_TYPE *)0, (SELECT_TYPE *)0,
2004 &timeout)
2005 <= 0))
90ab1a81
JB
2006 {
2007 /* It's okay for us to do this and then continue with
a0e4d3f3 2008 the loop, since timeout has already been zeroed out. */
90ab1a81
JB
2009 clear_waiting_for_input ();
2010 status_notify ();
2011 }
6be429b1
JB
2012 }
2013
2014 /* Don't wait for output from a non-running process. */
2015 if (wait_proc != 0 && !NILP (wait_proc->raw_status_low))
2016 update_status (wait_proc);
2017 if (wait_proc != 0
2018 && ! EQ (wait_proc->status, Qrun))
9aa2a7f4
JB
2019 {
2020 clear_waiting_for_input ();
2021 break;
2022 }
6be429b1 2023
d0d6b7c5
JB
2024 /* Wait till there is something to do */
2025
5e7e1da2 2026 if (! XINT (read_kbd) && wait_for_cell == 0)
a69281ff
RS
2027 Available = non_keyboard_wait_mask;
2028 else
2029 Available = input_wait_mask;
d0d6b7c5 2030
ff11dfa1 2031 /* If frame size has changed or the window is newly mapped,
ffd56f97
JB
2032 redisplay now, before we start to wait. There is a race
2033 condition here; if a SIGIO arrives between now and the select
016899c0
JB
2034 and indicates that a frame is trashed, the select may block
2035 displaying a trashed screen. */
5164ee8e 2036 if (frame_garbaged && do_display)
7286affd
RS
2037 {
2038 clear_waiting_for_input ();
2039 redisplay_preserve_echo_area ();
2040 if (XINT (read_kbd) < 0)
7efe788e 2041 set_waiting_for_input (&timeout);
7286affd 2042 }
ffd56f97 2043
f76475ad 2044 if (XINT (read_kbd) && detect_input_pending ())
a9f2c884
RS
2045 {
2046 nfds = 0;
2047 FD_ZERO (&Available);
2048 }
d0d6b7c5 2049 else
ecd1f654
KH
2050 nfds = select (MAXDESC, &Available, (SELECT_TYPE *)0, (SELECT_TYPE *)0,
2051 &timeout);
6720a7fb 2052
d0d6b7c5
JB
2053 xerrno = errno;
2054
2055 /* Make C-g and alarm signals set flags again */
2056 clear_waiting_for_input ();
2057
2058 /* If we woke up due to SIGWINCH, actually change size now. */
2059 do_pending_window_change ();
2060
ffd56f97 2061 if (time_limit && nfds == 0) /* timeout elapsed */
d0d6b7c5
JB
2062 break;
2063 if (nfds < 0)
2064 {
2065 if (xerrno == EINTR)
2066 FD_ZERO (&Available);
b0310da4
JB
2067#ifdef ultrix
2068 /* Ultrix select seems to return ENOMEM when it is
2069 interrupted. Treat it just like EINTR. Bleah. Note
2070 that we want to test for the "ultrix" CPP symbol, not
2071 "__ultrix__"; the latter is only defined under GCC, but
2072 not by DEC's bundled CC. -JimB */
8058415c
JB
2073 else if (xerrno == ENOMEM)
2074 FD_ZERO (&Available);
2075#endif
d0d6b7c5
JB
2076#ifdef ALLIANT
2077 /* This happens for no known reason on ALLIANT.
2078 I am guessing that this is the right response. -- RMS. */
2079 else if (xerrno == EFAULT)
2080 FD_ZERO (&Available);
2081#endif
2082 else if (xerrno == EBADF)
2083 {
2084#ifdef AIX
2085 /* AIX doesn't handle PTY closure the same way BSD does. On AIX,
2086 the child's closure of the pts gives the parent a SIGHUP, and
2087 the ptc file descriptor is automatically closed,
2088 yielding EBADF here or at select() call above.
2089 So, SIGHUP is ignored (see def of PTY_TTY_NAME_SPRINTF
a0e4d3f3 2090 in m/ibmrt-aix.h), and here we just ignore the select error.
d0d6b7c5 2091 Cleanup occurs c/o status_notify after SIGCLD. */
ffd56f97 2092 FD_ZERO (&Available); /* Cannot depend on values returned */
d0d6b7c5
JB
2093#else
2094 abort ();
2095#endif
2096 }
2097 else
b062d1fe 2098 error("select error: %s", strerror (xerrno));
d0d6b7c5 2099 }
26ec91de 2100#if defined(sun) && !defined(USG5_4)
a69281ff 2101 else if (nfds > 0 && keyboard_bit_set (&Available)
dd2281ae 2102 && interrupt_input)
e0109153
JB
2103 /* System sometimes fails to deliver SIGIO.
2104
2105 David J. Mackenzie says that Emacs doesn't compile under
2106 Solaris if this code is enabled, thus the USG5_4 in the CPP
2107 conditional. "I haven't noticed any ill effects so far.
2108 If you find a Solaris expert somewhere, they might know
2109 better." */
d0d6b7c5
JB
2110 kill (getpid (), SIGIO);
2111#endif
2112
2113 /* Check for keyboard input */
2114 /* If there is any, return immediately
2115 to give it higher priority than subprocesses */
2116
e6194ffc 2117 /* We used to do this if wait_for_cell,
6cbc22ed 2118 but that caused infinite recursion in selection request events. */
5e7e1da2 2119 if ((XINT (read_kbd) || wait_for_cell)
97f3b3d6 2120 && detect_input_pending ())
6e103bac
RS
2121 {
2122 swallow_events ();
2123 if (detect_input_pending ())
2124 break;
2125 }
d0d6b7c5 2126
84aa3ace
RS
2127 /* Exit now if the cell we're waiting for became non-nil. */
2128 if (wait_for_cell && ! NILP (*wait_for_cell))
2129 break;
2130
4746118a 2131#ifdef SIGIO
d0d6b7c5
JB
2132 /* If we think we have keyboard input waiting, but didn't get SIGIO
2133 go read it. This can happen with X on BSD after logging out.
2134 In that case, there really is no input and no SIGIO,
2135 but select says there is input. */
2136
dd2281ae 2137 if (XINT (read_kbd) && interrupt_input
a69281ff 2138 && (keyboard_bit_set (&Available)))
d0d6b7c5 2139 kill (0, SIGIO);
4746118a 2140#endif
d0d6b7c5 2141
d0d6b7c5
JB
2142 if (! wait_proc)
2143 got_some_input |= nfds > 0;
2144
32676c08
JB
2145 /* If checking input just got us a size-change event from X,
2146 obey it now if we should. */
97f3b3d6 2147 if (XINT (read_kbd) || wait_for_cell)
32676c08
JB
2148 do_pending_window_change ();
2149
a9f2c884
RS
2150 /* Check for data from a process. */
2151 /* Really FIRST_PROC_DESC should be 0 on Unix,
2152 but this is safer in the short run. */
a69281ff 2153 for (channel = 0; channel <= max_process_desc; channel++)
d0d6b7c5 2154 {
a69281ff
RS
2155 if (FD_ISSET (channel, &Available)
2156 && FD_ISSET (channel, &non_keyboard_wait_mask))
d0d6b7c5
JB
2157 {
2158 int nread;
2159
2160 /* If waiting for this channel, arrange to return as
2161 soon as no more input to be processed. No more
2162 waiting. */
2163 if (wait_channel == channel)
2164 {
a9f2c884 2165 wait_channel = -1;
d0d6b7c5
JB
2166 time_limit = -1;
2167 got_some_input = 1;
2168 }
2169 proc = chan_process[channel];
2170 if (NILP (proc))
2171 continue;
2172
d0d6b7c5
JB
2173 /* Read data from the process, starting with our
2174 buffered-ahead character if we have one. */
2175
2176 nread = read_process_output (proc, channel);
2177 if (nread > 0)
2178 {
2179 /* Since read_process_output can run a filter,
2180 which can call accept-process-output,
2181 don't try to read from any other processes
2182 before doing the select again. */
2183 FD_ZERO (&Available);
2184
2185 if (do_display)
2186 redisplay_preserve_echo_area ();
2187 }
2188#ifdef EWOULDBLOCK
2189 else if (nread == -1 && errno == EWOULDBLOCK)
2190 ;
2191#else
2192#ifdef O_NONBLOCK
2193 else if (nread == -1 && errno == EAGAIN)
2194 ;
2195#else
2196#ifdef O_NDELAY
2197 else if (nread == -1 && errno == EAGAIN)
2198 ;
2199 /* Note that we cannot distinguish between no input
2200 available now and a closed pipe.
2201 With luck, a closed pipe will be accompanied by
2202 subprocess termination and SIGCHLD. */
2203 else if (nread == 0 && !NETCONN_P (proc))
2204 ;
ffd56f97
JB
2205#endif /* O_NDELAY */
2206#endif /* O_NONBLOCK */
2207#endif /* EWOULDBLOCK */
d0d6b7c5
JB
2208#ifdef HAVE_PTYS
2209 /* On some OSs with ptys, when the process on one end of
2210 a pty exits, the other end gets an error reading with
2211 errno = EIO instead of getting an EOF (0 bytes read).
2212 Therefore, if we get an error reading and errno =
2213 EIO, just continue, because the child process has
2214 exited and should clean itself up soon (e.g. when we
2215 get a SIGCHLD). */
2216 else if (nread == -1 && errno == EIO)
2217 ;
ffd56f97
JB
2218#endif /* HAVE_PTYS */
2219 /* If we can detect process termination, don't consider the process
2220 gone just because its pipe is closed. */
d0d6b7c5
JB
2221#ifdef SIGCHLD
2222 else if (nread == 0 && !NETCONN_P (proc))
2223 ;
2224#endif
2225 else
2226 {
2227 /* Preserve status of processes already terminated. */
2228 XSETINT (XPROCESS (proc)->tick, ++process_tick);
2229 deactivate_process (proc);
2230 if (!NILP (XPROCESS (proc)->raw_status_low))
2231 update_status (XPROCESS (proc));
2232 if (EQ (XPROCESS (proc)->status, Qrun))
2233 XPROCESS (proc)->status
2234 = Fcons (Qexit, Fcons (make_number (256), Qnil));
2235 }
2236 }
ffd56f97
JB
2237 } /* end for each file descriptor */
2238 } /* end while exit conditions not met */
d0d6b7c5 2239
d430ee71
RS
2240 waiting_for_user_input_p = 0;
2241
ffd56f97
JB
2242 /* If calling from keyboard input, do not quit
2243 since we want to return C-g as an input character.
2244 Otherwise, do pending quit if requested. */
f76475ad 2245 if (XINT (read_kbd) >= 0)
ffd56f97
JB
2246 {
2247 /* Prevent input_pending from remaining set if we quit. */
2248 clear_input_pending ();
2249 QUIT;
2250 }
d0d6b7c5
JB
2251
2252 return got_some_input;
2253}
2254\f
3b9a3dfa
RS
2255/* Given a list (FUNCTION ARGS...), apply FUNCTION to the ARGS. */
2256
2257static Lisp_Object
2258read_process_output_call (fun_and_args)
2259 Lisp_Object fun_and_args;
2260{
2261 return apply1 (XCONS (fun_and_args)->car, XCONS (fun_and_args)->cdr);
2262}
2263
2264static Lisp_Object
2265read_process_output_error_handler (error)
2266 Lisp_Object error;
2267{
2268 cmd_error_internal (error, "error in process filter: ");
2269 Vinhibit_quit = Qt;
2270 update_echo_area ();
833ba342 2271 Fsleep_for (make_number (2), Qnil);
3b9a3dfa
RS
2272}
2273
d0d6b7c5
JB
2274/* Read pending output from the process channel,
2275 starting with our buffered-ahead character if we have one.
2276 Yield number of characters read.
2277
2278 This function reads at most 1024 characters.
2279 If you want to read all available subprocess output,
2280 you must call it repeatedly until it returns zero. */
2281
2282read_process_output (proc, channel)
2283 Lisp_Object proc;
2284 register int channel;
2285{
2286 register int nchars;
2287#ifdef VMS
2288 char *chars;
2289#else
2290 char chars[1024];
2291#endif
2292 register Lisp_Object outstream;
2293 register struct buffer *old = current_buffer;
2294 register struct Lisp_Process *p = XPROCESS (proc);
2295 register int opoint;
2296
2297#ifdef VMS
2298 VMS_PROC_STUFF *vs, *get_vms_process_pointer();
2299
2300 vs = get_vms_process_pointer (p->pid);
2301 if (vs)
2302 {
2303 if (!vs->iosb[0])
2304 return(0); /* Really weird if it does this */
2305 if (!(vs->iosb[0] & 1))
2306 return -1; /* I/O error */
2307 }
2308 else
2309 error ("Could not get VMS process pointer");
2310 chars = vs->inputBuffer;
2311 nchars = clean_vms_buffer (chars, vs->iosb[1]);
2312 if (nchars <= 0)
2313 {
2314 start_vms_process_read (vs); /* Crank up the next read on the process */
2315 return 1; /* Nothing worth printing, say we got 1 */
2316 }
2317#else /* not VMS */
2318
2319 if (proc_buffered_char[channel] < 0)
e98d950b
RS
2320#ifdef WINDOWSNT
2321 nchars = read_child_output (channel, chars, sizeof (chars));
2322#else
d0d6b7c5 2323 nchars = read (channel, chars, sizeof chars);
e98d950b 2324#endif
d0d6b7c5
JB
2325 else
2326 {
2327 chars[0] = proc_buffered_char[channel];
2328 proc_buffered_char[channel] = -1;
e98d950b
RS
2329#ifdef WINDOWSNT
2330 nchars = read_child_output (channel, chars + 1, sizeof (chars) - 1);
2331#else
d0d6b7c5 2332 nchars = read (channel, chars + 1, sizeof chars - 1);
e98d950b 2333#endif
d0d6b7c5
JB
2334 if (nchars < 0)
2335 nchars = 1;
2336 else
2337 nchars = nchars + 1;
2338 }
2339#endif /* not VMS */
2340
2341 if (nchars <= 0) return nchars;
2342
2343 outstream = p->filter;
2344 if (!NILP (outstream))
2345 {
2346 /* We inhibit quit here instead of just catching it so that
2347 hitting ^G when a filter happens to be running won't screw
2348 it up. */
2349 int count = specpdl_ptr - specpdl;
30c78175 2350 Lisp_Object odeactivate;
dfc21838 2351 Lisp_Object obuffer, okeymap;
30c78175 2352
dfc21838
RS
2353 /* No need to gcpro these, because all we do with them later
2354 is test them for EQness, and none of them should be a string. */
30c78175 2355 odeactivate = Vdeactivate_mark;
dfc21838
RS
2356 XSETBUFFER (obuffer, current_buffer);
2357 okeymap = current_buffer->keymap;
30c78175 2358
d0d6b7c5 2359 specbind (Qinhibit_quit, Qt);
6545aada 2360 specbind (Qlast_nonmenu_event, Qt);
3b9a3dfa 2361
7074fde6 2362 running_asynch_code = 1;
3b9a3dfa
RS
2363 internal_condition_case_1 (read_process_output_call,
2364 Fcons (outstream,
2365 Fcons (proc,
7074fde6
FP
2366 Fcons (make_string (chars,
2367 nchars),
3b9a3dfa
RS
2368 Qnil))),
2369 !NILP (Vdebug_on_error) ? Qnil : Qerror,
2370 read_process_output_error_handler);
7074fde6
FP
2371 running_asynch_code = 0;
2372 restore_match_data ();
d0d6b7c5 2373
592ce97f 2374 /* Handling the process output should not deactivate the mark. */
30c78175
RS
2375 Vdeactivate_mark = odeactivate;
2376
dfc21838
RS
2377 if (! EQ (Fcurrent_buffer (), obuffer)
2378 || ! EQ (current_buffer->keymap, okeymap))
d72534ba
KH
2379 record_asynch_buffer_change ();
2380
8b4d685f
RS
2381 if (waiting_for_user_input_p)
2382 prepare_menu_bars ();
2383
d0d6b7c5
JB
2384#ifdef VMS
2385 start_vms_process_read (vs);
2386#endif
2ea6d561 2387 unbind_to (count, Qnil);
d0d6b7c5
JB
2388 return nchars;
2389 }
2390
2391 /* If no filter, write into buffer if it isn't dead. */
2392 if (!NILP (p->buffer) && !NILP (XBUFFER (p->buffer)->name))
2393 {
b0310da4
JB
2394 Lisp_Object old_read_only;
2395 Lisp_Object old_begv, old_zv;
30c78175
RS
2396 Lisp_Object odeactivate;
2397
2398 odeactivate = Vdeactivate_mark;
d0d6b7c5
JB
2399
2400 Fset_buffer (p->buffer);
2401 opoint = point;
b0310da4 2402 old_read_only = current_buffer->read_only;
22719df2
KH
2403 XSETFASTINT (old_begv, BEGV);
2404 XSETFASTINT (old_zv, ZV);
b0310da4
JB
2405
2406 current_buffer->read_only = Qnil;
d0d6b7c5
JB
2407
2408 /* Insert new output into buffer
2409 at the current end-of-output marker,
2410 thus preserving logical ordering of input and output. */
2411 if (XMARKER (p->mark)->buffer)
53aad33f 2412 SET_PT (clip_to_bounds (BEGV, marker_position (p->mark), ZV));
d0d6b7c5
JB
2413 else
2414 SET_PT (ZV);
b0310da4
JB
2415
2416 /* If the output marker is outside of the visible region, save
2417 the restriction and widen. */
2418 if (! (BEGV <= point && point <= ZV))
2419 Fwiden ();
2420
2421 /* Make sure opoint floats ahead of any new text, just as point
2422 would. */
d0d6b7c5
JB
2423 if (point <= opoint)
2424 opoint += nchars;
2425
b0310da4
JB
2426 /* Insert after old_begv, but before old_zv. */
2427 if (point < XFASTINT (old_begv))
7c6f34f0 2428 XSETFASTINT (old_begv, XFASTINT (old_begv) + nchars);
b0310da4 2429 if (point <= XFASTINT (old_zv))
7c6f34f0 2430 XSETFASTINT (old_zv, XFASTINT (old_zv) + nchars);
b0310da4 2431
d0d6b7c5
JB
2432 /* Insert before markers in case we are inserting where
2433 the buffer's mark is, and the user's next command is Meta-y. */
2434 insert_before_markers (chars, nchars);
d0d6b7c5 2435 Fset_marker (p->mark, make_number (point), p->buffer);
b0310da4 2436
d0d6b7c5
JB
2437 update_mode_lines++;
2438
b0310da4
JB
2439 /* If the restriction isn't what it should be, set it. */
2440 if (XFASTINT (old_begv) != BEGV || XFASTINT (old_zv) != ZV)
2441 Fnarrow_to_region (old_begv, old_zv);
2442
592ce97f 2443 /* Handling the process output should not deactivate the mark. */
30c78175
RS
2444 Vdeactivate_mark = odeactivate;
2445
b0310da4 2446 current_buffer->read_only = old_read_only;
d0d6b7c5
JB
2447 SET_PT (opoint);
2448 set_buffer_internal (old);
2449 }
2450#ifdef VMS
2451 start_vms_process_read (vs);
2452#endif
2453 return nchars;
2454}
2455
2456DEFUN ("waiting-for-user-input-p", Fwaiting_for_user_input_p, Swaiting_for_user_input_p,
2457 0, 0, 0,
8b4d685f 2458 "Returns non-nil if emacs is waiting for input from the user.\n\
d0d6b7c5
JB
2459This is intended for use by asynchronous process output filters and sentinels.")
2460 ()
2461{
8b4d685f 2462 return (waiting_for_user_input_p ? Qt : Qnil);
d0d6b7c5
JB
2463}
2464\f
2465/* Sending data to subprocess */
2466
2467jmp_buf send_process_frame;
2468
2469SIGTYPE
2470send_process_trap ()
2471{
2472#ifdef BSD4_1
2473 sigrelse (SIGPIPE);
2474 sigrelse (SIGALRM);
2475#endif /* BSD4_1 */
2476 longjmp (send_process_frame, 1);
2477}
2478
4556b700
RS
2479/* Send some data to process PROC.
2480 BUF is the beginning of the data; LEN is the number of characters.
2481 OBJECT is the Lisp object that the data comes from. */
2482
2483send_process (proc, buf, len, object)
ecd1f654 2484 volatile Lisp_Object proc;
d0d6b7c5
JB
2485 char *buf;
2486 int len;
4556b700 2487 Lisp_Object object;
d0d6b7c5 2488{
ecd1f654 2489 /* Use volatile to protect variables from being clobbered by longjmp. */
d0d6b7c5 2490 int rv;
ecd1f654 2491 volatile unsigned char *procname = XSTRING (XPROCESS (proc)->name)->data;
d0d6b7c5 2492
d0d6b7c5
JB
2493#ifdef VMS
2494 struct Lisp_Process *p = XPROCESS (proc);
2495 VMS_PROC_STUFF *vs, *get_vms_process_pointer();
2496#endif /* VMS */
2497
2498 if (! NILP (XPROCESS (proc)->raw_status_low))
2499 update_status (XPROCESS (proc));
2500 if (! EQ (XPROCESS (proc)->status, Qrun))
2501 error ("Process %s not running", procname);
2502
2503#ifdef VMS
2504 vs = get_vms_process_pointer (p->pid);
2505 if (vs == 0)
2506 error ("Could not find this process: %x", p->pid);
2507 else if (write_to_vms_process (vs, buf, len))
2508 ;
2509#else
4556b700
RS
2510
2511 if (pty_max_bytes == 0)
2512 {
2513#if defined (HAVE_FPATHCONF) && defined (_PC_MAX_CANON)
2514 pty_max_bytes = fpathconf (XFASTINT (XPROCESS (proc)->outfd),
2515 _PC_MAX_CANON);
2516 if (pty_max_bytes < 0)
2517 pty_max_bytes = 250;
2518#else
2519 pty_max_bytes = 250;
2520#endif
2521 /* Deduct one, to leave space for the eof. */
2522 pty_max_bytes--;
2523 }
2524
d0d6b7c5
JB
2525 if (!setjmp (send_process_frame))
2526 while (len > 0)
2527 {
2528 int this = len;
4746118a 2529 SIGTYPE (*old_sigpipe)();
93b4f699
RS
2530 int flush_pty = 0;
2531
4556b700
RS
2532 /* Decide how much data we can send in one batch.
2533 Long lines need to be split into multiple batches. */
2534 if (!NILP (XPROCESS (proc)->pty_flag))
93b4f699 2535 {
4556b700
RS
2536 /* Starting this at zero is always correct when not the first iteration
2537 because the previous iteration ended by sending C-d.
2538 It may not be correct for the first iteration
2539 if a partial line was sent in a separate send_process call.
2540 If that proves worth handling, we need to save linepos
2541 in the process object. */
2542 int linepos = 0;
2543 char *ptr = buf;
2544 char *end = buf + len;
2545
2546 /* Scan through this text for a line that is too long. */
2547 while (ptr != end && linepos < pty_max_bytes)
2548 {
2549 if (*ptr == '\n')
2550 linepos = 0;
2551 else
2552 linepos++;
2553 ptr++;
2554 }
2555 /* If we found one, break the line there
2556 and put in a C-d to force the buffer through. */
2557 this = ptr - buf;
93b4f699
RS
2558 }
2559
4556b700
RS
2560 /* Send this batch, using one or more write calls. */
2561 while (this > 0)
d0d6b7c5 2562 {
4556b700
RS
2563 old_sigpipe = (SIGTYPE (*) ()) signal (SIGPIPE, send_process_trap);
2564 rv = write (XINT (XPROCESS (proc)->outfd), buf, this);
2565 signal (SIGPIPE, old_sigpipe);
2566
2567 if (rv < 0)
2568 {
2569 if (0
d0d6b7c5 2570#ifdef EWOULDBLOCK
4556b700 2571 || errno == EWOULDBLOCK
d0d6b7c5
JB
2572#endif
2573#ifdef EAGAIN
4556b700 2574 || errno == EAGAIN
d0d6b7c5 2575#endif
4556b700
RS
2576 )
2577 /* Buffer is full. Wait, accepting input;
2578 that may allow the program
2579 to finish doing output and read more. */
2580 {
2581 Lisp_Object zero;
2582 int offset;
2583
2584 /* Running filters might relocate buffers or strings.
2585 Arrange to relocate BUF. */
2586 if (BUFFERP (object))
2587 offset = BUF_PTR_CHAR_POS (XBUFFER (object),
2588 (unsigned char *) buf);
2589 else if (STRINGP (object))
2590 offset = buf - (char *) XSTRING (object)->data;
2591
22719df2 2592 XSETFASTINT (zero, 0);
4556b700
RS
2593 wait_reading_process_input (1, 0, zero, 0);
2594
2595 if (BUFFERP (object))
2596 buf = (char *) BUF_CHAR_ADDRESS (XBUFFER (object), offset);
2597 else if (STRINGP (object))
2598 buf = offset + (char *) XSTRING (object)->data;
2599
2600 rv = 0;
2601 }
2602 else
2603 /* This is a real error. */
2604 report_file_error ("writing to process", Fcons (proc, Qnil));
d0d6b7c5 2605 }
4556b700
RS
2606 buf += rv;
2607 len -= rv;
2608 this -= rv;
d0d6b7c5 2609 }
f76475ad 2610
4556b700
RS
2611 /* If we sent just part of the string, put in an EOF
2612 to force it through, before we send the rest. */
2613 if (len > 0)
2614 Fprocess_send_eof (proc);
d0d6b7c5
JB
2615 }
2616#endif
2617 else
2618 {
2619 XPROCESS (proc)->raw_status_low = Qnil;
2620 XPROCESS (proc)->raw_status_high = Qnil;
2621 XPROCESS (proc)->status = Fcons (Qexit, Fcons (make_number (256), Qnil));
2622 XSETINT (XPROCESS (proc)->tick, ++process_tick);
2623 deactivate_process (proc);
2624#ifdef VMS
2625 error ("Error writing to process %s; closed it", procname);
2626#else
2627 error ("SIGPIPE raised on process %s; closed it", procname);
2628#endif
2629 }
2630}
2631
2632DEFUN ("process-send-region", Fprocess_send_region, Sprocess_send_region,
2633 3, 3, 0,
2634 "Send current contents of region as input to PROCESS.\n\
ebb9e16f
JB
2635PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
2636nil, indicating the current buffer's process.\n\
d0d6b7c5
JB
2637Called from program, takes three arguments, PROCESS, START and END.\n\
2638If the region is more than 500 characters long,\n\
2639it is sent in several bunches. This may happen even for shorter regions.\n\
2640Output from processes can arrive in between bunches.")
2641 (process, start, end)
2642 Lisp_Object process, start, end;
2643{
2644 Lisp_Object proc;
2645 int start1;
2646
2647 proc = get_process (process);
2648 validate_region (&start, &end);
2649
2650 if (XINT (start) < GPT && XINT (end) > GPT)
2651 move_gap (start);
2652
2653 start1 = XINT (start);
4556b700
RS
2654 send_process (proc, &FETCH_CHAR (start1), XINT (end) - XINT (start),
2655 Fcurrent_buffer ());
d0d6b7c5
JB
2656
2657 return Qnil;
2658}
2659
2660DEFUN ("process-send-string", Fprocess_send_string, Sprocess_send_string,
2661 2, 2, 0,
2662 "Send PROCESS the contents of STRING as input.\n\
ebb9e16f
JB
2663PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
2664nil, indicating the current buffer's process.\n\
d0d6b7c5
JB
2665If STRING is more than 500 characters long,\n\
2666it is sent in several bunches. This may happen even for shorter strings.\n\
2667Output from processes can arrive in between bunches.")
2668 (process, string)
2669 Lisp_Object process, string;
2670{
2671 Lisp_Object proc;
2672 CHECK_STRING (string, 1);
2673 proc = get_process (process);
4556b700 2674 send_process (proc, XSTRING (string)->data, XSTRING (string)->size, string);
d0d6b7c5
JB
2675 return Qnil;
2676}
2677\f
2678/* send a signal number SIGNO to PROCESS.
2679 CURRENT_GROUP means send to the process group that currently owns
2680 the terminal being used to communicate with PROCESS.
2681 This is used for various commands in shell mode.
2682 If NOMSG is zero, insert signal-announcements into process's buffers
b0310da4
JB
2683 right away.
2684
2685 If we can, we try to signal PROCESS by sending control characters
e333e864 2686 down the pty. This allows us to signal inferiors who have changed
b0310da4 2687 their uid, for which killpg would return an EPERM error. */
d0d6b7c5 2688
f9738840 2689static void
d0d6b7c5
JB
2690process_send_signal (process, signo, current_group, nomsg)
2691 Lisp_Object process;
2692 int signo;
2693 Lisp_Object current_group;
2694 int nomsg;
2695{
2696 Lisp_Object proc;
2697 register struct Lisp_Process *p;
2698 int gid;
2699 int no_pgrp = 0;
2700
2701 proc = get_process (process);
2702 p = XPROCESS (proc);
2703
2704 if (!EQ (p->childp, Qt))
2705 error ("Process %s is not a subprocess",
2706 XSTRING (p->name)->data);
a9f2c884 2707 if (XINT (p->infd) < 0)
d0d6b7c5
JB
2708 error ("Process %s is not active",
2709 XSTRING (p->name)->data);
2710
2711 if (NILP (p->pty_flag))
2712 current_group = Qnil;
2713
d0d6b7c5
JB
2714 /* If we are using pgrps, get a pgrp number and make it negative. */
2715 if (!NILP (current_group))
2716 {
b0310da4 2717#ifdef SIGNALS_VIA_CHARACTERS
d0d6b7c5
JB
2718 /* If possible, send signals to the entire pgrp
2719 by sending an input character to it. */
b0310da4 2720
6be429b1
JB
2721 /* TERMIOS is the latest and bestest, and seems most likely to
2722 work. If the system has it, use it. */
2723#ifdef HAVE_TERMIOS
2724 struct termios t;
2725
2726 switch (signo)
2727 {
2728 case SIGINT:
a9f2c884 2729 tcgetattr (XINT (p->infd), &t);
4556b700 2730 send_process (proc, &t.c_cc[VINTR], 1, Qnil);
a87b802f 2731 return;
6be429b1
JB
2732
2733 case SIGQUIT:
a9f2c884 2734 tcgetattr (XINT (p->infd), &t);
4556b700 2735 send_process (proc, &t.c_cc[VQUIT], 1, Qnil);
a87b802f 2736 return;
6be429b1
JB
2737
2738 case SIGTSTP:
a9f2c884 2739 tcgetattr (XINT (p->infd), &t);
d0adf46f 2740#if defined (VSWTCH) && !defined (PREFER_VSUSP)
4556b700 2741 send_process (proc, &t.c_cc[VSWTCH], 1, Qnil);
6be429b1 2742#else
4556b700 2743 send_process (proc, &t.c_cc[VSUSP], 1, Qnil);
6be429b1 2744#endif
a87b802f 2745 return;
6be429b1
JB
2746 }
2747
2748#else /* ! HAVE_TERMIOS */
2749
b0310da4
JB
2750 /* On Berkeley descendants, the following IOCTL's retrieve the
2751 current control characters. */
d0d6b7c5 2752#if defined (TIOCGLTC) && defined (TIOCGETC)
b0310da4 2753
d0d6b7c5
JB
2754 struct tchars c;
2755 struct ltchars lc;
2756
2757 switch (signo)
2758 {
2759 case SIGINT:
a9f2c884 2760 ioctl (XINT (p->infd), TIOCGETC, &c);
4556b700 2761 send_process (proc, &c.t_intrc, 1, Qnil);
f9738840 2762 return;
d0d6b7c5 2763 case SIGQUIT:
a9f2c884 2764 ioctl (XINT (p->infd), TIOCGETC, &c);
4556b700 2765 send_process (proc, &c.t_quitc, 1, Qnil);
f9738840 2766 return;
0ad77c54 2767#ifdef SIGTSTP
d0d6b7c5 2768 case SIGTSTP:
a9f2c884 2769 ioctl (XINT (p->infd), TIOCGLTC, &lc);
4556b700 2770 send_process (proc, &lc.t_suspc, 1, Qnil);
f9738840 2771 return;
b0310da4 2772#endif /* ! defined (SIGTSTP) */
d0d6b7c5 2773 }
b0310da4
JB
2774
2775#else /* ! defined (TIOCGLTC) && defined (TIOCGETC) */
2776
2777 /* On SYSV descendants, the TCGETA ioctl retrieves the current control
2778 characters. */
2779#ifdef TCGETA
d0d6b7c5
JB
2780 struct termio t;
2781 switch (signo)
2782 {
2783 case SIGINT:
a9f2c884 2784 ioctl (XINT (p->infd), TCGETA, &t);
4556b700 2785 send_process (proc, &t.c_cc[VINTR], 1, Qnil);
f9738840 2786 return;
d0d6b7c5 2787 case SIGQUIT:
a9f2c884 2788 ioctl (XINT (p->infd), TCGETA, &t);
4556b700 2789 send_process (proc, &t.c_cc[VQUIT], 1, Qnil);
f9738840 2790 return;
7d79e3b4 2791#ifdef SIGTSTP
d0d6b7c5 2792 case SIGTSTP:
a9f2c884 2793 ioctl (XINT (p->infd), TCGETA, &t);
4556b700 2794 send_process (proc, &t.c_cc[VSWTCH], 1, Qnil);
f9738840 2795 return;
b0310da4 2796#endif /* ! defined (SIGTSTP) */
d0d6b7c5 2797 }
b0310da4
JB
2798#else /* ! defined (TCGETA) */
2799 Your configuration files are messed up.
2800 /* If your system configuration files define SIGNALS_VIA_CHARACTERS,
2801 you'd better be using one of the alternatives above! */
2802#endif /* ! defined (TCGETA) */
2803#endif /* ! defined (TIOCGLTC) && defined (TIOCGETC) */
6be429b1 2804#endif /* ! defined HAVE_TERMIOS */
b0310da4 2805#endif /* ! defined (SIGNALS_VIA_CHARACTERS) */
d0d6b7c5 2806
301c3fe4 2807#ifdef TIOCGPGRP
d0d6b7c5
JB
2808 /* Get the pgrp using the tty itself, if we have that.
2809 Otherwise, use the pty to get the pgrp.
2810 On pfa systems, saka@pfu.fujitsu.co.JP writes:
b0310da4
JB
2811 "TIOCGPGRP symbol defined in sys/ioctl.h at E50.
2812 But, TIOCGPGRP does not work on E50 ;-P works fine on E60"
d0d6b7c5
JB
2813 His patch indicates that if TIOCGPGRP returns an error, then
2814 we should just assume that p->pid is also the process group id. */
2815 {
2816 int err;
2817
2818 if (!NILP (p->subtty))
2819 err = ioctl (XFASTINT (p->subtty), TIOCGPGRP, &gid);
2820 else
a9f2c884 2821 err = ioctl (XINT (p->infd), TIOCGPGRP, &gid);
d0d6b7c5
JB
2822
2823#ifdef pfa
2824 if (err == -1)
2825 gid = - XFASTINT (p->pid);
301c3fe4 2826#endif /* ! defined (pfa) */
d0d6b7c5
JB
2827 }
2828 if (gid == -1)
2829 no_pgrp = 1;
2830 else
2831 gid = - gid;
b0310da4 2832#else /* ! defined (TIOCGPGRP ) */
301c3fe4
JB
2833 /* Can't select pgrps on this system, so we know that
2834 the child itself heads the pgrp. */
2835 gid = - XFASTINT (p->pid);
2836#endif /* ! defined (TIOCGPGRP ) */
d0d6b7c5
JB
2837 }
2838 else
2839 gid = - XFASTINT (p->pid);
d0d6b7c5
JB
2840
2841 switch (signo)
2842 {
2843#ifdef SIGCONT
2844 case SIGCONT:
2845 p->raw_status_low = Qnil;
2846 p->raw_status_high = Qnil;
2847 p->status = Qrun;
2848 XSETINT (p->tick, ++process_tick);
2849 if (!nomsg)
2850 status_notify ();
2851 break;
301c3fe4 2852#endif /* ! defined (SIGCONT) */
d0d6b7c5
JB
2853 case SIGINT:
2854#ifdef VMS
4556b700 2855 send_process (proc, "\003", 1, Qnil); /* ^C */
d0d6b7c5
JB
2856 goto whoosh;
2857#endif
2858 case SIGQUIT:
2859#ifdef VMS
4556b700 2860 send_process (proc, "\031", 1, Qnil); /* ^Y */
d0d6b7c5
JB
2861 goto whoosh;
2862#endif
2863 case SIGKILL:
2864#ifdef VMS
2865 sys$forcex (&(XFASTINT (p->pid)), 0, 1);
2866 whoosh:
2867#endif
a9f2c884 2868 flush_pending_output (XINT (p->infd));
d0d6b7c5
JB
2869 break;
2870 }
2871
2872 /* If we don't have process groups, send the signal to the immediate
2873 subprocess. That isn't really right, but it's better than any
2874 obvious alternative. */
2875 if (no_pgrp)
2876 {
2877 kill (XFASTINT (p->pid), signo);
2878 return;
2879 }
2880
2881 /* gid may be a pid, or minus a pgrp's number */
2882#ifdef TIOCSIGSEND
2883 if (!NILP (current_group))
a9f2c884 2884 ioctl (XINT (p->infd), TIOCSIGSEND, signo);
d0d6b7c5
JB
2885 else
2886 {
2887 gid = - XFASTINT (p->pid);
2888 kill (gid, signo);
2889 }
301c3fe4 2890#else /* ! defined (TIOCSIGSEND) */
d0d6b7c5 2891 EMACS_KILLPG (-gid, signo);
301c3fe4 2892#endif /* ! defined (TIOCSIGSEND) */
d0d6b7c5
JB
2893}
2894
2895DEFUN ("interrupt-process", Finterrupt_process, Sinterrupt_process, 0, 2, 0,
2896 "Interrupt process PROCESS. May be process or name of one.\n\
ebb9e16f 2897PROCESS may be a process, a buffer, or the name of a process or buffer.\n\
e333e864 2898nil or no arg means current buffer's process.\n\
d0d6b7c5
JB
2899Second arg CURRENT-GROUP non-nil means send signal to\n\
2900the current process-group of the process's controlling terminal\n\
2901rather than to the process's own process group.\n\
2902If the process is a shell, this means interrupt current subjob\n\
2903rather than the shell.")
2904 (process, current_group)
2905 Lisp_Object process, current_group;
2906{
2907 process_send_signal (process, SIGINT, current_group, 0);
2908 return process;
2909}
2910
2911DEFUN ("kill-process", Fkill_process, Skill_process, 0, 2, 0,
2912 "Kill process PROCESS. May be process or name of one.\n\
2913See function `interrupt-process' for more details on usage.")
2914 (process, current_group)
2915 Lisp_Object process, current_group;
2916{
2917 process_send_signal (process, SIGKILL, current_group, 0);
2918 return process;
2919}
2920
2921DEFUN ("quit-process", Fquit_process, Squit_process, 0, 2, 0,
2922 "Send QUIT signal to 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, SIGQUIT, current_group, 0);
2928 return process;
2929}
2930
2931DEFUN ("stop-process", Fstop_process, Sstop_process, 0, 2, 0,
2932 "Stop 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#ifndef SIGTSTP
2938 error ("no SIGTSTP support");
2939#else
2940 process_send_signal (process, SIGTSTP, current_group, 0);
2941#endif
2942 return process;
2943}
2944
2945DEFUN ("continue-process", Fcontinue_process, Scontinue_process, 0, 2, 0,
2946 "Continue process PROCESS. May be process or name of one.\n\
2947See function `interrupt-process' for more details on usage.")
2948 (process, current_group)
2949 Lisp_Object process, current_group;
2950{
2951#ifdef SIGCONT
2952 process_send_signal (process, SIGCONT, current_group, 0);
2953#else
2954 error ("no SIGCONT support");
2955#endif
2956 return process;
2957}
2958
2959DEFUN ("signal-process", Fsignal_process, Ssignal_process,
2960 2, 2, "nProcess number: \nnSignal code: ",
4766242d
RS
2961 "Send the process with process id PID the signal with code SIGCODE.\n\
2962PID must be an integer. The process need not be a child of this Emacs.\n\
2963SIGCODE may be an integer, or a symbol whose name is a signal name.")
2964 (pid, sigcode)
2965 Lisp_Object pid, sigcode;
d0d6b7c5
JB
2966{
2967 CHECK_NUMBER (pid, 0);
4766242d
RS
2968
2969#define handle_signal(NAME, VALUE) \
2970 else if (!strcmp (name, NAME)) \
2971 XSETINT (sigcode, VALUE)
2972
2973 if (INTEGERP (sigcode))
2974 ;
2975 else
2976 {
2977 unsigned char *name;
2978
2979 CHECK_SYMBOL (sigcode, 1);
2980 name = XSYMBOL (sigcode)->name->data;
2981
2982 if (0)
2983 ;
2984#ifdef SIGHUP
2985 handle_signal ("SIGHUP", SIGHUP);
2986#endif
2987#ifdef SIGINT
2988 handle_signal ("SIGINT", SIGINT);
2989#endif
2990#ifdef SIGQUIT
2991 handle_signal ("SIGQUIT", SIGQUIT);
2992#endif
2993#ifdef SIGILL
2994 handle_signal ("SIGILL", SIGILL);
2995#endif
2996#ifdef SIGABRT
2997 handle_signal ("SIGABRT", SIGABRT);
2998#endif
2999#ifdef SIGEMT
3000 handle_signal ("SIGEMT", SIGEMT);
3001#endif
3002#ifdef SIGKILL
3003 handle_signal ("SIGKILL", SIGKILL);
3004#endif
3005#ifdef SIGFPE
3006 handle_signal ("SIGFPE", SIGFPE);
3007#endif
3008#ifdef SIGBUS
3009 handle_signal ("SIGBUS", SIGBUS);
3010#endif
3011#ifdef SIGSEGV
3012 handle_signal ("SIGSEGV", SIGSEGV);
3013#endif
3014#ifdef SIGSYS
3015 handle_signal ("SIGSYS", SIGSYS);
3016#endif
3017#ifdef SIGPIPE
3018 handle_signal ("SIGPIPE", SIGPIPE);
3019#endif
3020#ifdef SIGALRM
3021 handle_signal ("SIGALRM", SIGALRM);
3022#endif
3023#ifdef SIGTERM
3024 handle_signal ("SIGTERM", SIGTERM);
3025#endif
3026#ifdef SIGURG
3027 handle_signal ("SIGURG", SIGURG);
3028#endif
3029#ifdef SIGSTOP
3030 handle_signal ("SIGSTOP", SIGSTOP);
3031#endif
3032#ifdef SIGTSTP
3033 handle_signal ("SIGTSTP", SIGTSTP);
3034#endif
3035#ifdef SIGCONT
3036 handle_signal ("SIGCONT", SIGCONT);
3037#endif
3038#ifdef SIGCHLD
3039 handle_signal ("SIGCHLD", SIGCHLD);
3040#endif
3041#ifdef SIGTTIN
3042 handle_signal ("SIGTTIN", SIGTTIN);
3043#endif
3044#ifdef SIGTTOU
3045 handle_signal ("SIGTTOU", SIGTTOU);
3046#endif
3047#ifdef SIGIO
3048 handle_signal ("SIGIO", SIGIO);
3049#endif
3050#ifdef SIGXCPU
3051 handle_signal ("SIGXCPU", SIGXCPU);
3052#endif
3053#ifdef SIGXFSZ
3054 handle_signal ("SIGXFSZ", SIGXFSZ);
3055#endif
3056#ifdef SIGVTALRM
3057 handle_signal ("SIGVTALRM", SIGVTALRM);
3058#endif
3059#ifdef SIGPROF
3060 handle_signal ("SIGPROF", SIGPROF);
3061#endif
3062#ifdef SIGWINCH
3063 handle_signal ("SIGWINCH", SIGWINCH);
3064#endif
3065#ifdef SIGINFO
3066 handle_signal ("SIGINFO", SIGINFO);
3067#endif
3068#ifdef SIGUSR1
3069 handle_signal ("SIGUSR1", SIGUSR1);
3070#endif
3071#ifdef SIGUSR2
3072 handle_signal ("SIGUSR2", SIGUSR2);
3073#endif
3074 else
9fa195a2 3075 error ("Undefined signal name %s", name);
4766242d
RS
3076 }
3077
3078#undef handle_signal
3079
e98d950b
RS
3080#ifdef WINDOWSNT
3081 /* Only works for kill-type signals */
4766242d 3082 return make_number (win32_kill_process (XINT (pid), XINT (sigcode)));
e98d950b 3083#else
4766242d 3084 return make_number (kill (XINT (pid), XINT (sigcode)));
e98d950b 3085#endif
d0d6b7c5
JB
3086}
3087
3088DEFUN ("process-send-eof", Fprocess_send_eof, Sprocess_send_eof, 0, 1, 0,
3089 "Make PROCESS see end-of-file in its input.\n\
3090Eof comes after any text already sent to it.\n\
ebb9e16f 3091PROCESS may be a process, a buffer, the name of a process or buffer, or\n\
d33a00f2
RS
3092nil, indicating the current buffer's process.\n\
3093If PROCESS is a network connection, or is a process communicating\n\
3094through a pipe (as opposed to a pty), then you cannot send any more\n\
3095text to PROCESS after you call this function.")
d0d6b7c5
JB
3096 (process)
3097 Lisp_Object process;
3098{
3099 Lisp_Object proc;
3100
3101 proc = get_process (process);
577d03d5
RS
3102
3103 /* Make sure the process is really alive. */
3104 if (! NILP (XPROCESS (proc)->raw_status_low))
3105 update_status (XPROCESS (proc));
3106 if (! EQ (XPROCESS (proc)->status, Qrun))
dcf970e6 3107 error ("Process %s not running", XSTRING (XPROCESS (proc)->name)->data);
577d03d5 3108
d0d6b7c5 3109#ifdef VMS
4556b700 3110 send_process (proc, "\032", 1, Qnil); /* ^z */
d0d6b7c5
JB
3111#else
3112 if (!NILP (XPROCESS (proc)->pty_flag))
4556b700 3113 send_process (proc, "\004", 1, Qnil);
d0d6b7c5
JB
3114 else
3115 {
a9f2c884 3116 close (XINT (XPROCESS (proc)->outfd));
1d056e64 3117 XSETINT (XPROCESS (proc)->outfd, open (NULL_DEVICE, O_WRONLY));
d0d6b7c5
JB
3118 }
3119#endif /* VMS */
d0d6b7c5
JB
3120 return process;
3121}
3122
3123/* Kill all processes associated with `buffer'.
3124 If `buffer' is nil, kill all processes */
3125
3126kill_buffer_processes (buffer)
3127 Lisp_Object buffer;
3128{
3129 Lisp_Object tail, proc;
3130
b5b502d6 3131 for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCONS (tail)->cdr)
d0d6b7c5
JB
3132 {
3133 proc = XCONS (XCONS (tail)->car)->cdr;
b5b502d6 3134 if (GC_PROCESSP (proc)
d0d6b7c5
JB
3135 && (NILP (buffer) || EQ (XPROCESS (proc)->buffer, buffer)))
3136 {
3137 if (NETCONN_P (proc))
e1ab4959 3138 Fdelete_process (proc);
a9f2c884 3139 else if (XINT (XPROCESS (proc)->infd) >= 0)
d0d6b7c5
JB
3140 process_send_signal (proc, SIGHUP, Qnil, 1);
3141 }
3142 }
3143}
3144\f
3145/* On receipt of a signal that a child status has changed,
3146 loop asking about children with changed statuses until
3147 the system says there are no more.
3148 All we do is change the status;
3149 we do not run sentinels or print notifications.
3150 That is saved for the next time keyboard input is done,
3151 in order to avoid timing errors. */
3152
3153/** WARNING: this can be called during garbage collection.
3154 Therefore, it must not be fooled by the presence of mark bits in
3155 Lisp objects. */
3156
3157/** USG WARNING: Although it is not obvious from the documentation
3158 in signal(2), on a USG system the SIGCLD handler MUST NOT call
3159 signal() before executing at least one wait(), otherwise the handler
3160 will be called again, resulting in an infinite loop. The relevant
3161 portion of the documentation reads "SIGCLD signals will be queued
3162 and the signal-catching function will be continually reentered until
3163 the queue is empty". Invoking signal() causes the kernel to reexamine
3164 the SIGCLD queue. Fred Fish, UniSoft Systems Inc. */
3165
3166SIGTYPE
3167sigchld_handler (signo)
3168 int signo;
3169{
3170 int old_errno = errno;
3171 Lisp_Object proc;
3172 register struct Lisp_Process *p;
6be429b1 3173 extern EMACS_TIME *input_available_clear_time;
d0d6b7c5
JB
3174
3175#ifdef BSD4_1
3176 extern int sigheld;
3177 sigheld |= sigbit (SIGCHLD);
3178#endif
3179
3180 while (1)
3181 {
3182 register int pid;
3183 WAITTYPE w;
3184 Lisp_Object tail;
3185
3186#ifdef WNOHANG
3187#ifndef WUNTRACED
3188#define WUNTRACED 0
3189#endif /* no WUNTRACED */
3190 /* Keep trying to get a status until we get a definitive result. */
3191 do
3192 {
3193 errno = 0;
3194 pid = wait3 (&w, WNOHANG | WUNTRACED, 0);
3195 }
3196 while (pid <= 0 && errno == EINTR);
3197
3198 if (pid <= 0)
3199 {
3200 /* A real failure. We have done all our job, so return. */
3201
3202 /* USG systems forget handlers when they are used;
3203 must reestablish each time */
3204#ifdef USG
3205 signal (signo, sigchld_handler); /* WARNING - must come after wait3() */
3206#endif
3207#ifdef BSD4_1
3208 sigheld &= ~sigbit (SIGCHLD);
3209 sigrelse (SIGCHLD);
3210#endif
3211 errno = old_errno;
3212 return;
3213 }
3214#else
3215 pid = wait (&w);
3216#endif /* no WNOHANG */
3217
3218 /* Find the process that signaled us, and record its status. */
3219
3220 p = 0;
3221 for (tail = Vprocess_alist; XSYMBOL (tail) != XSYMBOL (Qnil); tail = XCONS (tail)->cdr)
3222 {
3223 proc = XCONS (XCONS (tail)->car)->cdr;
3224 p = XPROCESS (proc);
3225 if (EQ (p->childp, Qt) && XFASTINT (p->pid) == pid)
3226 break;
3227 p = 0;
3228 }
3229
3230 /* Look for an asynchronous process whose pid hasn't been filled
3231 in yet. */
3232 if (p == 0)
3233 for (tail = Vprocess_alist; XSYMBOL (tail) != XSYMBOL (Qnil); tail = XCONS (tail)->cdr)
3234 {
3235 proc = XCONS (XCONS (tail)->car)->cdr;
3236 p = XPROCESS (proc);
bcd69aea 3237 if (INTEGERP (p->pid) && XINT (p->pid) == -1)
d0d6b7c5
JB
3238 break;
3239 p = 0;
3240 }
3241
3242 /* Change the status of the process that was found. */
3243 if (p != 0)
3244 {
3245 union { int i; WAITTYPE wt; } u;
e98d950b 3246 int clear_desc_flag = 0;
d0d6b7c5
JB
3247
3248 XSETINT (p->tick, ++process_tick);
3249 u.wt = w;
22719df2
KH
3250 XSETFASTINT (p->raw_status_low, u.i & 0xffff);
3251 XSETFASTINT (p->raw_status_high, u.i >> 16);
d0d6b7c5
JB
3252
3253 /* If process has terminated, stop waiting for its output. */
e98d950b
RS
3254 if ((WIFSIGNALED (w) || WIFEXITED (w))
3255 && XINT (p->infd) >= 0)
3256 clear_desc_flag = 1;
3257
3258 /* We use clear_desc_flag to avoid a compiler bug in Microsoft C. */
3259 if (clear_desc_flag)
3260 {
3261 FD_CLR (XINT (p->infd), &input_wait_mask);
3262 FD_CLR (XINT (p->infd), &non_keyboard_wait_mask);
3263 }
6be429b1
JB
3264
3265 /* Tell wait_reading_process_input that it needs to wake up and
3266 look around. */
3267 if (input_available_clear_time)
3268 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
d0d6b7c5
JB
3269 }
3270
3271 /* There was no asynchronous process found for that id. Check
3272 if we have a synchronous process. */
3273 else
3274 {
3275 synch_process_alive = 0;
3276
3277 /* Report the status of the synchronous process. */
3278 if (WIFEXITED (w))
3279 synch_process_retcode = WRETCODE (w);
3280 else if (WIFSIGNALED (w))
b97ad9ea
RS
3281 {
3282 int code = WTERMSIG (w);
3283 char *signame = 0;
3284
3285 if (code < NSIG)
3286 {
b0310da4 3287#ifndef VMS
ed0cae05
RS
3288 /* Suppress warning if the table has const char *. */
3289 signame = (char *) sys_siglist[code];
b0310da4 3290#else
b97ad9ea 3291 signame = sys_errlist[code];
b0310da4 3292#endif
b97ad9ea
RS
3293 }
3294 if (signame == 0)
3295 signame = "unknown";
3296
3297 synch_process_death = signame;
3298 }
6be429b1
JB
3299
3300 /* Tell wait_reading_process_input that it needs to wake up and
3301 look around. */
3302 if (input_available_clear_time)
3303 EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
d0d6b7c5
JB
3304 }
3305
3306 /* On some systems, we must return right away.
3307 If any more processes want to signal us, we will
3308 get another signal.
3309 Otherwise (on systems that have WNOHANG), loop around
3310 to use up all the processes that have something to tell us. */
e98d950b 3311#if defined (USG) && ! (defined (HPUX) && defined (WNOHANG)) || defined (WINDOWSNT)
d0d6b7c5
JB
3312#ifdef USG
3313 signal (signo, sigchld_handler);
3314#endif
3315 errno = old_errno;
3316 return;
3317#endif /* USG, but not HPUX with WNOHANG */
3318 }
3319}
3320\f
3321
3322static Lisp_Object
3323exec_sentinel_unwind (data)
3324 Lisp_Object data;
3325{
3326 XPROCESS (XCONS (data)->car)->sentinel = XCONS (data)->cdr;
3327 return Qnil;
3328}
3329
3b9a3dfa
RS
3330static Lisp_Object
3331exec_sentinel_error_handler (error)
3332 Lisp_Object error;
3333{
3334 cmd_error_internal (error, "error in process sentinel: ");
3335 Vinhibit_quit = Qt;
3336 update_echo_area ();
833ba342 3337 Fsleep_for (make_number (2), Qnil);
3b9a3dfa
RS
3338}
3339
d0d6b7c5
JB
3340static void
3341exec_sentinel (proc, reason)
3342 Lisp_Object proc, reason;
3343{
dfc21838 3344 Lisp_Object sentinel, obuffer, odeactivate, okeymap;
d0d6b7c5
JB
3345 register struct Lisp_Process *p = XPROCESS (proc);
3346 int count = specpdl_ptr - specpdl;
3347
dfc21838
RS
3348 /* No need to gcpro these, because all we do with them later
3349 is test them for EQness, and none of them should be a string. */
8fb3cf64 3350 odeactivate = Vdeactivate_mark;
dfc21838
RS
3351 XSETBUFFER (obuffer, current_buffer);
3352 okeymap = current_buffer->keymap;
3353
d0d6b7c5
JB
3354 sentinel = p->sentinel;
3355 if (NILP (sentinel))
3356 return;
3357
3358 /* Zilch the sentinel while it's running, to avoid recursive invocations;
3359 assure that it gets restored no matter how the sentinel exits. */
3360 p->sentinel = Qnil;
3361 record_unwind_protect (exec_sentinel_unwind, Fcons (proc, sentinel));
3362 /* Inhibit quit so that random quits don't screw up a running filter. */
3363 specbind (Qinhibit_quit, Qt);
6545aada 3364 specbind (Qlast_nonmenu_event, Qt);
3b9a3dfa 3365
7074fde6 3366 running_asynch_code = 1;
3b9a3dfa
RS
3367 internal_condition_case_1 (read_process_output_call,
3368 Fcons (sentinel,
3369 Fcons (proc, Fcons (reason, Qnil))),
3370 !NILP (Vdebug_on_error) ? Qnil : Qerror,
3371 exec_sentinel_error_handler);
7074fde6
FP
3372 running_asynch_code = 0;
3373 restore_match_data ();
8fb3cf64
KH
3374
3375 Vdeactivate_mark = odeactivate;
dfc21838
RS
3376 if (! EQ (Fcurrent_buffer (), obuffer)
3377 || ! EQ (current_buffer->keymap, okeymap))
8fb3cf64
KH
3378 record_asynch_buffer_change ();
3379
8b4d685f
RS
3380 if (waiting_for_user_input_p)
3381 prepare_menu_bars ();
2ea6d561 3382 unbind_to (count, Qnil);
d0d6b7c5
JB
3383}
3384
3385/* Report all recent events of a change in process status
3386 (either run the sentinel or output a message).
3387 This is done while Emacs is waiting for keyboard input. */
3388
3389status_notify ()
3390{
3391 register Lisp_Object proc, buffer;
2e4149a8 3392 Lisp_Object tail, msg;
d0d6b7c5 3393 struct gcpro gcpro1, gcpro2;
bf351cc2 3394 Lisp_Object old_process_alist;
d0d6b7c5 3395
2e4149a8
KH
3396 tail = Qnil;
3397 msg = Qnil;
d0d6b7c5
JB
3398 /* We need to gcpro tail; if read_process_output calls a filter
3399 which deletes a process and removes the cons to which tail points
3400 from Vprocess_alist, and then causes a GC, tail is an unprotected
3401 reference. */
3402 GCPRO2 (tail, msg);
3403
bf351cc2 3404 do
d0d6b7c5 3405 {
bf351cc2
KH
3406 old_process_alist = Vprocess_alist;
3407 for (tail = Vprocess_alist; !NILP (tail); tail = Fcdr (tail))
d0d6b7c5 3408 {
bf351cc2
KH
3409 Lisp_Object symbol;
3410 register struct Lisp_Process *p;
d0d6b7c5 3411
bf351cc2
KH
3412 proc = Fcdr (Fcar (tail));
3413 p = XPROCESS (proc);
d0d6b7c5 3414
bf351cc2
KH
3415 if (XINT (p->tick) != XINT (p->update_tick))
3416 {
3417 XSETINT (p->update_tick, XINT (p->tick));
d0d6b7c5 3418
bf351cc2
KH
3419 /* If process is still active, read any output that remains. */
3420 if (XINT (p->infd) >= 0)
3421 while (! EQ (p->filter, Qt)
3422 && read_process_output (proc, XINT (p->infd)) > 0);
d0d6b7c5 3423
bf351cc2 3424 buffer = p->buffer;
d0d6b7c5 3425
bf351cc2
KH
3426 /* Get the text to use for the message. */
3427 if (!NILP (p->raw_status_low))
3428 update_status (p);
3429 msg = status_message (p->status);
d0d6b7c5 3430
bf351cc2
KH
3431 /* If process is terminated, deactivate it or delete it. */
3432 symbol = p->status;
3433 if (CONSP (p->status))
3434 symbol = XCONS (p->status)->car;
2e4149a8 3435
bf351cc2
KH
3436 if (EQ (symbol, Qsignal) || EQ (symbol, Qexit)
3437 || EQ (symbol, Qclosed))
3438 {
3439 if (delete_exited_processes)
3440 remove_process (proc);
3441 else
3442 deactivate_process (proc);
3443 }
d0d6b7c5 3444
bf351cc2
KH
3445 /* Now output the message suitably. */
3446 if (!NILP (p->sentinel))
3447 exec_sentinel (proc, msg);
3448 /* Don't bother with a message in the buffer
3449 when a process becomes runnable. */
3450 else if (!EQ (symbol, Qrun) && !NILP (buffer))
3451 {
3452 Lisp_Object ro, tem;
3453 struct buffer *old = current_buffer;
3454 int opoint;
3455
3456 ro = XBUFFER (buffer)->read_only;
3457
3458 /* Avoid error if buffer is deleted
3459 (probably that's why the process is dead, too) */
3460 if (NILP (XBUFFER (buffer)->name))
3461 continue;
3462 Fset_buffer (buffer);
3463 opoint = point;
3464 /* Insert new output into buffer
3465 at the current end-of-output marker,
3466 thus preserving logical ordering of input and output. */
3467 if (XMARKER (p->mark)->buffer)
3468 SET_PT (marker_position (p->mark));
3469 else
3470 SET_PT (ZV);
3471 if (point <= opoint)
3472 opoint += XSTRING (msg)->size + XSTRING (p->name)->size + 10;
3473
3474 tem = current_buffer->read_only;
3475 current_buffer->read_only = Qnil;
3476 insert_string ("\nProcess ");
3477 Finsert (1, &p->name);
3478 insert_string (" ");
3479 Finsert (1, &msg);
3480 current_buffer->read_only = tem;
3481 Fset_marker (p->mark, make_number (point), p->buffer);
3482
3483 SET_PT (opoint);
3484 set_buffer_internal (old);
3485 }
d0d6b7c5 3486 }
bf351cc2
KH
3487 } /* end for */
3488 } while (! EQ (old_process_alist, Vprocess_alist));
d0d6b7c5
JB
3489
3490 update_mode_lines++; /* in case buffers use %s in mode-line-format */
3491 redisplay_preserve_echo_area ();
3492
3493 update_tick = process_tick;
3494
3495 UNGCPRO;
3496}
3497\f
a69281ff
RS
3498/* The first time this is called, assume keyboard input comes from DESC
3499 instead of from where we used to expect it.
3500 Subsequent calls mean assume input keyboard can come from DESC
3501 in addition to other places. */
3502
3503static int add_keyboard_wait_descriptor_called_flag;
3504
3505void
3506add_keyboard_wait_descriptor (desc)
3507 int desc;
3508{
3509 if (! add_keyboard_wait_descriptor_called_flag)
3510 FD_CLR (0, &input_wait_mask);
3511 add_keyboard_wait_descriptor_called_flag = 1;
3512 FD_SET (desc, &input_wait_mask);
3513 if (desc > max_keyboard_desc)
3514 max_keyboard_desc = desc;
3515}
3516
3517/* From now on, do not expect DESC to give keyboard input. */
3518
3519void
3520delete_keyboard_wait_descriptor (desc)
3521 int desc;
3522{
3523 int fd;
3524 int lim = max_keyboard_desc;
3525
3526 FD_CLR (desc, &input_wait_mask);
3527
3528 if (desc == max_keyboard_desc)
3529 for (fd = 0; fd < lim; fd++)
3530 if (FD_ISSET (fd, &input_wait_mask)
3531 && !FD_ISSET (fd, &non_keyboard_wait_mask))
3532 max_keyboard_desc = fd;
3533}
3534
3535/* Return nonzero if *MASK has a bit set
3536 that corresponds to one of the keyboard input descriptors. */
3537
3538int
3539keyboard_bit_set (mask)
3540 SELECT_TYPE *mask;
3541{
3542 int fd;
3543
3544 for (fd = 0; fd < max_keyboard_desc; fd++)
3545 if (FD_ISSET (fd, mask) && FD_ISSET (fd, &input_wait_mask)
3546 && !FD_ISSET (fd, &non_keyboard_wait_mask))
3547 return 1;
3548
3549 return 0;
3550}
3551\f
d0d6b7c5
JB
3552init_process ()
3553{
3554 register int i;
3555
3556#ifdef SIGCHLD
3557#ifndef CANNOT_DUMP
3558 if (! noninteractive || initialized)
3559#endif
3560 signal (SIGCHLD, sigchld_handler);
3561#endif
3562
3563 FD_ZERO (&input_wait_mask);
a69281ff 3564 FD_ZERO (&non_keyboard_wait_mask);
7d0e672e 3565 max_process_desc = 0;
dd2281ae 3566
a69281ff 3567 FD_SET (0, &input_wait_mask);
dd2281ae 3568
d0d6b7c5
JB
3569 Vprocess_alist = Qnil;
3570 for (i = 0; i < MAXDESC; i++)
3571 {
3572 chan_process[i] = Qnil;
3573 proc_buffered_char[i] = -1;
3574 }
3575}
312c9964 3576
d0d6b7c5
JB
3577syms_of_process ()
3578{
d0d6b7c5
JB
3579#ifdef HAVE_SOCKETS
3580 stream_process = intern ("stream");
3581#endif
3582 Qprocessp = intern ("processp");
3583 staticpro (&Qprocessp);
3584 Qrun = intern ("run");
3585 staticpro (&Qrun);
3586 Qstop = intern ("stop");
3587 staticpro (&Qstop);
3588 Qsignal = intern ("signal");
3589 staticpro (&Qsignal);
3590
3591 /* Qexit is already staticpro'd by syms_of_eval; don't staticpro it
3592 here again.
3593
3594 Qexit = intern ("exit");
3595 staticpro (&Qexit); */
3596
3597 Qopen = intern ("open");
3598 staticpro (&Qopen);
3599 Qclosed = intern ("closed");
3600 staticpro (&Qclosed);
3601
6545aada
RS
3602 Qlast_nonmenu_event = intern ("last-nonmenu-event");
3603 staticpro (&Qlast_nonmenu_event);
3604
d0d6b7c5
JB
3605 staticpro (&Vprocess_alist);
3606
3607 DEFVAR_BOOL ("delete-exited-processes", &delete_exited_processes,
3608 "*Non-nil means delete processes immediately when they exit.\n\
3609nil means don't delete them until `list-processes' is run.");
3610
3611 delete_exited_processes = 1;
3612
3613 DEFVAR_LISP ("process-connection-type", &Vprocess_connection_type,
3614 "Control type of device used to communicate with subprocesses.\n\
e333e864
RS
3615Values are nil to use a pipe, or t or `pty' to use a pty.\n\
3616The value has no effect if the system has no ptys or if all ptys are busy:\n\
3617then a pipe is used in any case.\n\
3618The value takes effect when `start-process' is called.");
d0d6b7c5
JB
3619 Vprocess_connection_type = Qt;
3620
3621 defsubr (&Sprocessp);
3622 defsubr (&Sget_process);
3623 defsubr (&Sget_buffer_process);
3624 defsubr (&Sdelete_process);
3625 defsubr (&Sprocess_status);
3626 defsubr (&Sprocess_exit_status);
3627 defsubr (&Sprocess_id);
3628 defsubr (&Sprocess_name);
3b9a3dfa 3629 defsubr (&Sprocess_tty_name);
d0d6b7c5
JB
3630 defsubr (&Sprocess_command);
3631 defsubr (&Sset_process_buffer);
3632 defsubr (&Sprocess_buffer);
3633 defsubr (&Sprocess_mark);
3634 defsubr (&Sset_process_filter);
3635 defsubr (&Sprocess_filter);
3636 defsubr (&Sset_process_sentinel);
396df322 3637 defsubr (&Sset_process_window_size);
d0d6b7c5
JB
3638 defsubr (&Sprocess_sentinel);
3639 defsubr (&Sprocess_kill_without_query);
3640 defsubr (&Slist_processes);
3641 defsubr (&Sprocess_list);
3642 defsubr (&Sstart_process);
3643#ifdef HAVE_SOCKETS
3644 defsubr (&Sopen_network_stream);
3645#endif /* HAVE_SOCKETS */
3646 defsubr (&Saccept_process_output);
3647 defsubr (&Sprocess_send_region);
3648 defsubr (&Sprocess_send_string);
3649 defsubr (&Sinterrupt_process);
3650 defsubr (&Skill_process);
3651 defsubr (&Squit_process);
3652 defsubr (&Sstop_process);
3653 defsubr (&Scontinue_process);
3654 defsubr (&Sprocess_send_eof);
3655 defsubr (&Ssignal_process);
3656 defsubr (&Swaiting_for_user_input_p);
3657/* defsubr (&Sprocess_connection); */
3658}
3659
6720a7fb
JB
3660\f
3661#else /* not subprocesses */
3662
3663#include <sys/types.h>
3664#include <errno.h>
3665
3666#include "lisp.h"
3667#include "systime.h"
3668#include "termopts.h"
3669
ff11dfa1 3670extern int frame_garbaged;
6720a7fb
JB
3671
3672
3673/* As described above, except assuming that there are no subprocesses:
3674
3675 Wait for timeout to elapse and/or keyboard input to be available.
3676
3677 time_limit is:
3678 timeout in seconds, or
3679 zero for no limit, or
3680 -1 means gobble data immediately available but don't wait for any.
3681
f76475ad 3682 read_kbd is a Lisp_Object:
6720a7fb
JB
3683 0 to ignore keyboard input, or
3684 1 to return when input is available, or
3685 -1 means caller will actually read the input, so don't throw to
3686 the quit handler.
3687 We know that read_kbd will never be a Lisp_Process, since
3688 `subprocesses' isn't defined.
3689
3690 do_display != 0 means redisplay should be done to show subprocess
5164ee8e 3691 output that arrives.
6720a7fb 3692
eb8c3be9 3693 Return true iff we received input from any process. */
6720a7fb
JB
3694
3695int
3696wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
f76475ad
JB
3697 int time_limit, microsecs;
3698 Lisp_Object read_kbd;
3699 int do_display;
6720a7fb
JB
3700{
3701 EMACS_TIME end_time, timeout, *timeout_p;
3702 int waitchannels;
3703
3704 /* What does time_limit really mean? */
3705 if (time_limit || microsecs)
3706 {
3707 /* It's not infinite. */
3708 timeout_p = &timeout;
3709
3710 if (time_limit == -1)
3711 /* In fact, it's zero. */
3712 EMACS_SET_SECS_USECS (timeout, 0, 0);
3713 else
3714 EMACS_SET_SECS_USECS (timeout, time_limit, microsecs);
3715
3716 /* How far in the future is that? */
3717 EMACS_GET_TIME (end_time);
3718 EMACS_ADD_TIME (end_time, end_time, timeout);
3719 }
3720 else
3721 /* It's infinite. */
3722 timeout_p = 0;
3723
99e3d726
RS
3724 /* This must come before stop_polling. */
3725 prepare_menu_bars ();
3726
6720a7fb
JB
3727 /* Turn off periodic alarms (in case they are in use)
3728 because the select emulator uses alarms. */
3729 stop_polling ();
3730
3731 for (;;)
3732 {
3733 int nfds;
3734
f76475ad 3735 waitchannels = XINT (read_kbd) ? 1 : 0;
6720a7fb
JB
3736
3737 /* If calling from keyboard input, do not quit
3738 since we want to return C-g as an input character.
3739 Otherwise, do pending quit if requested. */
f76475ad 3740 if (XINT (read_kbd) >= 0)
6720a7fb
JB
3741 QUIT;
3742
3743 if (timeout_p)
3744 {
3745 EMACS_GET_TIME (*timeout_p);
3746 EMACS_SUB_TIME (*timeout_p, end_time, *timeout_p);
3747 if (EMACS_TIME_NEG_P (*timeout_p))
3748 break;
3749 }
3750
3751 /* Cause C-g and alarm signals to take immediate action,
3752 and cause input available signals to zero out timeout. */
f76475ad 3753 if (XINT (read_kbd) < 0)
6720a7fb
JB
3754 set_waiting_for_input (&timeout);
3755
ff11dfa1 3756 /* If a frame has been newly mapped and needs updating,
6720a7fb 3757 reprocess its display stuff. */
5164ee8e 3758 if (frame_garbaged && do_display)
6720a7fb
JB
3759 redisplay_preserve_echo_area ();
3760
f76475ad 3761 if (XINT (read_kbd) && detect_input_pending ())
6720a7fb
JB
3762 nfds = 0;
3763 else
ecd1f654
KH
3764 nfds = select (1, &waitchannels, (SELECT_TYPE *)0, (SELECT_TYPE *)0,
3765 timeout_p);
6720a7fb
JB
3766
3767 /* Make C-g and alarm signals set flags again */
3768 clear_waiting_for_input ();
3769
3770 /* If we woke up due to SIGWINCH, actually change size now. */
3771 do_pending_window_change ();
3772
3773 if (nfds == -1)
3774 {
3775 /* If the system call was interrupted, then go around the
3776 loop again. */
3777 if (errno == EINTR)
3778 waitchannels = 0;
3779 }
3780#ifdef sun
3781 else if (nfds > 0 && (waitchannels & 1) && interrupt_input)
3782 /* System sometimes fails to deliver SIGIO. */
3783 kill (getpid (), SIGIO);
3784#endif
7324d660 3785#ifdef SIGIO
f76475ad 3786 if (XINT (read_kbd) && interrupt_input && (waitchannels & 1))
6720a7fb 3787 kill (0, SIGIO);
7324d660 3788#endif
6720a7fb
JB
3789
3790 /* If we have timed out (nfds == 0) or found some input (nfds > 0),
3791 we should exit. */
3792 if (nfds >= 0)
3793 break;
3794 }
3795
a87b802f
JB
3796 start_polling ();
3797
6720a7fb
JB
3798 return 0;
3799}
3800
3801
3802DEFUN ("get-buffer-process", Fget_buffer_process, Sget_buffer_process, 1, 1, 0,
51ab806a 3803 /* Don't confuse make-docfile by having two doc strings for this function.
312c9964
RS
3804 make-docfile does not pay attention to #if, for good reason! */
3805 0)
6720a7fb
JB
3806 (name)
3807 register Lisp_Object name;
3808{
3809 return Qnil;
3810}
3811
3812/* Kill all processes associated with `buffer'.
3813 If `buffer' is nil, kill all processes.
3814 Since we have no subprocesses, this does nothing. */
3815
3816kill_buffer_processes (buffer)
3817 Lisp_Object buffer;
3818{
3819}
3820
3821init_process ()
3822{
3823}
3824
3825syms_of_process ()
3826{
3827 defsubr (&Sget_buffer_process);
3828}
3829
3830\f
3831#endif /* not subprocesses */