comparison src/process.c @ 428:3ecd8885ac67 r21-2-22

Import from CVS: tag r21-2-22
author cvs
date Mon, 13 Aug 2007 11:28:15 +0200
parents
children 8de8e3f6228a
comparison
equal deleted inserted replaced
427:0a0253eac470 428:3ecd8885ac67
1 /* Asynchronous subprocess control for XEmacs.
2 Copyright (C) 1985, 1986, 1987, 1988, 1992, 1993, 1994, 1995
3 Free Software Foundation, Inc.
4 Copyright (C) 1995 Sun Microsystems, Inc.
5 Copyright (C) 1995, 1996 Ben Wing.
6
7 This file is part of XEmacs.
8
9 XEmacs is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2, or (at your option) any
12 later version.
13
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with XEmacs; see the file COPYING. If not, write to
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
23
24 /* This file has been Mule-ized except for `start-process-internal',
25 `open-network-stream-internal' and `open-multicast-group-internal'. */
26
27 /* This file has been split into process.c and process-unix.c by
28 Kirill M. Katsnelson <kkm@kis.ru>, so please bash him and not
29 the original author(s) */
30
31 #include <config.h>
32
33 #if !defined (NO_SUBPROCESSES)
34
35 /* The entire file is within this conditional */
36
37 #include "lisp.h"
38
39 #include "buffer.h"
40 #include "commands.h"
41 #include "events.h"
42 #include "frame.h"
43 #include "hash.h"
44 #include "insdel.h"
45 #include "lstream.h"
46 #include "opaque.h"
47 #include "process.h"
48 #include "procimpl.h"
49 #include "window.h"
50 #ifdef FILE_CODING
51 #include "file-coding.h"
52 #endif
53
54 #include "sysfile.h"
55 #include "sysproc.h"
56 #include "systime.h"
57 #include "syssignal.h" /* Always include before systty.h */
58 #include "systty.h"
59 #include "syswait.h"
60
61 Lisp_Object Qprocessp;
62
63 /* Process methods */
64 struct process_methods the_process_methods;
65
66 /* a process object is a network connection when its pid field a cons
67 (name of name of port we are connected to . foreign host name) */
68
69 /* Valid values of process->status_symbol */
70 Lisp_Object Qrun, Qstop;
71 /* Qrun => Qopen, Qexit => Qclosed for "network connection" processes */
72 Lisp_Object Qopen, Qclosed;
73 /* Protocol families */
74 Lisp_Object Qtcp, Qudp;
75
76 #ifdef HAVE_MULTICAST
77 Lisp_Object Qmulticast; /* Will be used for occasional warnings */
78 #endif
79
80 /* t means use pty, nil means use a pipe,
81 maybe other values to come. */
82 Lisp_Object Vprocess_connection_type;
83
84 /* Read comments to DEFVAR of this */
85 int windowed_process_io;
86
87 #ifdef PROCESS_IO_BLOCKING
88 /* List of port numbers or port names to set a blocking I/O mode.
89 Nil means set a non-blocking I/O mode [default]. */
90 Lisp_Object network_stream_blocking_port_list;
91 #endif /* PROCESS_IO_BLOCKING */
92
93 /* Number of events of change of status of a process. */
94 volatile int process_tick;
95
96 /* Number of events for which the user or sentinel has been notified. */
97 static int update_tick;
98
99 /* Nonzero means delete a process right away if it exits. */
100 int delete_exited_processes;
101
102 /* Hash table which maps USIDs as returned by create_stream_pair_cb to
103 process objects. Processes are not GC-protected through this! */
104 struct hash_table *usid_to_process;
105
106 /* List of process objects. */
107 Lisp_Object Vprocess_list;
108
109 extern Lisp_Object Vlisp_EXEC_SUFFIXES;
110
111
112
113 static Lisp_Object
114 mark_process (Lisp_Object obj)
115 {
116 struct Lisp_Process *proc = XPROCESS (obj);
117 MAYBE_PROCMETH (mark_process_data, (proc));
118 mark_object (proc->name);
119 mark_object (proc->command);
120 mark_object (proc->filter);
121 mark_object (proc->sentinel);
122 mark_object (proc->buffer);
123 mark_object (proc->mark);
124 mark_object (proc->pid);
125 mark_object (proc->pipe_instream);
126 mark_object (proc->pipe_outstream);
127 #ifdef FILE_CODING
128 mark_object (proc->coding_instream);
129 mark_object (proc->coding_outstream);
130 #endif
131 return proc->status_symbol;
132 }
133
134 static void
135 print_process (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
136 {
137 struct Lisp_Process *proc = XPROCESS (obj);
138
139 if (print_readably)
140 error ("printing unreadable object #<process %s>",
141 XSTRING_DATA (proc->name));
142
143 if (!escapeflag)
144 {
145 print_internal (proc->name, printcharfun, 0);
146 }
147 else
148 {
149 int netp = network_connection_p (obj);
150 write_c_string ((netp ? GETTEXT ("#<network connection ") :
151 GETTEXT ("#<process ")), printcharfun);
152 print_internal (proc->name, printcharfun, 1);
153 write_c_string ((netp ? " " : " pid "), printcharfun);
154 print_internal (proc->pid, printcharfun, 1);
155 write_c_string (" state:", printcharfun);
156 print_internal (proc->status_symbol, printcharfun, 1);
157 MAYBE_PROCMETH (print_process_data, (proc, printcharfun));
158 write_c_string (">", printcharfun);
159 }
160 }
161
162 #ifdef HAVE_WINDOW_SYSTEM
163 extern void debug_process_finalization (struct Lisp_Process *p);
164 #endif /* HAVE_WINDOW_SYSTEM */
165
166 static void
167 finalize_process (void *header, int for_disksave)
168 {
169 /* #### this probably needs to be tied into the tty event loop */
170 /* #### when there is one */
171 struct Lisp_Process *p = (struct Lisp_Process *) header;
172 #ifdef HAVE_WINDOW_SYSTEM
173 if (!for_disksave)
174 {
175 debug_process_finalization (p);
176 }
177 #endif /* HAVE_WINDOW_SYSTEM */
178
179 if (p->process_data)
180 {
181 MAYBE_PROCMETH (finalize_process_data, (p, for_disksave));
182 if (!for_disksave)
183 xfree (p->process_data);
184 }
185 }
186
187 DEFINE_LRECORD_IMPLEMENTATION ("process", process,
188 mark_process, print_process, finalize_process,
189 0, 0, 0, struct Lisp_Process);
190
191 /************************************************************************/
192 /* basic process accessors */
193 /************************************************************************/
194
195 /* Under FILE_CODING, this function returns low-level streams, connected
196 directly to the child process, rather than en/decoding FILE_CODING
197 streams */
198 void
199 get_process_streams (struct Lisp_Process *p,
200 Lisp_Object *instr, Lisp_Object *outstr)
201 {
202 assert (p);
203 assert (NILP (p->pipe_instream) || LSTREAMP(p->pipe_instream));
204 assert (NILP (p->pipe_outstream) || LSTREAMP(p->pipe_outstream));
205 *instr = p->pipe_instream;
206 *outstr = p->pipe_outstream;
207 }
208
209 struct Lisp_Process *
210 get_process_from_usid (USID usid)
211 {
212 CONST void *vval;
213
214 assert (usid != USID_ERROR && usid != USID_DONTHASH);
215
216 if (gethash ((CONST void*)usid, usid_to_process, &vval))
217 {
218 Lisp_Object proc;
219 CVOID_TO_LISP (proc, vval);
220 return XPROCESS (proc);
221 }
222 else
223 return 0;
224 }
225
226 int
227 get_process_selected_p (struct Lisp_Process *p)
228 {
229 return p->selected;
230 }
231
232 void
233 set_process_selected_p (struct Lisp_Process *p, int selected_p)
234 {
235 p->selected = !!selected_p;
236 }
237
238 int
239 connected_via_filedesc_p (struct Lisp_Process *p)
240 {
241 return MAYBE_INT_PROCMETH (tooltalk_connection_p, (p));
242 }
243
244 #ifdef HAVE_SOCKETS
245 int
246 network_connection_p (Lisp_Object process)
247 {
248 return CONSP (XPROCESS (process)->pid);
249 }
250 #endif
251
252 DEFUN ("processp", Fprocessp, 1, 1, 0, /*
253 Return t if OBJECT is a process.
254 */
255 (obj))
256 {
257 return PROCESSP (obj) ? Qt : Qnil;
258 }
259
260 DEFUN ("process-list", Fprocess_list, 0, 0, 0, /*
261 Return a list of all processes.
262 */
263 ())
264 {
265 return Fcopy_sequence (Vprocess_list);
266 }
267
268 DEFUN ("get-process", Fget_process, 1, 1, 0, /*
269 Return the process named NAME, or nil if there is none.
270 */
271 (name))
272 {
273 Lisp_Object tail;
274
275 if (PROCESSP (name))
276 return name;
277
278 if (!gc_in_progress)
279 /* this only gets called during GC when emacs is going away as a result
280 of a signal or crash. */
281 CHECK_STRING (name);
282
283 for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail))
284 {
285 Lisp_Object proc = XCAR (tail);
286 QUIT;
287 if (internal_equal (name, XPROCESS (proc)->name, 0))
288 return XCAR (tail);
289 }
290 return Qnil;
291 }
292
293 DEFUN ("get-buffer-process", Fget_buffer_process, 1, 1, 0, /*
294 Return the (or, a) process associated with BUFFER.
295 BUFFER may be a buffer or the name of one.
296 */
297 (name))
298 {
299 Lisp_Object buf, tail, proc;
300
301 if (NILP (name)) return Qnil;
302 buf = Fget_buffer (name);
303 if (NILP (buf)) return Qnil;
304
305 for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail))
306 {
307 /* jwz: do not quit here - it isn't necessary, as there is no way for
308 Vprocess_list to get circular or overwhelmingly long, and this
309 function is called from layout_mode_element under redisplay. */
310 /* QUIT; */
311 proc = XCAR (tail);
312 if (PROCESSP (proc) && EQ (XPROCESS (proc)->buffer, buf))
313 return proc;
314 }
315 return Qnil;
316 }
317
318 /* This is how commands for the user decode process arguments. It
319 accepts a process, a process name, a buffer, a buffer name, or nil.
320 Buffers denote the first process in the buffer, and nil denotes the
321 current buffer. */
322
323 static Lisp_Object
324 get_process (Lisp_Object name)
325 {
326 Lisp_Object proc, obj;
327
328 #ifdef I18N3
329 /* #### Look more closely into translating process names. */
330 #endif
331
332 /* This may be called during a GC from process_send_signal() from
333 kill_buffer_processes() if emacs decides to abort(). */
334 if (PROCESSP (name))
335 return name;
336
337 if (STRINGP (name))
338 {
339 obj = Fget_process (name);
340 if (NILP (obj))
341 obj = Fget_buffer (name);
342 if (NILP (obj))
343 error ("Process %s does not exist", XSTRING_DATA (name));
344 }
345 else if (NILP (name))
346 obj = Fcurrent_buffer ();
347 else
348 obj = name;
349
350 /* Now obj should be either a buffer object or a process object.
351 */
352 if (BUFFERP (obj))
353 {
354 proc = Fget_buffer_process (obj);
355 if (NILP (proc))
356 error ("Buffer %s has no process", XSTRING_DATA (XBUFFER(obj)->name));
357 }
358 else
359 {
360 /* #### This was commented out. Although, simple
361 (kill-process 7 "qqq") resulted in a fatal error. - kkm */
362 CHECK_PROCESS (obj);
363 proc = obj;
364 }
365 return proc;
366 }
367
368 DEFUN ("process-id", Fprocess_id, 1, 1, 0, /*
369 Return the process id of PROCESS.
370 This is the pid of the Unix process which PROCESS uses or talks to.
371 For a network connection, this value is a cons of
372 (foreign-network-port . foreign-host-name).
373 */
374 (proc))
375 {
376 Lisp_Object pid;
377 CHECK_PROCESS (proc);
378
379 pid = XPROCESS (proc)->pid;
380 if (network_connection_p (proc))
381 /* return Qnil; */
382 return Fcons (Fcar (pid), Fcdr (pid));
383 else
384 return pid;
385 }
386
387 DEFUN ("process-name", Fprocess_name, 1, 1, 0, /*
388 Return the name of PROCESS, as a string.
389 This is the name of the program invoked in PROCESS,
390 possibly modified to make it unique among process names.
391 */
392 (proc))
393 {
394 CHECK_PROCESS (proc);
395 return XPROCESS (proc)->name;
396 }
397
398 DEFUN ("process-command", Fprocess_command, 1, 1, 0, /*
399 Return the command that was executed to start PROCESS.
400 This is a list of strings, the first string being the program executed
401 and the rest of the strings being the arguments given to it.
402 */
403 (proc))
404 {
405 CHECK_PROCESS (proc);
406 return XPROCESS (proc)->command;
407 }
408
409
410 /************************************************************************/
411 /* creating a process */
412 /************************************************************************/
413
414 Lisp_Object
415 make_process_internal (Lisp_Object name)
416 {
417 Lisp_Object val, name1;
418 int i;
419 struct Lisp_Process *p =
420 alloc_lcrecord_type (struct Lisp_Process, &lrecord_process);
421
422 /* If name is already in use, modify it until it is unused. */
423 name1 = name;
424 for (i = 1; ; i++)
425 {
426 char suffix[10];
427 Lisp_Object tem = Fget_process (name1);
428 if (NILP (tem))
429 break;
430 sprintf (suffix, "<%d>", i);
431 name1 = concat2 (name, build_string (suffix));
432 }
433 name = name1;
434 p->name = name;
435
436 p->command = Qnil;
437 p->filter = Qnil;
438 p->sentinel = Qnil;
439 p->buffer = Qnil;
440 p->mark = Fmake_marker ();
441 p->pid = Qnil;
442 p->status_symbol = Qrun;
443 p->exit_code = 0;
444 p->core_dumped = 0;
445 p->filter_does_read = 0;
446 p->kill_without_query = 0;
447 p->selected = 0;
448 p->tick = 0;
449 p->update_tick = 0;
450 p->pipe_instream = Qnil;
451 p->pipe_outstream = Qnil;
452 #ifdef FILE_CODING
453 p->coding_instream = Qnil;
454 p->coding_outstream = Qnil;
455 #endif
456
457 p->process_data = 0;
458 MAYBE_PROCMETH (alloc_process_data, (p));
459
460 XSETPROCESS (val, p);
461
462 Vprocess_list = Fcons (val, Vprocess_list);
463 return val;
464 }
465
466 void
467 init_process_io_handles (struct Lisp_Process *p, void* in, void* out, int flags)
468 {
469 USID usid = event_stream_create_stream_pair (in, out,
470 &p->pipe_instream, &p->pipe_outstream,
471 flags);
472
473 if (usid == USID_ERROR)
474 report_file_error ("Setting up communication with subprocess", Qnil);
475
476 if (usid != USID_DONTHASH)
477 {
478 Lisp_Object proc = Qnil;
479 XSETPROCESS (proc, p);
480 puthash ((CONST void*)usid, LISP_TO_VOID (proc), usid_to_process);
481 }
482
483 MAYBE_PROCMETH (init_process_io_handles, (p, in, out, flags));
484
485 #ifdef FILE_CODING
486 p->coding_instream = make_decoding_input_stream
487 (XLSTREAM (p->pipe_instream),
488 Fget_coding_system (Vcoding_system_for_read));
489 Lstream_set_character_mode (XLSTREAM (p->coding_instream));
490 p->coding_outstream = make_encoding_output_stream
491 (XLSTREAM (p->pipe_outstream),
492 Fget_coding_system (Vcoding_system_for_write));
493 /* CODE_CNTL (&out_state[outchannel]) |= CC_END; !!####
494 What's going on here? */
495 #endif /* FILE_CODING */
496 }
497
498 static void
499 create_process (Lisp_Object process, Lisp_Object *argv, int nargv,
500 Lisp_Object program, Lisp_Object cur_dir)
501 {
502 struct Lisp_Process *p = XPROCESS (process);
503 int pid;
504
505 /* *_create_process may change status_symbol, if the process
506 is a kind of "fire-and-forget" (no I/O, unwaitable) */
507 p->status_symbol = Qrun;
508 p->exit_code = 0;
509
510 pid = PROCMETH (create_process, (p, argv, nargv, program, cur_dir));
511
512 p->pid = make_int (pid);
513 if (!NILP(p->pipe_instream))
514 event_stream_select_process (p);
515 }
516
517 /* This function is the unwind_protect form for Fstart_process_internal. If
518 PROC doesn't have its pid set, then we know someone has signalled
519 an error and the process wasn't started successfully, so we should
520 remove it from the process list. */
521 static void remove_process (Lisp_Object proc);
522 static Lisp_Object
523 start_process_unwind (Lisp_Object proc)
524 {
525 /* Was PROC started successfully? */
526 if (EQ (XPROCESS (proc)->pid, Qnil))
527 remove_process (proc);
528 return Qnil;
529 }
530
531 DEFUN ("start-process-internal", Fstart_process_internal, 3, MANY, 0, /*
532 Start a program in a subprocess. Return the process object for it.
533 Args are NAME BUFFER PROGRAM &rest PROGRAM-ARGS
534 NAME is name for process. It is modified if necessary to make it unique.
535 BUFFER is the buffer or (buffer-name) to associate with the process.
536 Process output goes at end of that buffer, unless you specify
537 an output stream or filter function to handle the output.
538 BUFFER may be also nil, meaning that this process is not associated
539 with any buffer
540 Third arg is program file name. It is searched for as in the shell.
541 Remaining arguments are strings to give program as arguments.
542 INCODE and OUTCODE specify the coding-system objects used in input/output
543 from/to the process.
544 */
545 (int nargs, Lisp_Object *args))
546 {
547 /* This function can call lisp */
548 /* !!#### This function has not been Mule-ized */
549 Lisp_Object buffer, name, program, proc, current_dir;
550 Lisp_Object tem;
551 int speccount = specpdl_depth ();
552 struct gcpro gcpro1, gcpro2, gcpro3;
553
554 name = args[0];
555 buffer = args[1];
556 program = args[2];
557 current_dir = Qnil;
558
559 /* Protect against various file handlers doing GCs below. */
560 GCPRO3 (buffer, program, current_dir);
561
562 if (!NILP (buffer))
563 buffer = Fget_buffer_create (buffer);
564
565 CHECK_STRING (name);
566 CHECK_STRING (program);
567
568 /* Make sure that the child will be able to chdir to the current
569 buffer's current directory, or its unhandled equivalent. We
570 can't just have the child check for an error when it does the
571 chdir, since it's in a vfork.
572
573 Note: these assignments and calls are like this in order to insure
574 "caller protects args" GC semantics. */
575 current_dir = current_buffer->directory;
576 current_dir = Funhandled_file_name_directory (current_dir);
577 current_dir = expand_and_dir_to_file (current_dir, Qnil);
578
579 #if 0 /* This loser breaks ange-ftp */
580 /* dmoore - if you re-enable this code, you have to gcprotect
581 current_buffer through the above calls. */
582 if (NILP (Ffile_accessible_directory_p (current_dir)))
583 report_file_error ("Setting current directory",
584 list1 (current_buffer->directory));
585 #endif /* 0 */
586
587 /* If program file name is not absolute, search our path for it */
588 if (!IS_DIRECTORY_SEP (XSTRING_BYTE (program, 0))
589 && !(XSTRING_LENGTH (program) > 1
590 && IS_DEVICE_SEP (XSTRING_BYTE (program, 1))))
591 {
592 struct gcpro ngcpro1;
593
594 tem = Qnil;
595 NGCPRO1 (tem);
596 locate_file (Vexec_path, program, Vlisp_EXEC_SUFFIXES, &tem, X_OK);
597 if (NILP (tem))
598 report_file_error ("Searching for program", list1 (program));
599 program = Fexpand_file_name (tem, Qnil);
600 NUNGCPRO;
601 }
602 else
603 {
604 if (!NILP (Ffile_directory_p (program)))
605 error ("Specified program for new process is a directory");
606 }
607
608 proc = make_process_internal (name);
609
610 XPROCESS (proc)->buffer = buffer;
611 XPROCESS (proc)->command = Flist (nargs - 2,
612 args + 2);
613
614 /* Make the process marker point into the process buffer (if any). */
615 if (!NILP (buffer))
616 Fset_marker (XPROCESS (proc)->mark,
617 make_int (BUF_ZV (XBUFFER (buffer))), buffer);
618
619 /* If an error occurs and we can't start the process, we want to
620 remove it from the process list. This means that each error
621 check in create_process doesn't need to call remove_process
622 itself; it's all taken care of here. */
623 record_unwind_protect (start_process_unwind, proc);
624
625 create_process (proc, args + 3, nargs - 3, program, current_dir);
626
627 UNGCPRO;
628 return unbind_to (speccount, proc);
629 }
630
631
632 #ifdef HAVE_SOCKETS
633
634
635 /* #### The network support is fairly synthetical. What we actually
636 need is a single function, which supports all datagram, stream and
637 packet stream connections, arbitrary protocol families should they
638 be supported by the target system, multicast groups, in both data
639 and control rooted/nonrooted flavors, service quality etc whatever
640 is supported by the underlying network.
641
642 It must accept a property list describing the connection. The current
643 functions must then go to lisp and provide a suitable list for the
644 generalized connection function.
645
646 Both UNIX and Win32 support BSD sockets, and there are many extensions
647 available (Sockets 2 spec).
648
649 A todo is define a consistent set of properties abstracting a
650 network connection. -kkm
651 */
652
653
654 /* open a TCP network connection to a given HOST/SERVICE. Treated
655 exactly like a normal process when reading and writing. Only
656 differences are in status display and process deletion. A network
657 connection has no PID; you cannot signal it. All you can do is
658 deactivate and close it via delete-process */
659
660 DEFUN ("open-network-stream-internal", Fopen_network_stream_internal, 4, 5, 0, /*
661 Open a TCP connection for a service to a host.
662 Return a subprocess-object to represent the connection.
663 Input and output work as for subprocesses; `delete-process' closes it.
664
665 NAME is name for process. It is modified if necessary to make it unique.
666 BUFFER is the buffer (or buffer-name) to associate with the process.
667 Process output goes at end of that buffer, unless you specify
668 an output stream or filter function to handle the output.
669 BUFFER may also be nil, meaning that this process is not associated
670 with any buffer.
671 Third arg is name of the host to connect to, or its IP address.
672 Fourth arg SERVICE is name of the service desired, or an integer
673 specifying a port number to connect to.
674 Fifth argument PROTOCOL is a network protocol. Currently 'tcp
675 (Transmission Control Protocol) and 'udp (User Datagram Protocol) are
676 supported. When omitted, 'tcp is assumed.
677
678 Ouput via `process-send-string' and input via buffer or filter (see
679 `set-process-filter') are stream-oriented. That means UDP datagrams are
680 not guaranteed to be sent and received in discrete packets. (But small
681 datagrams around 500 bytes that are not truncated by `process-send-string'
682 are usually fine.) Note further that UDP protocol does not guard against
683 lost packets.
684 */
685 (name, buffer, host, service, protocol))
686 {
687 /* !!#### This function has not been Mule-ized */
688 /* This function can GC */
689 Lisp_Object proc = Qnil;
690 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5, ngcpro1;
691 void *inch, *outch;
692
693 GCPRO5 (name, buffer, host, service, protocol);
694 CHECK_STRING (name);
695
696 if (NILP(protocol))
697 protocol = Qtcp;
698 else
699 CHECK_SYMBOL (protocol);
700
701 /* Since this code is inside HAVE_SOCKETS, existence of
702 open_network_stream is mandatory */
703 PROCMETH (open_network_stream, (name, host, service, protocol,
704 &inch, &outch));
705
706 if (!NILP (buffer))
707 buffer = Fget_buffer_create (buffer);
708 proc = make_process_internal (name);
709 NGCPRO1 (proc);
710
711 XPROCESS (proc)->pid = Fcons (service, host);
712 XPROCESS (proc)->buffer = buffer;
713 init_process_io_handles (XPROCESS (proc), (void*)inch, (void*)outch,
714 STREAM_NETWORK_CONNECTION);
715
716 event_stream_select_process (XPROCESS (proc));
717
718 UNGCPRO;
719 NUNGCPRO;
720 return proc;
721 }
722
723 #ifdef HAVE_MULTICAST
724
725 DEFUN ("open-multicast-group-internal", Fopen_multicast_group_internal, 5, 5, 0, /*
726 Open a multicast connection on the specified dest/port/ttl.
727 Return a subprocess-object to represent the connection.
728 Input and output work as for subprocesses; `delete-process' closes it.
729
730 NAME is name for process. It is modified if necessary to make it unique.
731 BUFFER is the buffer (or buffer-name) to associate with the process.
732 Process output goes at end of that buffer, unless you specify
733 an output stream or filter function to handle the output.
734 BUFFER may also be nil, meaning that this process is not associated
735 with any buffer.
736 Third, fourth and fifth args are the multicast destination group, port and ttl.
737 dest must be an internet address between 224.0.0.0 and 239.255.255.255
738 port is a communication port like in traditional unicast
739 ttl is the time-to-live (15 for site, 63 for region and 127 for world)
740 */
741 (name, buffer, dest, port, ttl))
742 {
743 /* !!#### This function has not been Mule-ized */
744 /* This function can GC */
745 Lisp_Object proc = Qnil;
746 struct gcpro gcpro1;
747 void *inch, *outch;
748
749 CHECK_STRING (name);
750
751 /* Since this code is inside HAVE_MULTICAST, existence of
752 open_network_stream is mandatory */
753 PROCMETH (open_multicast_group, (name, dest, port, ttl,
754 &inch, &outch));
755
756 if (!NILP (buffer))
757 buffer = Fget_buffer_create (buffer);
758
759 proc = make_process_internal (name);
760 GCPRO1 (proc);
761
762 XPROCESS (proc)->pid = Fcons (port, dest);
763 XPROCESS (proc)->buffer = buffer;
764 init_process_io_handles (XPROCESS (proc), (void*)inch, (void*)outch,
765 STREAM_NETWORK_CONNECTION);
766
767 event_stream_select_process (XPROCESS (proc));
768
769 UNGCPRO;
770 return proc;
771 }
772 #endif /* HAVE_MULTICAST */
773
774 #endif /* HAVE_SOCKETS */
775
776 Lisp_Object
777 canonicalize_host_name (Lisp_Object host)
778 {
779 return PROCMETH_OR_GIVEN (canonicalize_host_name, (host), host);
780 }
781
782
783 DEFUN ("set-process-window-size", Fset_process_window_size, 3, 3, 0, /*
784 Tell PROCESS that it has logical window size HEIGHT and WIDTH.
785 */
786 (proc, height, width))
787 {
788 CHECK_PROCESS (proc);
789 CHECK_NATNUM (height);
790 CHECK_NATNUM (width);
791 return
792 MAYBE_INT_PROCMETH (set_window_size, (XPROCESS (proc), XINT (height), XINT (width))) <= 0
793 ? Qnil : Qt;
794 }
795
796
797 /************************************************************************/
798 /* Process I/O */
799 /************************************************************************/
800
801 /* Read pending output from the process channel,
802 starting with our buffered-ahead character if we have one.
803 Yield number of characters read.
804
805 This function reads at most 1024 bytes.
806 If you want to read all available subprocess output,
807 you must call it repeatedly until it returns zero. */
808
809 Charcount
810 read_process_output (Lisp_Object proc)
811 {
812 /* This function can GC */
813 Bytecount nbytes, nchars;
814 Bufbyte chars[1024];
815 Lisp_Object outstream;
816 struct Lisp_Process *p = XPROCESS (proc);
817
818 /* If there is a lot of output from the subprocess, the loop in
819 execute_internal_event() might call read_process_output() more
820 than once. If the filter that was executed from one of these
821 calls set the filter to t, we have to stop now. Return -1 rather
822 than 0 so execute_internal_event() doesn't close the process.
823 Really, the loop in execute_internal_event() should check itself
824 for a process-filter change, like in status_notify(); but the
825 struct Lisp_Process is not exported outside of this file. */
826 if (NILP(p->pipe_instream))
827 return -1; /* already closed */
828
829 if (!NILP (p->filter) && (p->filter_does_read))
830 {
831 Lisp_Object filter_result;
832
833 /* Some weird FSFmacs crap here with
834 Vdeactivate_mark and current_buffer->keymap */
835 running_asynch_code = 1;
836 filter_result = call2_trapping_errors ("Error in process filter",
837 p->filter, proc, Qnil);
838 running_asynch_code = 0;
839 restore_match_data ();
840 CHECK_INT (filter_result);
841 return XINT (filter_result);
842 }
843
844 nbytes = Lstream_read (XLSTREAM (DATA_INSTREAM(p)), chars, sizeof (chars));
845 if (nbytes <= 0) return nbytes;
846
847 nchars = bytecount_to_charcount (chars, nbytes);
848 outstream = p->filter;
849 if (!NILP (outstream))
850 {
851 /* We used to bind inhibit-quit to t here, but
852 call2_trapping_errors() does that for us. */
853 running_asynch_code = 1;
854 call2_trapping_errors ("Error in process filter",
855 outstream, proc, make_string (chars, nbytes));
856 running_asynch_code = 0;
857 restore_match_data ();
858 return nchars;
859 }
860
861 /* If no filter, write into buffer if it isn't dead. */
862 if (!NILP (p->buffer) && BUFFER_LIVE_P (XBUFFER (p->buffer)))
863 {
864 Lisp_Object old_read_only = Qnil;
865 Bufpos old_point;
866 Bufpos old_begv;
867 Bufpos old_zv;
868 int old_zmacs_region_stays = zmacs_region_stays;
869 struct gcpro gcpro1, gcpro2;
870 struct buffer *buf = XBUFFER (p->buffer);
871
872 GCPRO2 (proc, old_read_only);
873
874 old_point = BUF_PT (buf);
875 old_begv = BUF_BEGV (buf);
876 old_zv = BUF_ZV (buf);
877 old_read_only = buf->read_only;
878 buf->read_only = Qnil;
879
880 /* Insert new output into buffer
881 at the current end-of-output marker,
882 thus preserving logical ordering of input and output. */
883 if (XMARKER (p->mark)->buffer)
884 BUF_SET_PT (buf,
885 bufpos_clip_to_bounds (old_begv, marker_position (p->mark),
886 old_zv));
887 else
888 BUF_SET_PT (buf, old_zv);
889
890 /* If the output marker is outside of the visible region, save
891 the restriction and widen. */
892 if (! (BUF_BEGV (buf) <= BUF_PT (buf) &&
893 BUF_PT (buf) <= BUF_ZV (buf)))
894 Fwiden (p->buffer);
895
896 /* Make sure opoint floats ahead of any new text, just as point
897 would. */
898 if (BUF_PT (buf) <= old_point)
899 old_point += nchars;
900
901 /* Insert after old_begv, but before old_zv. */
902 if (BUF_PT (buf) < old_begv)
903 old_begv += nchars;
904 if (BUF_PT (buf) <= old_zv)
905 old_zv += nchars;
906
907 #if 0
908 /* This screws up initial display of the window. jla */
909
910 /* Insert before markers in case we are inserting where
911 the buffer's mark is, and the user's next command is Meta-y. */
912 buffer_insert_raw_string_1 (buf, -1, chars,
913 nbytes, INSDEL_BEFORE_MARKERS);
914 #else
915 buffer_insert_raw_string (buf, chars, nbytes);
916 #endif
917
918 Fset_marker (p->mark, make_int (BUF_PT (buf)), p->buffer);
919
920 MARK_MODELINE_CHANGED;
921
922 /* If the restriction isn't what it should be, set it. */
923 if (old_begv != BUF_BEGV (buf) || old_zv != BUF_ZV (buf))
924 {
925 Fwiden(p->buffer);
926 old_begv = bufpos_clip_to_bounds (BUF_BEG (buf),
927 old_begv,
928 BUF_Z (buf));
929 old_zv = bufpos_clip_to_bounds (BUF_BEG (buf),
930 old_zv,
931 BUF_Z (buf));
932 Fnarrow_to_region (make_int (old_begv), make_int (old_zv),
933 p->buffer);
934 }
935
936 /* Handling the process output should not deactivate the mark. */
937 zmacs_region_stays = old_zmacs_region_stays;
938 buf->read_only = old_read_only;
939 old_point = bufpos_clip_to_bounds (BUF_BEGV (buf),
940 old_point,
941 BUF_ZV (buf));
942 BUF_SET_PT (buf, old_point);
943
944 UNGCPRO;
945 }
946 return nchars;
947 }
948
949 /* Sending data to subprocess */
950
951 /* send some data to process PROC. If NONRELOCATABLE is non-NULL, it
952 specifies the address of the data. Otherwise, the data comes from the
953 object RELOCATABLE (either a string or a buffer). START and LEN
954 specify the offset and length of the data to send.
955
956 Note that START and LEN are in Bufpos's if RELOCATABLE is a buffer,
957 and in Bytecounts otherwise. */
958
959 void
960 send_process (Lisp_Object proc,
961 Lisp_Object relocatable, CONST Bufbyte *nonrelocatable,
962 int start, int len)
963 {
964 /* This function can GC */
965 struct gcpro gcpro1, gcpro2;
966 Lisp_Object lstream = Qnil;
967
968 GCPRO2 (proc, lstream);
969
970 if (NILP (DATA_OUTSTREAM (XPROCESS (proc))))
971 signal_simple_error ("Process not open for writing", proc);
972
973 if (nonrelocatable)
974 lstream =
975 make_fixed_buffer_input_stream (nonrelocatable + start, len);
976 else if (BUFFERP (relocatable))
977 lstream = make_lisp_buffer_input_stream (XBUFFER (relocatable),
978 start, start + len, 0);
979 else
980 lstream = make_lisp_string_input_stream (relocatable, start, len);
981
982 PROCMETH (send_process, (proc, XLSTREAM (lstream)));
983
984 UNGCPRO;
985 Lstream_delete (XLSTREAM (lstream));
986 }
987
988 DEFUN ("process-tty-name", Fprocess_tty_name, 1, 1, 0, /*
989 Return the name of the terminal PROCESS uses, or nil if none.
990 This is the terminal that the process itself reads and writes on,
991 not the name of the pty that Emacs uses to talk with that terminal.
992 */
993 (proc))
994 {
995 CHECK_PROCESS (proc);
996 return MAYBE_LISP_PROCMETH (get_tty_name, (XPROCESS (proc)));
997 }
998
999 DEFUN ("set-process-buffer", Fset_process_buffer, 2, 2, 0, /*
1000 Set buffer associated with PROCESS to BUFFER (a buffer, or nil).
1001 */
1002 (proc, buffer))
1003 {
1004 CHECK_PROCESS (proc);
1005 if (!NILP (buffer))
1006 CHECK_BUFFER (buffer);
1007 XPROCESS (proc)->buffer = buffer;
1008 return buffer;
1009 }
1010
1011 DEFUN ("process-buffer", Fprocess_buffer, 1, 1, 0, /*
1012 Return the buffer PROCESS is associated with.
1013 Output from PROCESS is inserted in this buffer
1014 unless PROCESS has a filter.
1015 */
1016 (proc))
1017 {
1018 CHECK_PROCESS (proc);
1019 return XPROCESS (proc)->buffer;
1020 }
1021
1022 DEFUN ("process-mark", Fprocess_mark, 1, 1, 0, /*
1023 Return the marker for the end of the last output from PROCESS.
1024 */
1025 (proc))
1026 {
1027 CHECK_PROCESS (proc);
1028 return XPROCESS (proc)->mark;
1029 }
1030
1031 void
1032 set_process_filter (Lisp_Object proc, Lisp_Object filter, int filter_does_read)
1033 {
1034 CHECK_PROCESS (proc);
1035 if (PROCESS_LIVE_P (proc)) {
1036 if (EQ (filter, Qt))
1037 event_stream_unselect_process (XPROCESS (proc));
1038 else
1039 event_stream_select_process (XPROCESS (proc));
1040 }
1041
1042 XPROCESS (proc)->filter = filter;
1043 XPROCESS (proc)->filter_does_read = filter_does_read;
1044 }
1045
1046 DEFUN ("set-process-filter", Fset_process_filter, 2, 2, 0, /*
1047 Give PROCESS the filter function FILTER; nil means no filter.
1048 t means stop accepting output from the process.
1049 When a process has a filter, each time it does output
1050 the entire string of output is passed to the filter.
1051 The filter gets two arguments: the process and the string of output.
1052 If the process has a filter, its buffer is not used for output.
1053 */
1054 (proc, filter))
1055 {
1056 set_process_filter (proc, filter, 0);
1057 return filter;
1058 }
1059
1060 DEFUN ("process-filter", Fprocess_filter, 1, 1, 0, /*
1061 Return the filter function of PROCESS; nil if none.
1062 See `set-process-filter' for more info on filter functions.
1063 */
1064 (proc))
1065 {
1066 CHECK_PROCESS (proc);
1067 return XPROCESS (proc)->filter;
1068 }
1069
1070 DEFUN ("process-send-region", Fprocess_send_region, 3, 3, 0, /*
1071 Send current contents of region as input to PROCESS.
1072 PROCESS may be a process name or an actual process.
1073 Called from program, takes three arguments, PROCESS, START and END.
1074 If the region is more than 500 or so characters long,
1075 it is sent in several bunches. This may happen even for shorter regions.
1076 Output from processes can arrive in between bunches.
1077 */
1078 (process, start, end))
1079 {
1080 /* This function can GC */
1081 Lisp_Object proc = get_process (process);
1082 Bufpos st, en;
1083
1084 get_buffer_range_char (current_buffer, start, end, &st, &en, 0);
1085
1086 send_process (proc, Fcurrent_buffer (), 0,
1087 st, en - st);
1088 return Qnil;
1089 }
1090
1091 DEFUN ("process-send-string", Fprocess_send_string, 2, 4, 0, /*
1092 Send PROCESS the contents of STRING as input.
1093 PROCESS may be a process name or an actual process.
1094 Optional arguments FROM and TO specify part of STRING, see `substring'.
1095 If STRING is more than 500 or so characters long,
1096 it is sent in several bunches. This may happen even for shorter strings.
1097 Output from processes can arrive in between bunches.
1098 */
1099 (process, string, from, to))
1100 {
1101 /* This function can GC */
1102 Lisp_Object proc;
1103 Bytecount len;
1104 Bytecount bfr, bto;
1105
1106 proc = get_process (process);
1107 CHECK_STRING (string);
1108 get_string_range_byte (string, from, to, &bfr, &bto,
1109 GB_HISTORICAL_STRING_BEHAVIOR);
1110 len = bto - bfr;
1111
1112 send_process (proc, string, 0, bfr, len);
1113 return Qnil;
1114 }
1115
1116 #ifdef FILE_CODING
1117
1118 DEFUN ("process-input-coding-system", Fprocess_input_coding_system, 1, 1, 0, /*
1119 Return PROCESS's input coding system.
1120 */
1121 (process))
1122 {
1123 process = get_process (process);
1124 return decoding_stream_coding_system (XLSTREAM (XPROCESS (process)->coding_instream) );
1125 }
1126
1127 DEFUN ("process-output-coding-system", Fprocess_output_coding_system, 1, 1, 0, /*
1128 Return PROCESS's output coding system.
1129 */
1130 (process))
1131 {
1132 process = get_process (process);
1133 return encoding_stream_coding_system (XLSTREAM (XPROCESS (process)->coding_outstream));
1134 }
1135
1136 DEFUN ("process-coding-system", Fprocess_coding_system, 1, 1, 0, /*
1137 Return a pair of coding-system for decoding and encoding of PROCESS.
1138 */
1139 (process))
1140 {
1141 process = get_process (process);
1142 return Fcons (decoding_stream_coding_system
1143 (XLSTREAM (XPROCESS (process)->coding_instream)),
1144 encoding_stream_coding_system
1145 (XLSTREAM (XPROCESS (process)->coding_outstream)));
1146 }
1147
1148 DEFUN ("set-process-input-coding-system", Fset_process_input_coding_system,
1149 2, 2, 0, /*
1150 Set PROCESS's input coding system to CODESYS.
1151 */
1152 (process, codesys))
1153 {
1154 codesys = Fget_coding_system (codesys);
1155 process = get_process (process);
1156 set_decoding_stream_coding_system
1157 (XLSTREAM (XPROCESS (process)->coding_instream), codesys);
1158 return Qnil;
1159 }
1160
1161 DEFUN ("set-process-output-coding-system", Fset_process_output_coding_system,
1162 2, 2, 0, /*
1163 Set PROCESS's output coding system to CODESYS.
1164 */
1165 (process, codesys))
1166 {
1167 codesys = Fget_coding_system (codesys);
1168 process = get_process (process);
1169 set_encoding_stream_coding_system
1170 (XLSTREAM (XPROCESS (process)->coding_outstream), codesys);
1171 return Qnil;
1172 }
1173
1174 DEFUN ("set-process-coding-system", Fset_process_coding_system,
1175 1, 3, 0, /*
1176 Set coding-systems of PROCESS to DECODING and ENCODING.
1177 */
1178 (process, decoding, encoding))
1179 {
1180 if (!NILP (decoding))
1181 Fset_process_input_coding_system (process, decoding);
1182
1183 if (!NILP (encoding))
1184 Fset_process_output_coding_system (process, encoding);
1185
1186 return Qnil;
1187 }
1188
1189 #endif /* FILE_CODING */
1190
1191 /************************************************************************/
1192 /* process status */
1193 /************************************************************************/
1194
1195 static Lisp_Object
1196 exec_sentinel_unwind (Lisp_Object datum)
1197 {
1198 struct Lisp_Cons *d = XCONS (datum);
1199 XPROCESS (d->car)->sentinel = d->cdr;
1200 free_cons (d);
1201 return Qnil;
1202 }
1203
1204 static void
1205 exec_sentinel (Lisp_Object proc, Lisp_Object reason)
1206 {
1207 /* This function can GC */
1208 int speccount = specpdl_depth ();
1209 struct Lisp_Process *p = XPROCESS (proc);
1210 Lisp_Object sentinel = p->sentinel;
1211
1212 if (NILP (sentinel))
1213 return;
1214
1215 /* Some weird FSFmacs crap here with
1216 Vdeactivate_mark and current_buffer->keymap */
1217
1218 /* Zilch the sentinel while it's running, to avoid recursive invocations;
1219 assure that it gets restored no matter how the sentinel exits. */
1220 p->sentinel = Qnil;
1221 record_unwind_protect (exec_sentinel_unwind, noseeum_cons (proc, sentinel));
1222 /* We used to bind inhibit-quit to t here, but call2_trapping_errors()
1223 does that for us. */
1224 running_asynch_code = 1;
1225 call2_trapping_errors ("Error in process sentinel", sentinel, proc, reason);
1226 running_asynch_code = 0;
1227 restore_match_data ();
1228 unbind_to (speccount, Qnil);
1229 }
1230
1231 DEFUN ("set-process-sentinel", Fset_process_sentinel, 2, 2, 0, /*
1232 Give PROCESS the sentinel SENTINEL; nil for none.
1233 The sentinel is called as a function when the process changes state.
1234 It gets two arguments: the process, and a string describing the change.
1235 */
1236 (proc, sentinel))
1237 {
1238 CHECK_PROCESS (proc);
1239 XPROCESS (proc)->sentinel = sentinel;
1240 return sentinel;
1241 }
1242
1243 DEFUN ("process-sentinel", Fprocess_sentinel, 1, 1, 0, /*
1244 Return the sentinel of PROCESS; nil if none.
1245 See `set-process-sentinel' for more info on sentinels.
1246 */
1247 (proc))
1248 {
1249 CHECK_PROCESS (proc);
1250 return XPROCESS (proc)->sentinel;
1251 }
1252
1253
1254 CONST char *
1255 signal_name (int signum)
1256 {
1257 if (signum >= 0 && signum < NSIG)
1258 return (CONST char *) sys_siglist[signum];
1259
1260 return (CONST char *) GETTEXT ("unknown signal");
1261 }
1262
1263 void
1264 update_process_status (Lisp_Object p,
1265 Lisp_Object status_symbol,
1266 int exit_code,
1267 int core_dumped)
1268 {
1269 XPROCESS (p)->tick++;
1270 process_tick++;
1271 XPROCESS (p)->status_symbol = status_symbol;
1272 XPROCESS (p)->exit_code = exit_code;
1273 XPROCESS (p)->core_dumped = core_dumped;
1274 }
1275
1276 /* Return a string describing a process status list. */
1277
1278 static Lisp_Object
1279 status_message (struct Lisp_Process *p)
1280 {
1281 Lisp_Object symbol = p->status_symbol;
1282 int code = p->exit_code;
1283 int coredump = p->core_dumped;
1284 Lisp_Object string, string2;
1285
1286 if (EQ (symbol, Qsignal) || EQ (symbol, Qstop))
1287 {
1288 string = build_string (signal_name (code));
1289 if (coredump)
1290 string2 = build_translated_string (" (core dumped)\n");
1291 else
1292 string2 = build_string ("\n");
1293 set_string_char (XSTRING (string), 0,
1294 DOWNCASE (current_buffer,
1295 string_char (XSTRING (string), 0)));
1296 return concat2 (string, string2);
1297 }
1298 else if (EQ (symbol, Qexit))
1299 {
1300 if (code == 0)
1301 return build_translated_string ("finished\n");
1302 string = Fnumber_to_string (make_int (code));
1303 if (coredump)
1304 string2 = build_translated_string (" (core dumped)\n");
1305 else
1306 string2 = build_string ("\n");
1307 return concat2 (build_translated_string ("exited abnormally with code "),
1308 concat2 (string, string2));
1309 }
1310 else
1311 return Fcopy_sequence (Fsymbol_name (symbol));
1312 }
1313
1314 /* Tell status_notify() to check for terminated processes. We do this
1315 because on some systems we sometimes miss SIGCHLD calls. (Not sure
1316 why.) */
1317
1318 void
1319 kick_status_notify (void)
1320 {
1321 process_tick++;
1322 }
1323
1324
1325 /* Report all recent events of a change in process status
1326 (either run the sentinel or output a message).
1327 This is done while Emacs is waiting for keyboard input. */
1328
1329 void
1330 status_notify (void)
1331 {
1332 /* This function can GC */
1333 Lisp_Object tail = Qnil;
1334 Lisp_Object symbol = Qnil;
1335 Lisp_Object msg = Qnil;
1336 struct gcpro gcpro1, gcpro2, gcpro3;
1337 /* process_tick is volatile, so we have to remember it now.
1338 Otherwise, we get a race condition is SIGCHLD happens during
1339 this function.
1340
1341 (Actually, this is not the case anymore. The code to
1342 update the process structures has been moved out of the
1343 SIGCHLD handler. But for the moment I'm leaving this
1344 stuff in -- it can't hurt.) */
1345 int temp_process_tick;
1346
1347 MAYBE_PROCMETH (reap_exited_processes, ());
1348
1349 temp_process_tick = process_tick;
1350
1351 if (update_tick == temp_process_tick)
1352 return;
1353
1354 /* We need to gcpro tail; if read_process_output calls a filter
1355 which deletes a process and removes the cons to which tail points
1356 from Vprocess_alist, and then causes a GC, tail is an unprotected
1357 reference. */
1358 GCPRO3 (tail, symbol, msg);
1359
1360 for (tail = Vprocess_list; CONSP (tail); tail = XCDR (tail))
1361 {
1362 Lisp_Object proc = XCAR (tail);
1363 struct Lisp_Process *p = XPROCESS (proc);
1364 /* p->tick is also volatile. Same thing as above applies. */
1365 int this_process_tick;
1366
1367 /* #### extra check for terminated processes, in case a SIGCHLD
1368 got missed (this seems to happen sometimes, I'm not sure why).
1369 */
1370 if (INTP (p->pid))
1371 MAYBE_PROCMETH (update_status_if_terminated, (p));
1372
1373 this_process_tick = p->tick;
1374 if (this_process_tick != p->update_tick)
1375 {
1376 p->update_tick = this_process_tick;
1377
1378 /* If process is still active, read any output that remains. */
1379 while (!EQ (p->filter, Qt)
1380 && read_process_output (proc) > 0)
1381 ;
1382
1383 /* Get the text to use for the message. */
1384 msg = status_message (p);
1385
1386 /* If process is terminated, deactivate it or delete it. */
1387 symbol = p->status_symbol;
1388
1389 if (EQ (symbol, Qsignal)
1390 || EQ (symbol, Qexit))
1391 {
1392 if (delete_exited_processes)
1393 remove_process (proc);
1394 else
1395 deactivate_process (proc);
1396 }
1397
1398 /* Now output the message suitably. */
1399 if (!NILP (p->sentinel))
1400 exec_sentinel (proc, msg);
1401 /* Don't bother with a message in the buffer
1402 when a process becomes runnable. */
1403 else if (!EQ (symbol, Qrun) && !NILP (p->buffer))
1404 {
1405 Lisp_Object old_read_only = Qnil;
1406 Lisp_Object old = Fcurrent_buffer ();
1407 Bufpos opoint;
1408 struct gcpro ngcpro1, ngcpro2;
1409
1410 /* Avoid error if buffer is deleted
1411 (probably that's why the process is dead, too) */
1412 if (!BUFFER_LIVE_P (XBUFFER (p->buffer)))
1413 continue;
1414
1415 NGCPRO2 (old, old_read_only);
1416 Fset_buffer (p->buffer);
1417 opoint = BUF_PT (current_buffer);
1418 /* Insert new output into buffer
1419 at the current end-of-output marker,
1420 thus preserving logical ordering of input and output. */
1421 if (XMARKER (p->mark)->buffer)
1422 BUF_SET_PT (current_buffer, marker_position (p->mark));
1423 else
1424 BUF_SET_PT (current_buffer, BUF_ZV (current_buffer));
1425 if (BUF_PT (current_buffer) <= opoint)
1426 opoint += (string_char_length (XSTRING (msg))
1427 + string_char_length (XSTRING (p->name))
1428 + 10);
1429
1430 old_read_only = current_buffer->read_only;
1431 current_buffer->read_only = Qnil;
1432 buffer_insert_c_string (current_buffer, "\nProcess ");
1433 Finsert (1, &p->name);
1434 buffer_insert_c_string (current_buffer, " ");
1435 Finsert (1, &msg);
1436 current_buffer->read_only = old_read_only;
1437 Fset_marker (p->mark, make_int (BUF_PT (current_buffer)),
1438 p->buffer);
1439
1440 opoint = bufpos_clip_to_bounds(BUF_BEGV (XBUFFER (p->buffer)),
1441 opoint,
1442 BUF_ZV (XBUFFER (p->buffer)));
1443 BUF_SET_PT (current_buffer, opoint);
1444 Fset_buffer (old);
1445 NUNGCPRO;
1446 }
1447 }
1448 } /* end for */
1449
1450 /* in case buffers use %s in modeline-format */
1451 MARK_MODELINE_CHANGED;
1452 redisplay ();
1453
1454 update_tick = temp_process_tick;
1455
1456 UNGCPRO;
1457 }
1458
1459 DEFUN ("process-status", Fprocess_status, 1, 1, 0, /*
1460 Return the status of PROCESS.
1461 This is a symbol, one of these:
1462
1463 run -- for a process that is running.
1464 stop -- for a process stopped but continuable.
1465 exit -- for a process that has exited.
1466 signal -- for a process that has got a fatal signal.
1467 open -- for a network stream connection that is open.
1468 closed -- for a network stream connection that is closed.
1469 nil -- if arg is a process name and no such process exists.
1470
1471 PROCESS may be a process, a buffer, the name of a process or buffer, or
1472 nil, indicating the current buffer's process.
1473 */
1474 (proc))
1475 {
1476 Lisp_Object status_symbol;
1477
1478 if (STRINGP (proc))
1479 proc = Fget_process (proc);
1480 else
1481 proc = get_process (proc);
1482
1483 if (NILP (proc))
1484 return Qnil;
1485
1486 status_symbol = XPROCESS (proc)->status_symbol;
1487 if (network_connection_p (proc))
1488 {
1489 if (EQ (status_symbol, Qrun))
1490 status_symbol = Qopen;
1491 else if (EQ (status_symbol, Qexit))
1492 status_symbol = Qclosed;
1493 }
1494 return status_symbol;
1495 }
1496
1497 DEFUN ("process-exit-status", Fprocess_exit_status, 1, 1, 0, /*
1498 Return the exit status of PROCESS or the signal number that killed it.
1499 If PROCESS has not yet exited or died, return 0.
1500 */
1501 (proc))
1502 {
1503 CHECK_PROCESS (proc);
1504 return make_int (XPROCESS (proc)->exit_code);
1505 }
1506
1507
1508
1509 /* send a signal number SIGNO to PROCESS.
1510 CURRENT_GROUP means send to the process group that currently owns
1511 the terminal being used to communicate with PROCESS.
1512 This is used for various commands in shell mode.
1513 If NOMSG is zero, insert signal-announcements into process's buffers
1514 right away.
1515
1516 If we can, we try to signal PROCESS by sending control characters
1517 down the pty. This allows us to signal inferiors who have changed
1518 their uid, for which killpg would return an EPERM error. */
1519
1520 static void
1521 process_send_signal (Lisp_Object process, int signo,
1522 int current_group, int nomsg)
1523 {
1524 /* This function can GC */
1525 Lisp_Object proc = get_process (process);
1526
1527 if (network_connection_p (proc))
1528 error ("Network connection %s is not a subprocess",
1529 XSTRING_DATA (XPROCESS(proc)->name));
1530 if (!PROCESS_LIVE_P (proc))
1531 error ("Process %s is not active",
1532 XSTRING_DATA (XPROCESS(proc)->name));
1533
1534 MAYBE_PROCMETH (kill_child_process, (proc, signo, current_group, nomsg));
1535 }
1536
1537 DEFUN ("interrupt-process", Finterrupt_process, 0, 2, 0, /*
1538 Interrupt process PROCESS. May be process or name of one.
1539 Nil or no arg means current buffer's process.
1540 Second arg CURRENT-GROUP non-nil means send signal to
1541 the current process-group of the process's controlling terminal
1542 rather than to the process's own process group.
1543 If the process is a shell, this means interrupt current subjob
1544 rather than the shell.
1545 */
1546 (process, current_group))
1547 {
1548 /* This function can GC */
1549 process_send_signal (process, SIGINT, !NILP (current_group), 0);
1550 return process;
1551 }
1552
1553 DEFUN ("kill-process", Fkill_process, 0, 2, 0, /*
1554 Kill process PROCESS. May be process or name of one.
1555 See function `interrupt-process' for more details on usage.
1556 */
1557 (process, current_group))
1558 {
1559 /* This function can GC */
1560 #ifdef SIGKILL
1561 process_send_signal (process, SIGKILL, !NILP (current_group), 0);
1562 #else
1563 error ("kill-process: Not supported on this system");
1564 #endif
1565 return process;
1566 }
1567
1568 DEFUN ("quit-process", Fquit_process, 0, 2, 0, /*
1569 Send QUIT signal to process PROCESS. May be process or name of one.
1570 See function `interrupt-process' for more details on usage.
1571 */
1572 (process, current_group))
1573 {
1574 /* This function can GC */
1575 #ifdef SIGQUIT
1576 process_send_signal (process, SIGQUIT, !NILP (current_group), 0);
1577 #else
1578 error ("quit-process: Not supported on this system");
1579 #endif
1580 return process;
1581 }
1582
1583 DEFUN ("stop-process", Fstop_process, 0, 2, 0, /*
1584 Stop process PROCESS. May be process or name of one.
1585 See function `interrupt-process' for more details on usage.
1586 */
1587 (process, current_group))
1588 {
1589 /* This function can GC */
1590 #ifdef SIGTSTP
1591 process_send_signal (process, SIGTSTP, !NILP (current_group), 0);
1592 #else
1593 error ("stop-process: Not supported on this system");
1594 #endif
1595 return process;
1596 }
1597
1598 DEFUN ("continue-process", Fcontinue_process, 0, 2, 0, /*
1599 Continue process PROCESS. May be process or name of one.
1600 See function `interrupt-process' for more details on usage.
1601 */
1602 (process, current_group))
1603 {
1604 /* This function can GC */
1605 #ifdef SIGCONT
1606 process_send_signal (process, SIGCONT, !NILP (current_group), 0);
1607 #else
1608 error ("continue-process: Not supported on this system");
1609 #endif
1610 return process;
1611 }
1612
1613 DEFUN ("signal-process", Fsignal_process, 2, 2,
1614 "nProcess number: \nnSignal code: ", /*
1615 Send the process with process id PID the signal with code SIGCODE.
1616 PID must be an integer. The process need not be a child of this Emacs.
1617 SIGCODE may be an integer, or a symbol whose name is a signal name.
1618 */
1619 (pid, sigcode))
1620 {
1621 CHECK_INT (pid);
1622
1623 if (INTP (sigcode))
1624 ;
1625 else
1626 {
1627 Bufbyte *name;
1628
1629 CHECK_SYMBOL (sigcode);
1630 name = string_data (XSYMBOL (sigcode)->name);
1631
1632 #define handle_signal(signal) \
1633 else if (!strcmp ((CONST char *) name, #signal)) \
1634 XSETINT (sigcode, signal)
1635
1636 if (0)
1637 ;
1638 handle_signal (SIGINT); /* ANSI */
1639 handle_signal (SIGILL); /* ANSI */
1640 handle_signal (SIGABRT); /* ANSI */
1641 handle_signal (SIGFPE); /* ANSI */
1642 handle_signal (SIGSEGV); /* ANSI */
1643 handle_signal (SIGTERM); /* ANSI */
1644
1645 #ifdef SIGHUP
1646 handle_signal (SIGHUP); /* POSIX */
1647 #endif
1648 #ifdef SIGQUIT
1649 handle_signal (SIGQUIT); /* POSIX */
1650 #endif
1651 #ifdef SIGTRAP
1652 handle_signal (SIGTRAP); /* POSIX */
1653 #endif
1654 #ifdef SIGKILL
1655 handle_signal (SIGKILL); /* POSIX */
1656 #endif
1657 #ifdef SIGUSR1
1658 handle_signal (SIGUSR1); /* POSIX */
1659 #endif
1660 #ifdef SIGUSR2
1661 handle_signal (SIGUSR2); /* POSIX */
1662 #endif
1663 #ifdef SIGPIPE
1664 handle_signal (SIGPIPE); /* POSIX */
1665 #endif
1666 #ifdef SIGALRM
1667 handle_signal (SIGALRM); /* POSIX */
1668 #endif
1669 #ifdef SIGCHLD
1670 handle_signal (SIGCHLD); /* POSIX */
1671 #endif
1672 #ifdef SIGCONT
1673 handle_signal (SIGCONT); /* POSIX */
1674 #endif
1675 #ifdef SIGSTOP
1676 handle_signal (SIGSTOP); /* POSIX */
1677 #endif
1678 #ifdef SIGTSTP
1679 handle_signal (SIGTSTP); /* POSIX */
1680 #endif
1681 #ifdef SIGTTIN
1682 handle_signal (SIGTTIN); /* POSIX */
1683 #endif
1684 #ifdef SIGTTOU
1685 handle_signal (SIGTTOU); /* POSIX */
1686 #endif
1687
1688 #ifdef SIGBUS
1689 handle_signal (SIGBUS); /* XPG5 */
1690 #endif
1691 #ifdef SIGPOLL
1692 handle_signal (SIGPOLL); /* XPG5 */
1693 #endif
1694 #ifdef SIGPROF
1695 handle_signal (SIGPROF); /* XPG5 */
1696 #endif
1697 #ifdef SIGSYS
1698 handle_signal (SIGSYS); /* XPG5 */
1699 #endif
1700 #ifdef SIGURG
1701 handle_signal (SIGURG); /* XPG5 */
1702 #endif
1703 #ifdef SIGXCPU
1704 handle_signal (SIGXCPU); /* XPG5 */
1705 #endif
1706 #ifdef SIGXFSZ
1707 handle_signal (SIGXFSZ); /* XPG5 */
1708 #endif
1709 #ifdef SIGVTALRM
1710 handle_signal (SIGVTALRM); /* XPG5 */
1711 #endif
1712
1713 #ifdef SIGIO
1714 handle_signal (SIGIO); /* BSD 4.2 */
1715 #endif
1716 #ifdef SIGWINCH
1717 handle_signal (SIGWINCH); /* BSD 4.3 */
1718 #endif
1719
1720 #ifdef SIGEMT
1721 handle_signal (SIGEMT);
1722 #endif
1723 #ifdef SIGINFO
1724 handle_signal (SIGINFO);
1725 #endif
1726 #ifdef SIGHWE
1727 handle_signal (SIGHWE);
1728 #endif
1729 #ifdef SIGPRE
1730 handle_signal (SIGPRE);
1731 #endif
1732 #ifdef SIGUME
1733 handle_signal (SIGUME);
1734 #endif
1735 #ifdef SIGDLK
1736 handle_signal (SIGDLK);
1737 #endif
1738 #ifdef SIGCPULIM
1739 handle_signal (SIGCPULIM);
1740 #endif
1741 #ifdef SIGIOT
1742 handle_signal (SIGIOT);
1743 #endif
1744 #ifdef SIGLOST
1745 handle_signal (SIGLOST);
1746 #endif
1747 #ifdef SIGSTKFLT
1748 handle_signal (SIGSTKFLT);
1749 #endif
1750 #ifdef SIGUNUSED
1751 handle_signal (SIGUNUSED);
1752 #endif
1753 #ifdef SIGDANGER
1754 handle_signal (SIGDANGER); /* AIX */
1755 #endif
1756 #ifdef SIGMSG
1757 handle_signal (SIGMSG);
1758 #endif
1759 #ifdef SIGSOUND
1760 handle_signal (SIGSOUND);
1761 #endif
1762 #ifdef SIGRETRACT
1763 handle_signal (SIGRETRACT);
1764 #endif
1765 #ifdef SIGGRANT
1766 handle_signal (SIGGRANT);
1767 #endif
1768 #ifdef SIGPWR
1769 handle_signal (SIGPWR);
1770 #endif
1771 else
1772 error ("Undefined signal name %s", name);
1773 }
1774
1775 #undef handle_signal
1776
1777 return make_int (PROCMETH_OR_GIVEN (kill_process_by_pid,
1778 (XINT (pid), XINT (sigcode)), -1));
1779 }
1780
1781 DEFUN ("process-send-eof", Fprocess_send_eof, 0, 1, 0, /*
1782 Make PROCESS see end-of-file in its input.
1783 PROCESS may be a process, a buffer, the name of a process or buffer, or
1784 nil, indicating the current buffer's process.
1785 If PROCESS is a network connection, or is a process communicating
1786 through a pipe (as opposed to a pty), then you cannot send any more
1787 text to PROCESS after you call this function.
1788 */
1789 (process))
1790 {
1791 /* This function can GC */
1792 Lisp_Object proc = get_process (process);
1793
1794 /* Make sure the process is really alive. */
1795 if (! EQ (XPROCESS (proc)->status_symbol, Qrun))
1796 error ("Process %s not running", XSTRING_DATA (XPROCESS (proc)->name));
1797
1798 if (!MAYBE_INT_PROCMETH (process_send_eof, (proc)))
1799 {
1800 if (!NILP (DATA_OUTSTREAM (XPROCESS (proc))))
1801 {
1802 Lstream_close (XLSTREAM (DATA_OUTSTREAM (XPROCESS (proc))));
1803 event_stream_delete_stream_pair (Qnil, XPROCESS (proc)->pipe_outstream);
1804 XPROCESS (proc)->pipe_outstream = Qnil;
1805 #ifdef FILE_CODING
1806 XPROCESS (proc)->coding_outstream = Qnil;
1807 #endif
1808 }
1809 }
1810
1811 return process;
1812 }
1813
1814
1815 /************************************************************************/
1816 /* deleting a process */
1817 /************************************************************************/
1818
1819 void
1820 deactivate_process (Lisp_Object proc)
1821 {
1822 struct Lisp_Process *p = XPROCESS (proc);
1823 USID usid;
1824
1825 /* It's possible that we got as far in the process-creation
1826 process as creating the descriptors but didn't get so
1827 far as selecting the process for input. In this
1828 case, p->pid is nil: p->pid is set at the same time that
1829 the process is selected for input. */
1830 /* #### The comment does not look correct. event_stream_unselect_process
1831 is guarded by process->selected, so this is not a problem. - kkm*/
1832 /* Must call this before setting the streams to nil */
1833 event_stream_unselect_process (p);
1834
1835 if (!NILP (DATA_OUTSTREAM (p)))
1836 Lstream_close (XLSTREAM (DATA_OUTSTREAM (p)));
1837 if (!NILP (DATA_INSTREAM (p)))
1838 Lstream_close (XLSTREAM (DATA_INSTREAM (p)));
1839
1840 /* Provide minimal implementation for deactivate_process
1841 if there's no process-specific one */
1842 if (HAS_PROCMETH_P (deactivate_process))
1843 usid = PROCMETH (deactivate_process, (p));
1844 else
1845 usid = event_stream_delete_stream_pair (p->pipe_instream,
1846 p->pipe_outstream);
1847
1848 if (usid != USID_DONTHASH)
1849 remhash ((CONST void*)usid, usid_to_process);
1850
1851 p->pipe_instream = Qnil;
1852 p->pipe_outstream = Qnil;
1853 #ifdef FILE_CODING
1854 p->coding_instream = Qnil;
1855 p->coding_outstream = Qnil;
1856 #endif
1857 }
1858
1859 static void
1860 remove_process (Lisp_Object proc)
1861 {
1862 Vprocess_list = delq_no_quit (proc, Vprocess_list);
1863 Fset_marker (XPROCESS (proc)->mark, Qnil, Qnil);
1864
1865 deactivate_process (proc);
1866 }
1867
1868 DEFUN ("delete-process", Fdelete_process, 1, 1, 0, /*
1869 Delete PROCESS: kill it and forget about it immediately.
1870 PROCESS may be a process or the name of one, or a buffer name.
1871 */
1872 (proc))
1873 {
1874 /* This function can GC */
1875 struct Lisp_Process *p;
1876 proc = get_process (proc);
1877 p = XPROCESS (proc);
1878 if (network_connection_p (proc))
1879 {
1880 p->status_symbol = Qexit;
1881 p->exit_code = 0;
1882 p->core_dumped = 0;
1883 p->tick++;
1884 process_tick++;
1885 }
1886 else if (!NILP(p->pipe_instream))
1887 {
1888 Fkill_process (proc, Qnil);
1889 /* Do this now, since remove_process will make sigchld_handler do nothing. */
1890 p->status_symbol = Qsignal;
1891 p->exit_code = SIGKILL;
1892 p->core_dumped = 0;
1893 p->tick++;
1894 process_tick++;
1895 status_notify ();
1896 }
1897 remove_process (proc);
1898 return Qnil;
1899 }
1900
1901 /* Kill all processes associated with `buffer'.
1902 If `buffer' is nil, kill all processes */
1903
1904 void
1905 kill_buffer_processes (Lisp_Object buffer)
1906 {
1907 Lisp_Object tail;
1908
1909 for (tail = Vprocess_list; CONSP (tail);
1910 tail = XCDR (tail))
1911 {
1912 Lisp_Object proc = XCAR (tail);
1913 if (PROCESSP (proc)
1914 && (NILP (buffer) || EQ (XPROCESS (proc)->buffer, buffer)))
1915 {
1916 if (network_connection_p (proc))
1917 Fdelete_process (proc);
1918 else if (!NILP (XPROCESS (proc)->pipe_instream))
1919 process_send_signal (proc, SIGHUP, 0, 1);
1920 }
1921 }
1922 }
1923
1924 DEFUN ("process-kill-without-query", Fprocess_kill_without_query, 1, 2, 0, /*
1925 Say no query needed if PROCESS is running when Emacs is exited.
1926 Optional second argument if non-nil says to require a query.
1927 Value is t if a query was formerly required.
1928 */
1929 (proc, require_query_p))
1930 {
1931 int tem;
1932
1933 CHECK_PROCESS (proc);
1934 tem = XPROCESS (proc)->kill_without_query;
1935 XPROCESS (proc)->kill_without_query = NILP (require_query_p);
1936
1937 return tem ? Qnil : Qt;
1938 }
1939
1940 DEFUN ("process-kill-without-query-p", Fprocess_kill_without_query_p, 1, 1, 0, /*
1941 Whether PROC will be killed without query if running when emacs is exited.
1942 */
1943 (proc))
1944 {
1945 CHECK_PROCESS (proc);
1946 return XPROCESS (proc)->kill_without_query ? Qt : Qnil;
1947 }
1948
1949
1950 /* This is not named init_process in order to avoid a conflict with NS 3.3 */
1951 void
1952 init_xemacs_process (void)
1953 {
1954 MAYBE_PROCMETH (init_process, ());
1955
1956 Vprocess_list = Qnil;
1957
1958 if (usid_to_process)
1959 clrhash (usid_to_process);
1960 else
1961 usid_to_process = make_hash_table (32);
1962 }
1963
1964 #if 0
1965
1966 xxDEFUN ("process-connection", Fprocess_connection, 0, 1, 0, /*
1967 Return the connection type of `PROCESS'. This can be nil (pipe),
1968 t or pty (pty) or stream (socket connection).
1969 */
1970 (process))
1971 {
1972 return XPROCESS (process)->type;
1973 }
1974
1975 #endif /* 0 */
1976
1977 void
1978 syms_of_process (void)
1979 {
1980 defsymbol (&Qprocessp, "processp");
1981 defsymbol (&Qrun, "run");
1982 defsymbol (&Qstop, "stop");
1983 defsymbol (&Qopen, "open");
1984 defsymbol (&Qclosed, "closed");
1985
1986 defsymbol (&Qtcp, "tcp");
1987 defsymbol (&Qudp, "udp");
1988
1989 #ifdef HAVE_MULTICAST
1990 defsymbol(&Qmulticast, "multicast"); /* Used for occasional warnings */
1991 #endif
1992
1993 DEFSUBR (Fprocessp);
1994 DEFSUBR (Fget_process);
1995 DEFSUBR (Fget_buffer_process);
1996 DEFSUBR (Fdelete_process);
1997 DEFSUBR (Fprocess_status);
1998 DEFSUBR (Fprocess_exit_status);
1999 DEFSUBR (Fprocess_id);
2000 DEFSUBR (Fprocess_name);
2001 DEFSUBR (Fprocess_tty_name);
2002 DEFSUBR (Fprocess_command);
2003 DEFSUBR (Fset_process_buffer);
2004 DEFSUBR (Fprocess_buffer);
2005 DEFSUBR (Fprocess_mark);
2006 DEFSUBR (Fset_process_filter);
2007 DEFSUBR (Fprocess_filter);
2008 DEFSUBR (Fset_process_window_size);
2009 DEFSUBR (Fset_process_sentinel);
2010 DEFSUBR (Fprocess_sentinel);
2011 DEFSUBR (Fprocess_kill_without_query);
2012 DEFSUBR (Fprocess_kill_without_query_p);
2013 DEFSUBR (Fprocess_list);
2014 DEFSUBR (Fstart_process_internal);
2015 #ifdef HAVE_SOCKETS
2016 DEFSUBR (Fopen_network_stream_internal);
2017 #ifdef HAVE_MULTICAST
2018 DEFSUBR (Fopen_multicast_group_internal);
2019 #endif /* HAVE_MULTICAST */
2020 #endif /* HAVE_SOCKETS */
2021 DEFSUBR (Fprocess_send_region);
2022 DEFSUBR (Fprocess_send_string);
2023 DEFSUBR (Finterrupt_process);
2024 DEFSUBR (Fkill_process);
2025 DEFSUBR (Fquit_process);
2026 DEFSUBR (Fstop_process);
2027 DEFSUBR (Fcontinue_process);
2028 DEFSUBR (Fprocess_send_eof);
2029 DEFSUBR (Fsignal_process);
2030 /* DEFSUBR (Fprocess_connection); */
2031 #ifdef FILE_CODING
2032 DEFSUBR (Fprocess_input_coding_system);
2033 DEFSUBR (Fprocess_output_coding_system);
2034 DEFSUBR (Fset_process_input_coding_system);
2035 DEFSUBR (Fset_process_output_coding_system);
2036 DEFSUBR (Fprocess_coding_system);
2037 DEFSUBR (Fset_process_coding_system);
2038 #endif /* FILE_CODING */
2039 }
2040
2041 void
2042 vars_of_process (void)
2043 {
2044 Fprovide (intern ("subprocesses"));
2045 #ifdef HAVE_SOCKETS
2046 Fprovide (intern ("network-streams"));
2047 #ifdef HAVE_MULTICAST
2048 Fprovide (intern ("multicast"));
2049 #endif /* HAVE_MULTICAST */
2050 #endif /* HAVE_SOCKETS */
2051 staticpro (&Vprocess_list);
2052
2053 DEFVAR_BOOL ("delete-exited-processes", &delete_exited_processes /*
2054 *Non-nil means delete processes immediately when they exit.
2055 nil means don't delete them until `list-processes' is run.
2056 */ );
2057
2058 delete_exited_processes = 1;
2059
2060 DEFVAR_LISP ("process-connection-type", &Vprocess_connection_type /*
2061 Control type of device used to communicate with subprocesses.
2062 Values are nil to use a pipe, or t or `pty' to use a pty.
2063 The value has no effect if the system has no ptys or if all ptys are busy:
2064 then a pipe is used in any case.
2065 The value takes effect when `start-process' is called.
2066 */ );
2067 Vprocess_connection_type = Qt;
2068
2069 DEFVAR_BOOL ("windowed-process-io", &windowed_process_io /*
2070 Enables input/output on standard handles of a windowed process.
2071 When this variable is nil (the default), XEmacs does not attempt to read
2072 standard output handle of a windowed process. Instead, the process is
2073 immediately marked as exited immediately upon successful launching. This is
2074 done because normal windowed processes do not use standard I/O, as they are
2075 not connected to any console.
2076
2077 When launching a specially crafted windowed process, which expects to be
2078 launched by XEmacs, or by other program which pipes its standard input and
2079 output, this variable must be set to non-nil, in which case XEmacs will
2080 treat this process just like a console process.
2081
2082 NOTE: You should never set this variable, only bind it.
2083
2084 Only Windows processes can be "windowed" or "console". This variable has no
2085 effect on UNIX processes, because all UNIX processes are "console".
2086 */ );
2087 windowed_process_io = 0;
2088
2089 #ifdef PROCESS_IO_BLOCKING
2090 DEFVAR_LISP ("network-stream-blocking-port-list", &network_stream_blocking_port_list /*
2091 List of port numbers or port names to set a blocking I/O mode with connection.
2092 Nil value means to set a default(non-blocking) I/O mode.
2093 The value takes effect when `open-network-stream-internal' is called.
2094 */ );
2095 network_stream_blocking_port_list = Qnil;
2096 #endif /* PROCESS_IO_BLOCKING */
2097 }
2098
2099 #endif /* not NO_SUBPROCESSES */