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