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