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