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