XEmacs 21.2-b1
[chise/xemacs-chise.git.1] / src / process-unix.c
1 /* Asynchronous subprocess implemenation for UNIX
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 "sysdep.h"
50 #include "window.h"
51 #ifdef FILE_CODING
52 #include "file-coding.h"
53 #endif
54
55 #include <setjmp.h>
56 #include "sysfile.h"
57 #include "sysproc.h"
58 #include "systime.h"
59 #include "syssignal.h" /* Always include before systty.h */
60 #include "systty.h"
61 #include "syswait.h"
62
63
64 /*
65  * Implemenation-specific data. Pointed to by Lisp_Process->process_data
66  */
67
68 struct unix_process_data
69 {
70   /* Non-0 if this is really a ToolTalk channel. */
71   int connected_via_filedesc_p;
72   /* Descriptor by which we read from this process.  -1 for dead process */
73   int infd;
74   /* Descriptor for the tty which this process is using.
75      -1 if we didn't record it (on some systems, there's no need).  */
76   int subtty;
77   /* Name of subprocess terminal. */
78   Lisp_Object tty_name;
79   /* Non-false if communicating through a pty.  */
80   char pty_flag;
81 };
82
83 #define UNIX_DATA(p) ((struct unix_process_data*)((p)->process_data))
84
85 #ifdef HAVE_PTYS
86 /* The file name of the pty opened by allocate_pty.  */
87
88 static char pty_name[24];
89 #endif
90
91
92 \f
93 /**********************************************************************/
94 /*                    Static helper routines                          */
95 /**********************************************************************/
96
97 static SIGTYPE
98 close_safely_handler (int signo)
99 {
100   EMACS_REESTABLISH_SIGNAL (signo, close_safely_handler);
101   SIGRETURN;
102 }
103
104 static void
105 close_safely (int fd)
106 {
107   stop_interrupts ();
108   signal (SIGALRM, close_safely_handler);
109   alarm (1);
110   close (fd);
111   alarm (0);
112   start_interrupts ();
113 }
114
115 static void
116 close_descriptor_pair (int in, int out)
117 {
118   if (in >= 0)
119     close (in);
120   if (out != in && out >= 0)
121     close (out);
122 }
123
124 /* Close all descriptors currently in use for communication
125    with subprocess.  This is used in a newly-forked subprocess
126    to get rid of irrelevant descriptors.  */
127
128 static int
129 close_process_descs_mapfun (CONST void* key, void* contents, void* arg)
130 {
131   Lisp_Object proc;
132   CVOID_TO_LISP (proc, contents);
133   event_stream_delete_stream_pair (XPROCESS(proc)->pipe_instream,
134                                    XPROCESS(proc)->pipe_outstream);
135   return 0;
136 }
137
138 /* #### This function is currently called from child_setup
139    in callproc.c. It should become static though - kkm */
140 void
141 close_process_descs (void)
142 {
143   maphash (close_process_descs_mapfun, usid_to_process, 0);
144 }
145
146 /* connect to an existing file descriptor.  This is very similar to
147    open-network-stream except that it assumes that the connection has
148    already been initialized.  It is currently used for ToolTalk
149    communication. */
150
151 /* This function used to be visible on the Lisp level, but there is no
152    real point in doing that.  Here is the doc string:
153
154   "Connect to an existing file descriptor.\n\
155 Returns a subprocess-object to represent the connection.\n\
156 Input and output work as for subprocesses; `delete-process' closes it.\n\
157 Args are NAME BUFFER INFD OUTFD.\n\
158 NAME is name for process.  It is modified if necessary to make it unique.\n\
159 BUFFER is the buffer (or buffer-name) to associate with the process.\n\
160  Process output goes at end of that buffer, unless you specify\n\
161  an output stream or filter function to handle the output.\n\
162  BUFFER may be also nil, meaning that this process is not associated\n\
163  with any buffer\n\
164 INFD and OUTFD specify the file descriptors to use for input and\n\
165  output, respectively."
166 */
167
168 Lisp_Object
169 connect_to_file_descriptor (Lisp_Object name, Lisp_Object buffer,
170                             Lisp_Object infd, Lisp_Object outfd)
171 {
172   /* This function can GC */
173   Lisp_Object proc;
174   int inch;
175
176   CHECK_STRING (name);
177   CHECK_INT (infd);
178   CHECK_INT (outfd);
179
180   inch = XINT (infd);
181   if (get_process_from_usid (FD_TO_USID(inch)))
182     error ("There is already a process connected to fd %d", inch);
183   if (!NILP (buffer))
184     buffer = Fget_buffer_create (buffer);
185   proc = make_process_internal (name);
186
187   XPROCESS (proc)->pid = Fcons (infd, name);
188   XPROCESS (proc)->buffer = buffer;
189   init_process_io_handles (XPROCESS (proc), (void*)inch, (void*)XINT (outfd), 0);
190   UNIX_DATA (XPROCESS (proc))->connected_via_filedesc_p = 1;
191
192   event_stream_select_process (XPROCESS (proc));
193
194   return proc;
195 }
196
197 #ifdef HAVE_PTYS
198
199 /* Open an available pty, returning a file descriptor.
200    Return -1 on failure.
201    The file name of the terminal corresponding to the pty
202    is left in the variable pty_name.  */
203
204 static int
205 allocate_pty (void)
206 {
207 #ifndef PTY_OPEN
208   struct stat stb;
209
210   /* Some systems name their pseudoterminals so that there are gaps in
211      the usual sequence - for example, on HP9000/S700 systems, there
212      are no pseudoterminals with names ending in 'f'.  So we wait for
213      three failures in a row before deciding that we've reached the
214      end of the ptys.  */
215   int failed_count = 0;
216 #endif
217   int i;
218   int fd;
219   int c;
220
221 #ifdef PTY_ITERATION
222   PTY_ITERATION
223 #else
224   for (c = FIRST_PTY_LETTER; c <= 'z'; c++)
225     for (i = 0; i < 16; i++)
226 #endif
227       {
228 #ifdef PTY_NAME_SPRINTF
229         PTY_NAME_SPRINTF
230 #else
231         sprintf (pty_name, "/dev/pty%c%x", c, i);
232 #endif /* no PTY_NAME_SPRINTF */
233
234 #ifdef PTY_OPEN
235         PTY_OPEN;
236 #else /* no PTY_OPEN */
237 #ifdef IRIS
238         /* Unusual IRIS code */
239         *ptyv = open ("/dev/ptc", O_RDWR | O_NDELAY | OPEN_BINARY, 0);
240         if (fd < 0)
241           return -1;
242         if (fstat (fd, &stb) < 0)
243           return -1;
244 #else /* not IRIS */
245         if (stat (pty_name, &stb) < 0)
246           {
247             failed_count++;
248             if (failed_count >= 3)
249               return -1;
250           }
251         else
252           failed_count = 0;
253 #ifdef O_NONBLOCK
254         fd = open (pty_name, O_RDWR | O_NONBLOCK | OPEN_BINARY, 0);
255 #else
256         fd = open (pty_name, O_RDWR | O_NDELAY | OPEN_BINARY, 0);
257 #endif
258 #endif /* not IRIS */
259 #endif /* no PTY_OPEN */
260
261         if (fd >= 0)
262           {
263             /* check to make certain that both sides are available
264                this avoids a nasty yet stupid bug in rlogins */
265 #ifdef PTY_TTY_NAME_SPRINTF
266             PTY_TTY_NAME_SPRINTF
267 #else
268             sprintf (pty_name, "/dev/tty%c%x", c, i);
269 #endif /* no PTY_TTY_NAME_SPRINTF */
270 #ifndef UNIPLUS
271             if (access (pty_name, 6) != 0)
272               {
273                 close (fd);
274 #if !defined(IRIS) && !defined(__sgi)
275                 continue;
276 #else
277                 return -1;
278 #endif /* IRIS */
279               }
280 #endif /* not UNIPLUS */
281             setup_pty (fd);
282             return fd;
283           }
284       }
285   return -1;
286 }
287 #endif /* HAVE_PTYS */
288
289 static int
290 create_bidirectional_pipe (int *inchannel, int *outchannel,
291                            volatile int *forkin, volatile int *forkout)
292 {
293   int sv[2];
294
295 #ifdef SKTPAIR
296   if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) < 0)
297     return -1;
298   *outchannel = *inchannel = sv[0];
299   *forkout = *forkin = sv[1];
300 #else /* not SKTPAIR */
301   int temp;
302   temp = pipe (sv);
303   if (temp < 0) return -1;
304   *inchannel = sv[0];
305   *forkout = sv[1];
306   temp = pipe (sv);
307   if (temp < 0) return -1;
308   *outchannel = sv[1];
309   *forkin = sv[0];
310 #endif /* not SKTPAIR */
311   return 0;
312 }
313
314
315 #ifdef HAVE_SOCKETS
316
317 static int
318 get_internet_address (Lisp_Object host, struct sockaddr_in *address,
319                       Error_behavior errb)
320 {
321   struct hostent *host_info_ptr = NULL;
322 #ifdef TRY_AGAIN
323   int count = 0;
324 #endif
325
326   xzero (*address);
327
328   while (1)
329     {
330 #ifdef TRY_AGAIN
331       if (count++ > 10) break;
332 #ifndef BROKEN_CYGWIN
333       h_errno = 0;
334 #endif
335 #endif
336       /* Some systems can't handle SIGIO/SIGALARM in gethostbyname. */
337       slow_down_interrupts ();
338       host_info_ptr = gethostbyname ((char *) XSTRING_DATA (host));
339       speed_up_interrupts ();
340 #ifdef TRY_AGAIN
341       if (! (host_info_ptr == 0 && h_errno == TRY_AGAIN))
342 #endif
343         break;
344       Fsleep_for (make_int (1));
345     }
346   if (host_info_ptr)
347     {
348       address->sin_family = host_info_ptr->h_addrtype;
349       memcpy (&address->sin_addr, host_info_ptr->h_addr, host_info_ptr->h_length);
350     }
351   else
352     {
353       IN_ADDR numeric_addr;
354       /* Attempt to interpret host as numeric inet address */
355       numeric_addr = inet_addr ((char *) XSTRING_DATA (host));
356       if (NUMERIC_ADDR_ERROR)
357         {
358           maybe_error (Qprocess, errb,
359                        "Unknown host \"%s\"", XSTRING_DATA (host));
360           return 0;
361         }
362
363       /* There was some broken code here that called strlen() here
364          on (char *) &numeric_addr and even sometimes accessed
365          uninitialized data. */
366       address->sin_family = AF_INET;
367       * (IN_ADDR *) &address->sin_addr = numeric_addr;
368     }
369
370   return 1;
371 }
372
373 static void
374 set_socket_nonblocking_maybe (int fd, int port, CONST char* proto)
375 {
376 #ifdef PROCESS_IO_BLOCKING
377   Lisp_Object tail;
378
379   for (tail = network_stream_blocking_port_list; CONSP (tail); tail = XCDR (tail))
380     {
381       Lisp_Object tail_port = XCAR (tail);
382
383       if (STRINGP (tail_port))
384         {
385           struct servent *svc_info;
386           CHECK_STRING (tail_port);
387           svc_info = getservbyname ((char *) XSTRING_DATA (tail_port), proto);
388           if ((svc_info != 0) && (svc_info->s_port == port))
389             break;
390           else
391             continue;
392         }
393       else if ((INTP (tail_port)) && (htons ((unsigned short) XINT (tail_port)) == port))
394         break;
395     }
396
397   if (!CONSP (tail))
398     {
399       set_descriptor_non_blocking (fd);
400     }
401 #else
402   set_descriptor_non_blocking (fd);
403 #endif  /* PROCESS_IO_BLOCKING */
404 }
405
406 #endif /* HAVE_SOCKETS */
407
408 /* Compute the Lisp form of the process status from
409    the numeric status that was returned by `wait'.  */
410
411 static void
412 update_status_from_wait_code (struct Lisp_Process *p, int *w_fmh)
413 {
414   /* C compiler lossage when attempting to pass w directly */
415   int w = *w_fmh;
416
417   if (WIFSTOPPED (w))
418     {
419       p->status_symbol = Qstop;
420       p->exit_code = WSTOPSIG (w);
421       p->core_dumped = 0;
422     }
423   else if (WIFEXITED (w))
424     {
425       p->status_symbol = Qexit;
426       p->exit_code = WEXITSTATUS (w);
427       p->core_dumped = 0;
428     }
429   else if (WIFSIGNALED (w))
430     {
431       p->status_symbol = Qsignal;
432       p->exit_code = WTERMSIG (w);
433       p->core_dumped = WCOREDUMP (w);
434     }
435   else
436     {
437       p->status_symbol = Qrun;
438       p->exit_code = 0;
439     }
440 }
441
442 #ifdef SIGCHLD
443
444 #define MAX_EXITED_PROCESSES 1000
445 static volatile pid_t exited_processes[MAX_EXITED_PROCESSES];
446 static volatile int exited_processes_status[MAX_EXITED_PROCESSES];
447 static volatile int exited_processes_index;
448
449 static volatile int sigchld_happened;
450
451 /* On receipt of a signal that a child status has changed,
452  loop asking about children with changed statuses until
453  the system says there are no more.  All we do is record
454  the processes and wait status.
455
456  This function could be called from within the SIGCHLD
457  handler, so it must be completely reentrant.  When
458  not called from a SIGCHLD handler, BLOCK_SIGCHLD should
459  be non-zero so that SIGCHLD is blocked while this
460  function is running. (This is necessary so avoid
461  race conditions with the SIGCHLD_HAPPENED flag). */
462
463 static void
464 record_exited_processes (int block_sigchld)
465 {
466   if (!sigchld_happened)
467     {
468       return;
469     }
470
471 #ifdef EMACS_BLOCK_SIGNAL
472   if (block_sigchld)
473     EMACS_BLOCK_SIGNAL (SIGCHLD);
474 #endif
475
476   while (sigchld_happened)
477     {
478       int pid;
479       int w;
480
481       /* Keep trying to get a status until we get a definitive result.  */
482       do
483         {
484           errno = 0;
485 #ifdef WNOHANG
486 #  ifndef WUNTRACED
487 #    define WUNTRACED 0
488 #  endif /* not WUNTRACED */
489 #  ifdef HAVE_WAITPID
490           pid = waitpid ((pid_t) -1, &w, WNOHANG | WUNTRACED);
491 #  else
492           pid = wait3 (&w, WNOHANG | WUNTRACED, 0);
493 #  endif
494 #else /* not WNOHANG */
495           pid = wait (&w);
496 #endif /* not WNOHANG */
497         }
498       while (pid <= 0 && errno == EINTR);
499
500       if (pid <= 0)
501         break;
502
503       if (exited_processes_index < MAX_EXITED_PROCESSES)
504         {
505           exited_processes[exited_processes_index] = pid;
506           exited_processes_status[exited_processes_index] = w;
507           exited_processes_index++;
508         }
509
510       /* On systems with WNOHANG, we just ignore the number
511          of times that SIGCHLD was signalled, and keep looping
512          until there are no more processes to wait on.  If we
513          don't have WNOHANG, we have to rely on the count in
514          SIGCHLD_HAPPENED. */
515 #ifndef WNOHANG
516       sigchld_happened--;
517 #endif /* not WNOHANG */
518     }
519
520   sigchld_happened = 0;
521
522   if (block_sigchld)
523     EMACS_UNBLOCK_SIGNAL (SIGCHLD);
524 }
525
526 /* For any processes that have changed status and are recorded
527    and such, update the corresponding struct Lisp_Process.
528    We separate this from record_exited_processes() so that
529    we never have to call this function from within a signal
530    handler.  We block SIGCHLD in case record_exited_processes()
531    is called from a signal handler. */
532
533 /** USG WARNING:  Although it is not obvious from the documentation
534  in signal(2), on a USG system the SIGCLD handler MUST NOT call
535  signal() before executing at least one wait(), otherwise the handler
536  will be called again, resulting in an infinite loop.  The relevant
537  portion of the documentation reads "SIGCLD signals will be queued
538  and the signal-catching function will be continually reentered until
539  the queue is empty".  Invoking signal() causes the kernel to reexamine
540  the SIGCLD queue.   Fred Fish, UniSoft Systems Inc.
541
542  (Note that now this only applies in SYS V Release 2 and before.
543  On SYS V Release 3, we use sigset() to set the signal handler for
544  the first time, and so we don't have to reestablish the signal handler
545  in the handler below.  On SYS V Release 4, we don't get this weirdo
546  behavior when we use sigaction(), which we do use.) */
547
548 static SIGTYPE
549 sigchld_handler (int signo)
550 {
551 #ifdef OBNOXIOUS_SYSV_SIGCLD_BEHAVIOR
552   int old_errno = errno;
553
554   sigchld_happened++;
555   record_exited_processes (0);
556   errno = old_errno;
557 #else
558   sigchld_happened++;
559 #endif
560 #ifdef HAVE_UNIXOID_EVENT_LOOP
561   signal_fake_event ();
562 #endif
563   /* WARNING - must come after wait3() for USG systems */
564   EMACS_REESTABLISH_SIGNAL (signo, sigchld_handler);
565   SIGRETURN;
566 }
567
568 #endif /* SIGCHLD */
569
570 #ifdef SIGNALS_VIA_CHARACTERS
571 /* Get signal character to send to process if SIGNALS_VIA_CHARACTERS */
572
573 static int
574 process_signal_char (int tty_fd, int signo)
575 {
576   /* If it's not a tty, pray that these default values work */
577   if (!isatty(tty_fd)) {
578 #define CNTL(ch) (037 & (ch))
579     switch (signo)
580       {
581       case SIGINT:  return CNTL('C');
582       case SIGQUIT: return CNTL('\\');
583 #ifdef SIGTSTP
584       case SIGTSTP: return CNTL('Z');
585 #endif
586       }
587   }
588
589 #ifdef HAVE_TERMIOS
590   /* TERMIOS is the latest and bestest, and seems most likely to work.
591      If the system has it, use it. */
592   {
593     struct termios t;
594     tcgetattr (tty_fd, &t);
595     switch (signo)
596       {
597       case SIGINT:  return t.c_cc[VINTR];
598       case SIGQUIT: return t.c_cc[VQUIT];
599 #if defined(SIGTSTP) && defined(VSUSP)
600       case SIGTSTP: return t.c_cc[VSUSP];
601 #endif
602       }
603   }
604
605 # elif defined (TIOCGLTC) && defined (TIOCGETC) /* not HAVE_TERMIOS */
606   {
607     /* On Berkeley descendants, the following IOCTL's retrieve the
608        current control characters.  */
609     struct tchars c;
610     struct ltchars lc;
611     switch (signo)
612       {
613       case SIGINT:  ioctl (tty_fd, TIOCGETC, &c);  return c.t_intrc;
614       case SIGQUIT: ioctl (tty_fd, TIOCGETC, &c);  return c.t_quitc;
615 #  ifdef SIGTSTP
616       case SIGTSTP: ioctl (tty_fd, TIOCGLTC, &lc); return lc.t_suspc;
617 #  endif /* SIGTSTP */
618       }
619   }
620
621 # elif defined (TCGETA) /* ! defined (TIOCGLTC) && defined (TIOCGETC) */
622   {
623     /* On SYSV descendants, the TCGETA ioctl retrieves the current
624        control characters.  */
625     struct termio t;
626     ioctl (tty_fd, TCGETA, &t);
627     switch (signo) {
628     case SIGINT:  return t.c_cc[VINTR];
629     case SIGQUIT: return t.c_cc[VQUIT];
630 #  ifdef SIGTSTP
631     case SIGTSTP: return t.c_cc[VSWTCH];
632 #  endif /* SIGTSTP */
633     }
634   }
635 # else /* ! defined (TCGETA) */
636 #error ERROR! Using SIGNALS_VIA_CHARACTERS, but not HAVE_TERMIOS || (TIOCGLTC && TIOCGETC) || TCGETA
637   /* If your system configuration files define SIGNALS_VIA_CHARACTERS,
638      you'd better be using one of the alternatives above!  */
639 # endif /* ! defined (TCGETA) */
640   return '\0';
641 }
642 #endif /* SIGNALS_VIA_CHARACTERS */
643
644
645
646 \f
647 /**********************************************************************/
648 /*              Process implementation methods                        */
649 /**********************************************************************/
650
651 /*
652  * Allocate and initialize Lisp_Process->process_data
653  */
654
655 static void
656 unix_alloc_process_data (struct Lisp_Process *p)
657 {
658   p->process_data = xnew (struct unix_process_data);
659
660   UNIX_DATA(p)->connected_via_filedesc_p = 0;
661   UNIX_DATA(p)->infd   = -1;
662   UNIX_DATA(p)->subtty = -1;
663   UNIX_DATA(p)->tty_name = Qnil;
664   UNIX_DATA(p)->pty_flag = 0;
665 }
666
667 /*
668  * Mark any Lisp objects in Lisp_Process->process_data
669  */
670
671 static void
672 unix_mark_process_data (struct Lisp_Process *proc,
673                         void (*markobj) (Lisp_Object))
674 {
675   ((markobj) (UNIX_DATA(proc)->tty_name));
676 }
677
678 /*
679  * Initialize XEmacs process implemenation once
680  */
681
682 #ifdef SIGCHLD
683 static void
684 unix_init_process (void)
685 {
686 #ifndef CANNOT_DUMP
687   if (! noninteractive || initialized)
688 #endif
689     signal (SIGCHLD, sigchld_handler);
690 }
691 #endif /* SIGCHLD */
692
693 /*
694  * Initialize any process local data. This is called when newly
695  * created process is connected to real OS file handles. The
696  * handles are generally represented by void* type, but are
697  * of type int (file descriptors) for UNIX
698  */
699
700 static void
701 unix_init_process_io_handles (struct Lisp_Process *p, void* in, void* out, int flags)
702 {
703   UNIX_DATA(p)->infd = (int)in;
704 }
705
706 /*
707  * Fork off a subprocess. P is a pointer to newly created subprocess
708  * object. If this function signals, the caller is responsible for
709  * deleting (and finalizing) the process object.
710  *
711  * The method must return PID of the new proces, a (positive??? ####) number
712  * which fits into Lisp_Int. No return value indicates an error, the method
713  * must signal an error instead.
714  */
715
716 static int
717 unix_create_process (struct Lisp_Process *p,
718                      Lisp_Object *argv, int nargv,
719                      Lisp_Object program, Lisp_Object cur_dir)
720 {
721   /* This function rewritten by ben@xemacs.org. */
722
723   int pid, inchannel, outchannel;
724   /* Use volatile to protect variables from being clobbered by longjmp.  */
725   volatile int forkin, forkout;
726   volatile int pty_flag = 0;
727   char **env;
728   char **new_argv;
729   char *current_dir;
730   int i;
731
732   env = environ;
733
734   inchannel = outchannel = forkin = forkout = -1;
735
736   /* Nothing below here GCs so our string pointers shouldn't move. */
737   new_argv = alloca_array (char *, nargv + 2);
738   new_argv[0] = (char *) XSTRING_DATA (program);
739   for (i = 0; i < nargv; i++)
740     {
741       Lisp_Object tem = argv[i];
742       CHECK_STRING (tem);
743       new_argv[i + 1] = (char *) XSTRING_DATA (tem);
744     }
745   new_argv[i + 1] = 0;
746   current_dir = (char *) XSTRING_DATA (cur_dir);
747
748 #ifdef HAVE_PTYS
749   if (!NILP (Vprocess_connection_type))
750     {
751       /* find a new pty, open the master side, return the opened
752          file handle, and store the name of the corresponding slave
753          side in global variable pty_name. */
754       outchannel = inchannel = allocate_pty ();
755     }
756
757   if (inchannel >= 0)
758     {
759       /* You're "supposed" to now open the slave in the child.
760          On some systems, we can open it here; this allows for
761          better error checking. */
762 #if !defined(USG)
763       /* On USG systems it does not work to open the pty's tty here
764                and then close and reopen it in the child.  */
765 #ifdef O_NOCTTY
766       /* Don't let this terminal become our controlling terminal
767          (in case we don't have one).  */
768       forkout = forkin = open (pty_name, O_RDWR | O_NOCTTY | OPEN_BINARY, 0);
769 #else
770       forkout = forkin = open (pty_name, O_RDWR | OPEN_BINARY, 0);
771 #endif
772       if (forkin < 0)
773         goto io_failure;
774 #endif /* not USG */
775       UNIX_DATA(p)->pty_flag = pty_flag = 1;
776     }
777   else
778 #endif /* HAVE_PTYS */
779     if (create_bidirectional_pipe (&inchannel, &outchannel,
780                                    &forkin, &forkout) < 0)
781       goto io_failure;
782
783 #if 0
784   /* Replaced by close_process_descs */
785   set_exclusive_use (inchannel);
786   set_exclusive_use (outchannel);
787 #endif
788
789   set_descriptor_non_blocking (inchannel);
790
791   /* Record this as an active process, with its channels.
792      As a result, child_setup will close Emacs's side of the pipes.  */
793   init_process_io_handles (p, (void*)inchannel, (void*)outchannel,
794                            pty_flag ? STREAM_PTY_FLUSHING : 0);
795   /* Record the tty descriptor used in the subprocess.  */
796   UNIX_DATA(p)->subtty = forkin;
797
798   {
799 #if !defined(__CYGWIN32__)
800     /* child_setup must clobber environ on systems with true vfork.
801        Protect it from permanent change.  */
802     char **save_environ = environ;
803 #endif
804
805 #ifdef EMACS_BTL
806     /* when performance monitoring is on, turn it off before the vfork(),
807        as the child has no handler for the signal -- when back in the
808        parent process, turn it back on if it was really on when you "turned
809        it off" */
810     int logging_on = cadillac_stop_logging ();  /* #### rename me */
811 #endif
812
813     pid = fork ();
814     if (pid == 0)
815       {
816         /**** Now we're in the child process ****/
817         int xforkin = forkin;
818         int xforkout = forkout;
819
820         if (!pty_flag)
821           EMACS_SEPARATE_PROCESS_GROUP ();
822 #ifdef HAVE_PTYS
823         else
824           {
825             /* Disconnect the current controlling terminal, pursuant to
826                making the pty be the controlling terminal of the process.
827                Also put us in our own process group. */
828
829             disconnect_controlling_terminal ();
830
831             /* Open the pty connection and make the pty's terminal
832                our controlling terminal.
833
834                On systems with TIOCSCTTY, we just use it to set
835                the controlling terminal.  On other systems, the
836                first TTY we open becomes the controlling terminal.
837                So, we end up with four possibilities:
838
839                (1) on USG and TIOCSCTTY systems, we open the pty
840                    and use TIOCSCTTY.
841                (2) on other USG systems, we just open the pty.
842                (3) on non-USG systems with TIOCSCTTY, we
843                    just use TIOCSCTTY. (On non-USG systems, we
844                    already opened the pty in the parent process.)
845                (4) on non-USG systems without TIOCSCTTY, we
846                    close the pty and reopen it.
847
848                This would be cleaner if we didn't open the pty
849                in the parent process, but doing it that way
850                makes it possible to trap error conditions.
851                It's harder to convey an error from the child
852                process, and I don't feel like messing with
853                this now. */
854
855             /* There was some weirdo, probably wrong,
856                conditionalization on RTU and UNIPLUS here.
857                I deleted it.  So sue me. */
858
859             /* SunOS has TIOCSCTTY but the close/open method
860                also works. */
861
862 #  if defined (USG) || !defined (TIOCSCTTY)
863             /* Now close the pty (if we had it open) and reopen it.
864                This makes the pty the controlling terminal of the
865                subprocess.  */
866             /* I wonder if close (open (pty_name, ...)) would work?  */
867             if (xforkin >= 0)
868               close (xforkin);
869             xforkout = xforkin = open (pty_name, O_RDWR | OPEN_BINARY, 0);
870             if (xforkin < 0)
871               {
872                 write (1, "Couldn't open the pty terminal ", 31);
873                 write (1, pty_name, strlen (pty_name));
874                 write (1, "\n", 1);
875                 _exit (1);
876               }
877 #  endif /* USG or not TIOCSCTTY */
878
879             /* Miscellaneous setup required for some systems.
880                Must be done before using tc* functions on xforkin.
881                This guarantees that isatty(xforkin) is true. */
882
883 # ifdef SETUP_SLAVE_PTY
884             SETUP_SLAVE_PTY;
885 # endif /* SETUP_SLAVE_PTY */
886
887 #  ifdef TIOCSCTTY
888             /* We ignore the return value
889                because faith@cs.unc.edu says that is necessary on Linux.  */
890             assert (isatty (xforkin));
891             ioctl (xforkin, TIOCSCTTY, 0);
892 #  endif /* TIOCSCTTY */
893
894             /* Change the line discipline. */
895
896 # if defined (HAVE_TERMIOS) && defined (LDISC1)
897             {
898               struct termios t;
899               assert (isatty (xforkin));
900               tcgetattr (xforkin, &t);
901               t.c_lflag = LDISC1;
902               if (tcsetattr (xforkin, TCSANOW, &t) < 0)
903                 perror ("create_process/tcsetattr LDISC1 failed\n");
904             }
905 # elif defined (NTTYDISC) && defined (TIOCSETD)
906             {
907               /* Use new line discipline.  TIOCSETD is accepted and
908                  ignored on Sys5.4 systems with ttcompat. */
909               int ldisc = NTTYDISC;
910               assert (isatty (xforkin));
911               ioctl (xforkin, TIOCSETD, &ldisc);
912             }
913 # endif /* TIOCSETD & NTTYDISC */
914
915             /* Make our process group be the foreground group
916                of our new controlling terminal. */
917
918             {
919               int piddly = EMACS_GET_PROCESS_GROUP ();
920               EMACS_SET_TTY_PROCESS_GROUP (xforkin, &piddly);
921             }
922
923 # ifdef AIX
924             /* On AIX, we've disabled SIGHUP above once we start a
925                child on a pty.  Now reenable it in the child, so it
926                will die when we want it to.  */
927             signal (SIGHUP, SIG_DFL);
928 # endif /* AIX */
929           }
930 #endif /* HAVE_PTYS */
931
932         signal (SIGINT, SIG_DFL);
933         signal (SIGQUIT, SIG_DFL);
934
935         if (pty_flag)
936           {
937             /* Set up the terminal characteristics of the pty. */
938             child_setup_tty (xforkout);
939           }
940
941         child_setup (xforkin, xforkout, xforkout, new_argv, current_dir);
942       }
943 #ifdef EMACS_BTL
944     else if (logging_on)
945       cadillac_start_logging ();        /* #### rename me */
946 #endif
947
948 #if !defined(__CYGWIN32__)
949     environ = save_environ;
950 #endif
951   }
952
953   if (pid < 0)
954     {
955       close_descriptor_pair (forkin, forkout);
956       report_file_error ("Doing fork", Qnil);
957     }
958
959   /* #### dmoore - why is this commented out, otherwise we leave
960      subtty = forkin, but then we close forkin just below. */
961   /* UNIX_DATA(p)->subtty = -1; */
962
963   /* If the subfork execv fails, and it exits,
964      this close hangs.  I don't know why.
965      So have an interrupt jar it loose.  */
966   if (forkin >= 0)
967     close_safely (forkin);
968   if (forkin != forkout && forkout >= 0)
969     close (forkout);
970
971 #ifdef HAVE_PTYS
972   if (pty_flag)
973     UNIX_DATA (p)->tty_name = build_string (pty_name);
974   else
975 #endif
976     UNIX_DATA (p)->tty_name = Qnil;
977
978   /* Notice that SIGCHLD was not blocked. (This is not possible on
979      some systems.) No biggie if SIGCHLD occurs right around the
980      time that this call happens, because SIGCHLD() does not actually
981      deselect the process (that doesn't occur until the next time
982      we're waiting for an event, when status_notify() is called). */
983   return pid;
984
985 io_failure:
986   {
987     int temp = errno;
988     close_descriptor_pair (forkin, forkout);
989     close_descriptor_pair (inchannel, outchannel);
990     errno = temp;
991     report_file_error ("Opening pty or pipe", Qnil);
992   }
993
994   RETURN_NOT_REACHED (0);
995 }
996
997 /*
998  * Return nonzero if this process is a ToolTalk connection.
999  */
1000
1001 static int
1002 unix_tooltalk_connection_p (struct Lisp_Process *p)
1003 {
1004   return UNIX_DATA(p)->connected_via_filedesc_p;
1005 }
1006
1007 /*
1008  * This is called to set process' virtual terminal size
1009  */
1010
1011 static int
1012 unix_set_window_size (struct Lisp_Process* p, int cols, int rows)
1013 {
1014   return set_window_size (UNIX_DATA(p)->infd, cols, rows);
1015 }
1016
1017 /*
1018  * This method is called to update status fields of the process
1019  * structure. If the process has not existed, this method is
1020  * expected to do nothing.
1021  *
1022  * The method is called only for real child processes.
1023  */
1024
1025 #ifdef HAVE_WAITPID
1026 static void
1027 unix_update_status_if_terminated (struct Lisp_Process* p)
1028 {
1029   int w;
1030 #ifdef SIGCHLD
1031   EMACS_BLOCK_SIGNAL (SIGCHLD);
1032 #endif
1033   if (waitpid (XINT (p->pid), &w, WNOHANG) == XINT (p->pid))
1034     {
1035       p->tick++;
1036       update_status_from_wait_code (p, &w);
1037     }
1038 #ifdef SIGCHLD
1039   EMACS_UNBLOCK_SIGNAL (SIGCHLD);
1040 #endif
1041 }
1042 #endif
1043
1044 /*
1045  * Update status of all exited processes. Called when SIGCLD has signaled.
1046  */
1047
1048 #ifdef SIGCHLD
1049 static void
1050 unix_reap_exited_processes (void)
1051 {
1052   int i;
1053   struct Lisp_Process *p;
1054
1055 #ifndef OBNOXIOUS_SYSV_SIGCLD_BEHAVIOR
1056   record_exited_processes (1);
1057 #endif
1058
1059   if (exited_processes_index <= 0)
1060     {
1061       return;
1062     }
1063
1064 #ifdef  EMACS_BLOCK_SIGNAL
1065   EMACS_BLOCK_SIGNAL (SIGCHLD);
1066 #endif
1067   for (i = 0; i < exited_processes_index; i++)
1068     {
1069       int pid = exited_processes[i];
1070       int w = exited_processes_status[i];
1071
1072       /* Find the process that signaled us, and record its status.  */
1073
1074       p = 0;
1075       {
1076         Lisp_Object tail;
1077         LIST_LOOP (tail, Vprocess_list)
1078           {
1079             Lisp_Object proc = XCAR (tail);
1080             p = XPROCESS (proc);
1081             if (INTP (p->pid) && XINT (p->pid) == pid)
1082               break;
1083             p = 0;
1084           }
1085       }
1086
1087       if (p)
1088         {
1089           /* Change the status of the process that was found.  */
1090           p->tick++;
1091           process_tick++;
1092           update_status_from_wait_code (p, &w);
1093
1094           /* If process has terminated, stop waiting for its output.  */
1095           if (WIFSIGNALED (w) || WIFEXITED (w))
1096             {
1097               if (!NILP(p->pipe_instream))
1098                 {
1099                   /* We can't just call event_stream->unselect_process_cb (p)
1100                      here, because that calls XtRemoveInput, which is not
1101                      necessarily reentrant, so we can't call this at interrupt
1102                      level.
1103                    */
1104                 }
1105             }
1106         }
1107       else
1108         {
1109           /* There was no asynchronous process found for that id.  Check
1110              if we have a synchronous process. Only set sync process status
1111              if there is one, so we work OK with the waitpid() call in
1112              wait_for_termination(). */
1113           if (synch_process_alive != 0)
1114             { /* Set the global sync process status variables. */
1115               synch_process_alive = 0;
1116
1117               /* Report the status of the synchronous process.  */
1118               if (WIFEXITED (w))
1119                 synch_process_retcode = WEXITSTATUS (w);
1120               else if (WIFSIGNALED (w))
1121                 synch_process_death = signal_name (WTERMSIG (w));
1122             }
1123         }
1124     }
1125
1126   exited_processes_index = 0;
1127
1128   EMACS_UNBLOCK_SIGNAL (SIGCHLD);
1129 }
1130 #endif /* SIGCHLD */
1131
1132 /*
1133  * Stuff the entire contents of LSTREAM to the process ouptut pipe
1134  */
1135
1136 static JMP_BUF send_process_frame;
1137
1138 static SIGTYPE
1139 send_process_trap (int signum)
1140 {
1141   EMACS_REESTABLISH_SIGNAL (signum, send_process_trap);
1142   EMACS_UNBLOCK_SIGNAL (signum);
1143   LONGJMP (send_process_frame, 1);
1144 }
1145
1146 static void
1147 unix_send_process (Lisp_Object proc, struct lstream* lstream)
1148 {
1149   /* Use volatile to protect variables from being clobbered by longjmp.  */
1150   SIGTYPE (*volatile old_sigpipe) (int) = 0;
1151   volatile Lisp_Object vol_proc = proc;
1152   struct Lisp_Process *volatile p = XPROCESS (proc);
1153
1154   if (!SETJMP (send_process_frame))
1155     {
1156       /* use a reasonable-sized buffer (somewhere around the size of the
1157          stream buffer) so as to avoid inundating the stream with blocked
1158          data. */
1159       Bufbyte chunkbuf[512];
1160       Bytecount chunklen;
1161
1162       while (1)
1163         {
1164           int writeret;
1165
1166           chunklen = Lstream_read (lstream, chunkbuf, 512);
1167           if (chunklen <= 0)
1168             break; /* perhaps should abort() if < 0?
1169                       This should never happen. */
1170           old_sigpipe =
1171             (SIGTYPE (*) (int)) signal (SIGPIPE, send_process_trap);
1172           /* Lstream_write() will never successfully write less than
1173              the amount sent in.  In the worst case, it just buffers
1174              the unwritten data. */
1175           writeret = Lstream_write (XLSTREAM (DATA_OUTSTREAM(p)), chunkbuf,
1176                                     chunklen);
1177           signal (SIGPIPE, old_sigpipe);
1178           if (writeret < 0)
1179             /* This is a real error.  Blocking errors are handled
1180                specially inside of the filedesc stream. */
1181             report_file_error ("writing to process",
1182                                list1 (vol_proc));
1183           while (Lstream_was_blocked_p (XLSTREAM (p->pipe_outstream)))
1184             {
1185               /* Buffer is full.  Wait, accepting input;
1186                  that may allow the program
1187                  to finish doing output and read more.  */
1188               Faccept_process_output (Qnil, make_int (1), Qnil);
1189               old_sigpipe =
1190                 (SIGTYPE (*) (int)) signal (SIGPIPE, send_process_trap);
1191               Lstream_flush (XLSTREAM (p->pipe_outstream));
1192               signal (SIGPIPE, old_sigpipe);
1193             }
1194         }
1195     }
1196   else
1197     { /* We got here from a longjmp() from the SIGPIPE handler */
1198       signal (SIGPIPE, old_sigpipe);
1199       p->status_symbol = Qexit;
1200       p->exit_code = 256; /* #### SIGPIPE ??? */
1201       p->core_dumped = 0;
1202       p->tick++;
1203       process_tick++;
1204       deactivate_process (vol_proc);
1205       error ("SIGPIPE raised on process %s; closed it",
1206              XSTRING_DATA (p->name));
1207     }
1208
1209   old_sigpipe = (SIGTYPE (*) (int)) signal (SIGPIPE, send_process_trap);
1210   Lstream_flush (XLSTREAM (DATA_OUTSTREAM(p)));
1211   signal (SIGPIPE, old_sigpipe);
1212 }
1213
1214 /*
1215  * Send EOF to the process. The default implementation simply
1216  * closes the output stream. The method must return 0 to call
1217  * the default implementation, or 1 if it has taken all care about
1218  * sending EOF to the process.
1219  */
1220
1221 static int
1222 unix_process_send_eof (Lisp_Object proc)
1223 {
1224   if (!UNIX_DATA (XPROCESS (proc))->pty_flag)
1225     return 0;
1226
1227   /* #### get_eof_char simply doesn't return the correct character
1228      here.  Maybe it is needed to determine the right eof
1229      character in init_process_io_handles but here it simply screws
1230      things up. */
1231 #if 0
1232   Bufbyte eof_char = get_eof_char (XPROCESS (proc));
1233   send_process (proc, Qnil, &eof_char, 0, 1);
1234 #else
1235   send_process (proc, Qnil, (CONST Bufbyte *) "\004", 0, 1);
1236 #endif
1237   return 1;
1238 }
1239
1240 /*
1241  * Called before the process is deactivated. The process object
1242  * is not immediately finalized, just undergoes a transition to
1243  * inactive state.
1244  *
1245  * The return value is a unique stream ID, as returned by
1246  * event_stream_delete_stream_pair
1247  *
1248  * In the lack of this method, only event_stream_delete_stream_pair
1249  * is called on both I/O streams of the process.
1250  *
1251  * The UNIX version quards this by ignoring possible SIGPIPE.
1252  */
1253
1254 static USID
1255 unix_deactivate_process (struct Lisp_Process *p)
1256 {
1257   SIGTYPE (*old_sigpipe) (int) = 0;
1258   USID usid;
1259
1260   if (UNIX_DATA(p)->infd >= 0)
1261     flush_pending_output (UNIX_DATA(p)->infd);
1262
1263   /* closing the outstream could result in SIGPIPE, so ignore it. */
1264   old_sigpipe = (SIGTYPE (*) (int)) signal (SIGPIPE, SIG_IGN);
1265   usid = event_stream_delete_stream_pair (p->pipe_instream, p->pipe_outstream);
1266   signal (SIGPIPE, old_sigpipe);
1267
1268   UNIX_DATA(p)->infd  = -1;
1269
1270   return usid;
1271 }
1272
1273 /* send a signal number SIGNO to PROCESS.
1274    CURRENT_GROUP means send to the process group that currently owns
1275    the terminal being used to communicate with PROCESS.
1276    This is used for various commands in shell mode.
1277    If NOMSG is zero, insert signal-announcements into process's buffers
1278    right away.
1279
1280    If we can, we try to signal PROCESS by sending control characters
1281    down the pty.  This allows us to signal inferiors who have changed
1282    their uid, for which killpg would return an EPERM error.
1283
1284    The method signals an error if the given SIGNO is not valid
1285 */
1286
1287 static void
1288 unix_kill_child_process (Lisp_Object proc, int signo,
1289                          int current_group, int nomsg)
1290 {
1291   int gid;
1292   int no_pgrp = 0;
1293   int kill_retval;
1294   struct Lisp_Process *p = XPROCESS (proc);
1295
1296   if (!UNIX_DATA(p)->pty_flag)
1297     current_group = 0;
1298
1299   /* If we are using pgrps, get a pgrp number and make it negative.  */
1300   if (current_group)
1301     {
1302 #ifdef SIGNALS_VIA_CHARACTERS
1303       /* If possible, send signals to the entire pgrp
1304          by sending an input character to it.  */
1305       {
1306         char sigchar = process_signal_char(UNIX_DATA(p)->subtty, signo);
1307         if (sigchar) {
1308           send_process (proc, Qnil, (Bufbyte *) &sigchar, 0, 1);
1309           return;
1310         }
1311       }
1312 #endif /* ! defined (SIGNALS_VIA_CHARACTERS) */
1313
1314 #ifdef TIOCGPGRP
1315       /* Get the pgrp using the tty itself, if we have that.
1316          Otherwise, use the pty to get the pgrp.
1317          On pfa systems, saka@pfu.fujitsu.co.JP writes:
1318          "TIOCGPGRP symbol defined in sys/ioctl.h at E50.
1319          But, TIOCGPGRP does not work on E50 ;-P works fine on E60"
1320          His patch indicates that if TIOCGPGRP returns an error, then
1321          we should just assume that p->pid is also the process group id.  */
1322       {
1323         int err;
1324
1325         err = ioctl ( (UNIX_DATA(p)->subtty != -1
1326                        ? UNIX_DATA(p)->subtty
1327                        : UNIX_DATA(p)->infd), TIOCGPGRP, &gid);
1328
1329 #ifdef pfa
1330         if (err == -1)
1331           gid = - XINT (p->pid);
1332 #endif /* ! defined (pfa) */
1333       }
1334       if (gid == -1)
1335         no_pgrp = 1;
1336       else
1337         gid = - gid;
1338 #else /* ! defined (TIOCGPGRP ) */
1339       /* Can't select pgrps on this system, so we know that
1340          the child itself heads the pgrp.  */
1341       gid = - XINT (p->pid);
1342 #endif /* ! defined (TIOCGPGRP ) */
1343     }
1344   else
1345     gid = - XINT (p->pid);
1346
1347   switch (signo)
1348     {
1349 #ifdef SIGCONT
1350     case SIGCONT:
1351       p->status_symbol = Qrun;
1352       p->exit_code = 0;
1353       p->tick++;
1354       process_tick++;
1355       if (!nomsg)
1356         status_notify ();
1357       break;
1358 #endif /* ! defined (SIGCONT) */
1359     case SIGINT:
1360     case SIGQUIT:
1361     case SIGKILL:
1362       flush_pending_output (UNIX_DATA(p)->infd);
1363       break;
1364     }
1365
1366   /* If we don't have process groups, send the signal to the immediate
1367      subprocess.  That isn't really right, but it's better than any
1368      obvious alternative.  */
1369   if (no_pgrp)
1370     {
1371       kill_retval = kill (XINT (p->pid), signo) ? errno : 0;
1372     }
1373   else
1374     {
1375       /* gid may be a pid, or minus a pgrp's number */
1376 #if defined (TIOCSIGNAL) || defined (TIOCSIGSEND)
1377       if (current_group)
1378         {
1379 #ifdef TIOCSIGNAL
1380           kill_retval = ioctl (UNIX_DATA(p)->infd, TIOCSIGNAL, signo);
1381 #else /* ! defined (TIOCSIGNAL) */
1382           kill_retval = ioctl (UNIX_DATA(p)->infd, TIOCSIGSEND, signo);
1383 #endif /* ! defined (TIOCSIGNAL) */
1384         }
1385       else
1386         kill_retval = kill (- XINT (p->pid), signo) ? errno : 0;
1387 #else /* ! (defined (TIOCSIGNAL) || defined (TIOCSIGSEND)) */
1388       kill_retval = EMACS_KILLPG (-gid, signo) ? errno : 0;
1389 #endif /* ! (defined (TIOCSIGNAL) || defined (TIOCSIGSEND)) */
1390     }
1391
1392   if (kill_retval < 0 && errno == EINVAL)
1393     error ("Signal number %d is invalid for this system", signo);
1394 }
1395
1396 /*
1397  * Kill any process in the system given its PID.
1398  *
1399  * Returns zero if a signal successfully sent, or
1400  * negative number upon failure
1401  */
1402
1403 static int
1404 unix_kill_process_by_pid (int pid, int sigcode)
1405 {
1406   return kill (pid, sigcode);
1407 }
1408
1409 /*
1410  * Return TTY name used to communicate with subprocess
1411  */
1412
1413 static Lisp_Object
1414 unix_get_tty_name (struct Lisp_Process *p)
1415 {
1416   return UNIX_DATA (p)->tty_name;
1417 }
1418
1419 /*
1420  * Canonicalize host name HOST, and return its canonical form
1421  *
1422  * The default implemenation just takes HOST for a canonical name.
1423  */
1424
1425 #ifdef HAVE_SOCKETS
1426 static Lisp_Object
1427 unix_canonicalize_host_name (Lisp_Object host)
1428 {
1429   struct sockaddr_in address;
1430
1431   if (!get_internet_address (host, &address, ERROR_ME_NOT))
1432     return host;
1433
1434   if (address.sin_family == AF_INET)
1435     return build_string (inet_ntoa (address.sin_addr));
1436   else
1437     /* #### any clue what to do here? */
1438     return host;
1439 }
1440
1441 /* open a TCP network connection to a given HOST/SERVICE.  Treated
1442    exactly like a normal process when reading and writing.  Only
1443    differences are in status display and process deletion.  A network
1444    connection has no PID; you cannot signal it.  All you can do is
1445    deactivate and close it via delete-process */
1446
1447 static void
1448 unix_open_network_stream (Lisp_Object name, Lisp_Object host, Lisp_Object service,
1449                           Lisp_Object family, void** vinfd, void** voutfd)
1450 {
1451   struct sockaddr_in address;
1452   int s, inch, outch;
1453   volatile int port;
1454   volatile int retry = 0;
1455   int retval;
1456
1457   CHECK_STRING (host);
1458
1459   if (!EQ (family, Qtcpip))
1460     error ("Unsupported protocol family \"%s\"",
1461            string_data (symbol_name (XSYMBOL (family))));
1462
1463   if (INTP (service))
1464     port = htons ((unsigned short) XINT (service));
1465   else
1466     {
1467       struct servent *svc_info;
1468       CHECK_STRING (service);
1469       svc_info = getservbyname ((char *) XSTRING_DATA (service), "tcp");
1470       if (svc_info == 0)
1471         error ("Unknown service \"%s\"", XSTRING_DATA (service));
1472       port = svc_info->s_port;
1473     }
1474
1475   get_internet_address (host, &address, ERROR_ME);
1476   address.sin_port = port;
1477
1478   s = socket (address.sin_family, SOCK_STREAM, 0);
1479   if (s < 0)
1480     report_file_error ("error creating socket", list1 (name));
1481
1482   /* Turn off interrupts here -- see comments below.  There used to
1483      be code which called bind_polling_period() to slow the polling
1484      period down rather than turn it off, but that seems rather
1485      bogus to me.  Best thing here is to use a non-blocking connect
1486      or something, to check for QUIT. */
1487
1488   /* Comments that are not quite valid: */
1489
1490   /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
1491      when connect is interrupted.  So let's not let it get interrupted.
1492      Note we do not turn off polling, because polling is only used
1493      when not interrupt_input, and thus not normally used on the systems
1494      which have this bug.  On systems which use polling, there's no way
1495      to quit if polling is turned off.  */
1496
1497   /* Slow down polling.  Some kernels have a bug which causes retrying
1498      connect to fail after a connect.  */
1499
1500   slow_down_interrupts ();
1501
1502  loop:
1503
1504   /* A system call interrupted with a SIGALRM or SIGIO comes back
1505      here, with can_break_system_calls reset to 0. */
1506   SETJMP (break_system_call_jump);
1507   if (QUITP)
1508     {
1509       speed_up_interrupts ();
1510       REALLY_QUIT;
1511       /* In case something really weird happens ... */
1512       slow_down_interrupts ();
1513     }
1514
1515   /* Break out of connect with a signal (it isn't otherwise possible).
1516      Thus you don't get screwed with a hung network. */
1517   can_break_system_calls = 1;
1518   retval = connect (s, (struct sockaddr *) &address, sizeof (address));
1519   can_break_system_calls = 0;
1520   if (retval == -1 && errno != EISCONN)
1521     {
1522       int xerrno = errno;
1523       if (errno == EINTR)
1524         goto loop;
1525       if (errno == EADDRINUSE && retry < 20)
1526         {
1527           /* A delay here is needed on some FreeBSD systems,
1528              and it is harmless, since this retrying takes time anyway
1529              and should be infrequent.
1530              `sleep-for' allowed for quitting this loop with interrupts
1531              slowed down so it can't be used here.  Async timers should
1532              already be disabled at this point so we can use `sleep'. */
1533           sleep (1);
1534           retry++;
1535           goto loop;
1536         }
1537
1538       close (s);
1539
1540       speed_up_interrupts ();
1541
1542       errno = xerrno;
1543       report_file_error ("connection failed", list2 (host, name));
1544     }
1545
1546   speed_up_interrupts ();
1547
1548   inch = s;
1549   outch = dup (s);
1550   if (outch < 0)
1551     {
1552       close (s); /* this used to be leaked; from Kyle Jones */
1553       report_file_error ("error duplicating socket", list1 (name));
1554     }
1555
1556   set_socket_nonblocking_maybe (inch, port, "tcp");
1557
1558   *vinfd = (void*)inch;
1559   *voutfd = (void*)outch;
1560 }
1561
1562
1563 #ifdef HAVE_MULTICAST
1564
1565 /* Didier Verna <verna@inf.enst.fr> Nov. 28 1997.
1566
1567    This function is similar to open-network-stream-internal, but provides a
1568    mean to open an UDP multicast connection instead of a TCP one. Like in the
1569    TCP case, the multicast connection will be seen as a sub-process,
1570
1571    Some notes:
1572    - Normaly, we should use sendto and recvfrom with non connected
1573    sockets. The current code doesn't allow us to do this. In the future, it
1574    would be a good idea to extend the process data structure in order to deal
1575    properly with the different types network connections.
1576    - For the same reason, when leaving a multicast group, it is better to make
1577    a setsockopt - IP_DROP_MEMBERSHIP before closing the descriptors.
1578    Unfortunately, this can't be done here because delete_process doesn't know
1579    about the kind of connection we have. However, this is not such an
1580    important issue.
1581 */
1582
1583 static void
1584 unix_open_multicast_group (Lisp_Object name, Lisp_Object dest, Lisp_Object port,
1585                            Lisp_Object ttl, void** vinfd, void** voutfd)
1586 {
1587   struct ip_mreq imr;
1588   struct sockaddr_in sa;
1589   struct protoent *udp;
1590   int ws, rs;
1591   int theport;
1592   unsigned char thettl;
1593   int one = 1; /* For REUSEADDR */
1594   int ret;
1595   volatile int retry = 0;
1596
1597   CHECK_STRING (dest);
1598
1599   CHECK_NATNUM (port);
1600   theport = htons ((unsigned short) XINT (port));
1601
1602   CHECK_NATNUM (ttl);
1603   thettl = (unsigned char) XINT (ttl);
1604
1605   if ((udp = getprotobyname ("udp")) == NULL)
1606     error ("No info available for UDP protocol");
1607
1608   /* Init the sockets. Yes, I need 2 sockets. I couldn't duplicate one. */
1609   if ((rs = socket (PF_INET, SOCK_DGRAM, udp->p_proto)) < 0)
1610     report_file_error ("error creating socket", list1(name));
1611   if ((ws = socket (PF_INET, SOCK_DGRAM, udp->p_proto)) < 0)
1612     {
1613       close (rs);
1614       report_file_error ("error creating socket", list1(name));
1615     }
1616
1617   /* This will be used for both sockets */
1618   memset (&sa, 0, sizeof(sa));
1619   sa.sin_family = AF_INET;
1620   sa.sin_port = theport;
1621   sa.sin_addr.s_addr = htonl (inet_addr ((char *) XSTRING_DATA (dest)));
1622
1623   /* Socket configuration for reading ------------------------ */
1624
1625   /* Multiple connections from the same machine. This must be done before
1626      bind. If it fails, it shouldn't be fatal. The only consequence is that
1627      people won't be able to connect twice from the same machine. */
1628   if (setsockopt (rs, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof (one))
1629       < 0)
1630     warn_when_safe (Qmulticast, Qwarning, "Cannot reuse socket address");
1631
1632   /* bind socket name */
1633   if (bind (rs, (struct sockaddr *)&sa, sizeof(sa)))
1634     {
1635       close (rs);
1636       close (ws);
1637       report_file_error ("error binding socket", list2(name, port));
1638     }
1639
1640   /* join multicast group */
1641   imr.imr_multiaddr.s_addr = htonl (inet_addr ((char *) XSTRING_DATA (dest)));
1642   imr.imr_interface.s_addr = htonl (INADDR_ANY);
1643   if (setsockopt (rs, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1644                  (char *) &imr, sizeof (struct ip_mreq)) < 0)
1645     {
1646       close (ws);
1647       close (rs);
1648       report_file_error ("error adding membership", list2(name, dest));
1649     }
1650
1651   /* Socket configuration for writing ----------------------- */
1652
1653   /* Normaly, there's no 'connect' in multicast, since we use preferentialy
1654      'sendto' and 'recvfrom'. However, in order to handle this connection in
1655      the process-like way it is done for TCP, we must be able to use 'write'
1656      instead of 'sendto'. Consequently, we 'connect' this socket. */
1657
1658   /* See open-network-stream-internal for comments on this part of the code */
1659   slow_down_interrupts ();
1660
1661  loop:
1662
1663   /* A system call interrupted with a SIGALRM or SIGIO comes back
1664      here, with can_break_system_calls reset to 0. */
1665   SETJMP (break_system_call_jump);
1666   if (QUITP)
1667     {
1668       speed_up_interrupts ();
1669       REALLY_QUIT;
1670       /* In case something really weird happens ... */
1671       slow_down_interrupts ();
1672     }
1673
1674   /* Break out of connect with a signal (it isn't otherwise possible).
1675      Thus you don't get screwed with a hung network. */
1676   can_break_system_calls = 1;
1677   ret = connect (ws, (struct sockaddr *) &sa, sizeof (sa));
1678   can_break_system_calls = 0;
1679   if (ret == -1 && errno != EISCONN)
1680     {
1681       int xerrno = errno;
1682
1683       if (errno == EINTR)
1684         goto loop;
1685       if (errno == EADDRINUSE && retry < 20)
1686         {
1687           /* A delay here is needed on some FreeBSD systems,
1688              and it is harmless, since this retrying takes time anyway
1689              and should be infrequent.
1690              `sleep-for' allowed for quitting this loop with interrupts
1691              slowed down so it can't be used here.  Async timers should
1692              already be disabled at this point so we can use `sleep'. */
1693           sleep (1);
1694           retry++;
1695           goto loop;
1696         }
1697
1698       close (rs);
1699       close (ws);
1700       speed_up_interrupts ();
1701
1702       errno = xerrno;
1703       report_file_error ("error connecting socket", list2(name, port));
1704     }
1705
1706   speed_up_interrupts ();
1707
1708   /* scope */
1709   if (setsockopt (ws, IPPROTO_IP, IP_MULTICAST_TTL,
1710                   (char *) &thettl, sizeof (thettl)) < 0)
1711     {
1712       close (rs);
1713       close (ws);
1714       report_file_error ("error setting ttl", list2(name, ttl));
1715     }
1716
1717   set_socket_nonblocking_maybe (rs, theport, "udp");
1718
1719   *vinfd = (void*)rs;
1720   *voutfd = (void*)ws;
1721 }
1722
1723 #endif /* HAVE_MULTICAST */
1724
1725 #endif /* HAVE_SOCKETS */
1726
1727 \f
1728 /**********************************************************************/
1729 /*                            Initialization                          */
1730 /**********************************************************************/
1731
1732 void
1733 process_type_create_unix (void)
1734 {
1735   PROCESS_HAS_METHOD (unix, alloc_process_data);
1736   PROCESS_HAS_METHOD (unix, mark_process_data);
1737 #ifdef SIGCHLD
1738   PROCESS_HAS_METHOD (unix, init_process);
1739   PROCESS_HAS_METHOD (unix, reap_exited_processes);
1740 #endif
1741   PROCESS_HAS_METHOD (unix, init_process_io_handles);
1742   PROCESS_HAS_METHOD (unix, create_process);
1743   PROCESS_HAS_METHOD (unix, tooltalk_connection_p);
1744   PROCESS_HAS_METHOD (unix, set_window_size);
1745 #ifdef HAVE_WAITPID
1746   PROCESS_HAS_METHOD (unix, update_status_if_terminated);
1747 #endif
1748   PROCESS_HAS_METHOD (unix, send_process);
1749   PROCESS_HAS_METHOD (unix, process_send_eof);
1750   PROCESS_HAS_METHOD (unix, deactivate_process);
1751   PROCESS_HAS_METHOD (unix, kill_child_process);
1752   PROCESS_HAS_METHOD (unix, kill_process_by_pid);
1753   PROCESS_HAS_METHOD (unix, get_tty_name);
1754 #ifdef HAVE_SOCKETS
1755   PROCESS_HAS_METHOD (unix, canonicalize_host_name);
1756   PROCESS_HAS_METHOD (unix, open_network_stream);
1757 #ifdef HAVE_MULTICAST
1758   PROCESS_HAS_METHOD (unix, open_multicast_group);
1759 #endif
1760 #endif
1761 }
1762
1763 void
1764 vars_of_process_unix (void)
1765 {
1766   Fprovide (intern ("unix-processes"));
1767 }
1768
1769 #endif /* !defined (NO_SUBPROCESSES) */