XEmacs 21.4.10 "Military Intelligence".
[chise/xemacs-chise.git.1] / src / process-unix.c
1 /* Asynchronous subprocess implementation 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 /* The IPv6 support is derived from the code for GNU Emacs-20.3
32    written by Wolfgang S. Rupprecht */
33
34 #include <config.h>
35
36 #if !defined (NO_SUBPROCESSES)
37
38 /* The entire file is within this conditional */
39
40 #include "lisp.h"
41
42 #include "buffer.h"
43 #include "events.h"
44 #include "frame.h"
45 #include "hash.h"
46 #include "lstream.h"
47 #include "opaque.h"
48 #include "process.h"
49 #include "procimpl.h"
50 #include "sysdep.h"
51 #include "window.h"
52 #ifdef FILE_CODING
53 #include "file-coding.h"
54 #endif
55
56 #include <setjmp.h>
57 #include "sysfile.h"
58 #include "sysproc.h"
59 #include "systime.h"
60 #include "syssignal.h" /* Always include before systty.h */
61 #include "systty.h"
62 #include "syswait.h"
63
64 #ifdef HPUX
65 #include <grp.h>                /* See grantpt fixups for HPUX below. */
66 #endif
67
68 /*
69  * Implementation-specific data. Pointed to by Lisp_Process->process_data
70  */
71
72 struct unix_process_data
73 {
74   /* Non-0 if this is really a ToolTalk channel. */
75   int connected_via_filedesc_p;
76   /* Descriptor by which we read from this process.  -1 for dead process */
77   int infd;
78   /* Descriptor for the tty which this process is using.
79      -1 if we didn't record it (on some systems, there's no need).  */
80   int subtty;
81   /* Name of subprocess terminal. */
82   Lisp_Object tty_name;
83   /* Non-false if communicating through a pty.  */
84   char pty_flag;
85 };
86
87 #define UNIX_DATA(p) ((struct unix_process_data*)((p)->process_data))
88
89
90 \f
91 /**********************************************************************/
92 /*                    Static helper routines                          */
93 /**********************************************************************/
94
95 static SIGTYPE
96 close_safely_handler (int signo)
97 {
98   EMACS_REESTABLISH_SIGNAL (signo, close_safely_handler);
99   SIGRETURN;
100 }
101
102 static void
103 close_safely (int fd)
104 {
105   stop_interrupts ();
106   signal (SIGALRM, close_safely_handler);
107   alarm (1);
108   close (fd);
109   alarm (0);
110   start_interrupts ();
111 }
112
113 static void
114 close_descriptor_pair (int in, int out)
115 {
116   if (in >= 0)
117     close (in);
118   if (out != in && out >= 0)
119     close (out);
120 }
121
122 /* Close all descriptors currently in use for communication
123    with subprocess.  This is used in a newly-forked subprocess
124    to get rid of irrelevant descriptors.  */
125
126 static int
127 close_process_descs_mapfun (const void* key, void* contents, void* arg)
128 {
129   Lisp_Object proc;
130   CVOID_TO_LISP (proc, contents);
131   event_stream_delete_stream_pair (XPROCESS(proc)->pipe_instream,
132                                    XPROCESS(proc)->pipe_outstream);
133   return 0;
134 }
135
136 /* #### This function is currently called from child_setup
137    in callproc.c. It should become static though - kkm */
138 void
139 close_process_descs (void)
140 {
141   maphash (close_process_descs_mapfun, usid_to_process, 0);
142 }
143
144 /* connect to an existing file descriptor.  This is very similar to
145    open-network-stream except that it assumes that the connection has
146    already been initialized.  It is currently used for ToolTalk
147    communication. */
148
149 /* This function used to be visible on the Lisp level, but there is no
150    real point in doing that.  Here is the doc string:
151
152   "Connect to an existing file descriptor.
153 Return a subprocess-object to represent the connection.
154 Input and output work as for subprocesses; `delete-process' closes it.
155 Args are NAME BUFFER INFD OUTFD.
156 NAME is name for process.  It is modified if necessary to make it unique.
157 BUFFER is the buffer (or buffer-name) to associate with the process.
158  Process output goes at end of that buffer, unless you specify
159  an output stream or filter function to handle the output.
160  BUFFER may also be nil, meaning that this process is not associated
161  with any buffer.
162 INFD and OUTFD specify the file descriptors to use for input and
163  output, respectively."
164 */
165
166 Lisp_Object
167 connect_to_file_descriptor (Lisp_Object name, Lisp_Object buffer,
168                             Lisp_Object infd, Lisp_Object outfd)
169 {
170   /* This function can GC */
171   Lisp_Object proc;
172   int inch;
173
174   CHECK_STRING (name);
175   CHECK_INT (infd);
176   CHECK_INT (outfd);
177
178   inch = XINT (infd);
179   if (get_process_from_usid (FD_TO_USID (inch)))
180     invalid_operation ("There is already a process connected to fd", infd);
181   if (!NILP (buffer))
182     buffer = Fget_buffer_create (buffer);
183   proc = make_process_internal (name);
184
185   XPROCESS (proc)->pid = Fcons (infd, name);
186   XPROCESS (proc)->buffer = buffer;
187   init_process_io_handles (XPROCESS (proc), (void*)inch, (void*)XINT (outfd),
188                            0);
189   UNIX_DATA (XPROCESS (proc))->connected_via_filedesc_p = 1;
190
191   event_stream_select_process (XPROCESS (proc));
192
193   return proc;
194 }
195
196 #ifdef HAVE_PTYS
197 static int allocate_pty_the_old_fashioned_way (void);
198
199 /* The file name of the (slave) pty opened by allocate_pty().  */
200 #ifndef MAX_PTYNAME_LEN
201 #define MAX_PTYNAME_LEN 64
202 #endif
203 static char pty_name[MAX_PTYNAME_LEN];
204
205 /* Open an available pty, returning a file descriptor.
206    Return -1 on failure.
207    The file name of the terminal corresponding to the pty
208    is left in the variable `pty_name'.  */
209
210 static int
211 allocate_pty (void)
212 {
213   /* Unix98 standardized grantpt, unlockpt, and ptsname, but not the
214      functions required to open a master pty in the first place :-(
215
216      Modern Unix systems all seems to have convenience methods to open
217      a master pty fd in one function call, but there is little
218      agreement on how to do it.
219
220      allocate_pty() tries all the different known easy ways of opening
221      a pty.  In case of failure, we resort to the old BSD-style pty
222      grovelling code in allocate_pty_the_old_fashioned_way(). */
223 #ifndef FORCE_ALLOCATE_PTY_THE_OLD_FASHIONED_WAY
224   int master_fd = -1;
225   const char *slave_name = NULL;
226   const char *clone = NULL;
227   static const char * const clones[] = /* Different pty master clone devices */
228     {
229       "/dev/ptmx",      /* Various systems */
230       "/dev/ptm/clone", /* HPUX */
231       "/dev/ptc",       /* AIX */
232       "/dev/ptmx_bsd"   /* Tru64 */
233     };
234
235 #ifdef HAVE_GETPT /* glibc */
236   master_fd = getpt ();
237   if (master_fd >= 0)
238     goto have_master;
239 #endif /* HAVE_GETPT */
240
241
242 #if defined(HAVE_OPENPTY) /* BSD, Tru64, glibc */
243   {
244     int slave_fd = -1;
245     int rc;
246     EMACS_BLOCK_SIGNAL (SIGCHLD);
247     rc = openpty (&master_fd, &slave_fd, NULL, NULL, NULL);
248     EMACS_UNBLOCK_SIGNAL (SIGCHLD);
249     if (rc == 0)
250       {
251         slave_name = ttyname (slave_fd);
252         close (slave_fd);
253         goto have_slave_name;
254       }
255     else
256       {
257         if (master_fd >= 0)
258           close (master_fd);
259         if (slave_fd >= 0)
260           close (slave_fd);
261       }
262   }
263 #endif /* HAVE_OPENPTY */
264
265 #if defined(HAVE__GETPTY) && defined (O_NDELAY) /* SGI */
266   master_fd = -1;
267   EMACS_BLOCK_SIGNAL (SIGCHLD);
268   slave_name = _getpty (&master_fd, O_RDWR | O_NDELAY, 0600, 0);
269   EMACS_UNBLOCK_SIGNAL (SIGCHLD);
270   if (master_fd >= 0 && slave_name != NULL)
271     goto have_slave_name;
272 #endif /* HAVE__GETPTY */
273
274   /* Master clone devices are available on most systems */
275   {
276     int i;
277     for (i = 0; i < countof (clones); i++)
278       {
279         clone = clones[i];
280         master_fd = open (clone, O_RDWR | O_NONBLOCK | OPEN_BINARY, 0);
281         if (master_fd >= 0)
282           goto have_master;
283       }
284     clone = NULL;
285   }
286
287   goto lose;
288
289  have_master:
290
291 #if defined (HAVE_PTSNAME)
292   slave_name = ptsname (master_fd);
293   if (slave_name)
294     goto have_slave_name;
295 #endif
296
297   /* AIX docs say to use ttyname, not ptsname, to get slave_name */
298   if (clone
299       && !strcmp (clone, "/dev/ptc")
300       && (slave_name = ttyname (master_fd)) != NULL)
301     goto have_slave_name;
302
303   goto lose;
304
305  have_slave_name:
306   strncpy (pty_name, slave_name, sizeof (pty_name));
307   pty_name[sizeof (pty_name) - 1] = '\0';
308   setup_pty (master_fd);
309
310   /* We jump through some hoops to frob the pty.
311      It's not obvious that checking the return code here is useful. */
312
313   /* "The grantpt() function will fail if it is unable to successfully
314       invoke the setuid root program.  It may also fail if the
315       application has installed a signal handler to catch SIGCHLD
316       signals." */
317 #if defined (HAVE_GRANTPT) || defined (HAVE_UNLOCKPT)
318   EMACS_BLOCK_SIGNAL (SIGCHLD);
319
320 #if defined (HAVE_GRANTPT)
321   grantpt (master_fd);
322 #ifdef HPUX
323   /* grantpt() behavior on some versions of HP-UX differs from what's
324      specified in the man page: the group of the slave PTY is set to
325      the user's primary group, and we fix that. */
326   {
327     struct group *tty_group = getgrnam ("tty");
328     if (tty_group != NULL)
329       chown (pty_name, (uid_t) -1, tty_group->gr_gid);
330   }
331 #endif /* HPUX has broken grantpt() */
332 #endif /* HAVE_GRANTPT */
333
334 #if defined (HAVE_UNLOCKPT)
335   unlockpt (master_fd);
336 #endif
337
338   EMACS_UNBLOCK_SIGNAL (SIGCHLD);
339 #endif /* HAVE_GRANTPT || HAVE_UNLOCKPT */
340
341   return master_fd;
342
343  lose:
344   if (master_fd >= 0)
345     close (master_fd);
346 #endif /* ndef FORCE_ALLOCATE_PTY_THE_OLD_FASHIONED_WAY */
347   return allocate_pty_the_old_fashioned_way ();
348 }
349
350 /* This function tries to allocate a pty by iterating through file
351    pairs with names like /dev/ptyp1 and /dev/ttyp1. */
352 static int
353 allocate_pty_the_old_fashioned_way (void)
354 {
355   struct stat stb;
356
357   /* Some systems name their pseudoterminals so that there are gaps in
358      the usual sequence - for example, on HP9000/S700 systems, there
359      are no pseudoterminals with names ending in 'f'.  So we wait for
360      three failures in a row before deciding that we've reached the
361      end of the ptys.  */
362   int failed_count = 0;
363   int fd;
364   int i;
365   int c;
366
367 #ifdef PTY_ITERATION
368   PTY_ITERATION
369 #else
370 # ifndef FIRST_PTY_LETTER
371 # define FIRST_PTY_LETTER 'p'
372 # endif
373   for (c = FIRST_PTY_LETTER; c <= 'z'; c++)
374     for (i = 0; i < 16; i++)
375 #endif /* PTY_ITERATION */
376
377       {
378 #ifdef PTY_NAME_SPRINTF
379         PTY_NAME_SPRINTF
380 #else
381         sprintf (pty_name, "/dev/pty%c%x", c, i);
382 #endif /* no PTY_NAME_SPRINTF */
383
384         if (xemacs_stat (pty_name, &stb) < 0)
385           {
386             if (++failed_count >= 3)
387               return -1;
388           }
389         else
390           failed_count = 0;
391         fd = open (pty_name, O_RDWR | O_NONBLOCK | OPEN_BINARY, 0);
392
393         if (fd >= 0)
394           {
395 #ifdef PTY_TTY_NAME_SPRINTF
396             PTY_TTY_NAME_SPRINTF
397 #else
398             sprintf (pty_name, "/dev/tty%c%x", c, i);
399 #endif /* no PTY_TTY_NAME_SPRINTF */
400             if (access (pty_name, R_OK | W_OK) == 0)
401               {
402                 setup_pty (fd);
403                 return fd;
404               }
405             close (fd);
406           }
407       } /* iteration */
408   return -1;
409 }
410 #endif /* HAVE_PTYS */
411
412 static int
413 create_bidirectional_pipe (int *inchannel, int *outchannel,
414                            volatile int *forkin, volatile int *forkout)
415 {
416   int sv[2];
417
418 #ifdef SKTPAIR
419   if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv) < 0)
420     return -1;
421   *outchannel = *inchannel = sv[0];
422   *forkout = *forkin = sv[1];
423 #else /* not SKTPAIR */
424   int temp;
425   temp = pipe (sv);
426   if (temp < 0) return -1;
427   *inchannel = sv[0];
428   *forkout = sv[1];
429   temp = pipe (sv);
430   if (temp < 0) return -1;
431   *outchannel = sv[1];
432   *forkin = sv[0];
433 #endif /* not SKTPAIR */
434   return 0;
435 }
436
437
438 #ifdef HAVE_SOCKETS
439
440 #if !(defined(HAVE_GETADDRINFO) && defined(HAVE_GETNAMEINFO))
441 static int
442 get_internet_address (Lisp_Object host, struct sockaddr_in *address,
443                       Error_behavior errb)
444 {
445   struct hostent *host_info_ptr = NULL;
446 #ifdef TRY_AGAIN
447   int count = 0;
448 #endif
449
450   xzero (*address);
451
452   while (1)
453     {
454 #ifdef TRY_AGAIN
455       if (count++ > 10) break;
456 #ifndef BROKEN_CYGWIN
457       h_errno = 0;
458 #endif
459 #endif
460       /* Some systems can't handle SIGIO/SIGALARM in gethostbyname. */
461       slow_down_interrupts ();
462       host_info_ptr = gethostbyname ((char *) XSTRING_DATA (host));
463       speed_up_interrupts ();
464 #ifdef TRY_AGAIN
465       if (! (host_info_ptr == 0 && h_errno == TRY_AGAIN))
466 #endif
467         break;
468       Fsleep_for (make_int (1));
469     }
470   if (host_info_ptr)
471     {
472       address->sin_family = host_info_ptr->h_addrtype;
473       memcpy (&address->sin_addr, host_info_ptr->h_addr, host_info_ptr->h_length);
474     }
475   else
476     {
477       IN_ADDR numeric_addr;
478       /* Attempt to interpret host as numeric inet address */
479       numeric_addr = inet_addr ((char *) XSTRING_DATA (host));
480       if (NUMERIC_ADDR_ERROR)
481         {
482           maybe_error (Qprocess, errb,
483                        "Unknown host \"%s\"", XSTRING_DATA (host));
484           return 0;
485         }
486
487       /* There was some broken code here that called strlen() here
488          on (char *) &numeric_addr and even sometimes accessed
489          uninitialized data. */
490       address->sin_family = AF_INET;
491       * (IN_ADDR *) &address->sin_addr = numeric_addr;
492     }
493
494   return 1;
495 }
496 #endif /*  !(HAVE_GETADDRINFO && HAVE_GETNAMEINFO) */
497
498 static void
499 set_socket_nonblocking_maybe (int fd, int port, const char* proto)
500 {
501 #ifdef PROCESS_IO_BLOCKING
502   Lisp_Object tail;
503
504   for (tail = network_stream_blocking_port_list; CONSP (tail); tail = XCDR (tail))
505     {
506       Lisp_Object tail_port = XCAR (tail);
507
508       if (STRINGP (tail_port))
509         {
510           struct servent *svc_info;
511           CHECK_STRING (tail_port);
512           svc_info = getservbyname ((char *) XSTRING_DATA (tail_port), proto);
513           if ((svc_info != 0) && (svc_info->s_port == port))
514             break;
515           else
516             continue;
517         }
518       else if (INTP (tail_port) && (htons ((unsigned short) XINT (tail_port)) == port))
519         break;
520     }
521
522   if (!CONSP (tail))
523     {
524       set_descriptor_non_blocking (fd);
525     }
526 #else
527   set_descriptor_non_blocking (fd);
528 #endif  /* PROCESS_IO_BLOCKING */
529 }
530
531 #endif /* HAVE_SOCKETS */
532
533 /* Compute the Lisp form of the process status from
534    the numeric status that was returned by `wait'.  */
535
536 static void
537 update_status_from_wait_code (Lisp_Process *p, int *w_fmh)
538 {
539   /* C compiler lossage when attempting to pass w directly */
540   int w = *w_fmh;
541
542   if (WIFSTOPPED (w))
543     {
544       p->status_symbol = Qstop;
545       p->exit_code = WSTOPSIG (w);
546       p->core_dumped = 0;
547     }
548   else if (WIFEXITED (w))
549     {
550       p->status_symbol = Qexit;
551       p->exit_code = WEXITSTATUS (w);
552       p->core_dumped = 0;
553     }
554   else if (WIFSIGNALED (w))
555     {
556       p->status_symbol = Qsignal;
557       p->exit_code = WTERMSIG (w);
558       p->core_dumped = WCOREDUMP (w);
559     }
560   else
561     {
562       p->status_symbol = Qrun;
563       p->exit_code = 0;
564     }
565 }
566
567 #ifdef SIGCHLD
568
569 #define MAX_EXITED_PROCESSES 1000
570 static volatile pid_t exited_processes[MAX_EXITED_PROCESSES];
571 static volatile int exited_processes_status[MAX_EXITED_PROCESSES];
572 static volatile int exited_processes_index;
573
574 static volatile int sigchld_happened;
575
576 /* On receipt of a signal that a child status has changed,
577  loop asking about children with changed statuses until
578  the system says there are no more.  All we do is record
579  the processes and wait status.
580
581  This function could be called from within the SIGCHLD
582  handler, so it must be completely reentrant.  When
583  not called from a SIGCHLD handler, BLOCK_SIGCHLD should
584  be non-zero so that SIGCHLD is blocked while this
585  function is running. (This is necessary so avoid
586  race conditions with the SIGCHLD_HAPPENED flag). */
587
588 static void
589 record_exited_processes (int block_sigchld)
590 {
591   if (!sigchld_happened)
592     {
593       return;
594     }
595
596 #ifdef EMACS_BLOCK_SIGNAL
597   if (block_sigchld)
598     EMACS_BLOCK_SIGNAL (SIGCHLD);
599 #endif
600
601   while (sigchld_happened)
602     {
603       int pid;
604       int w;
605
606       /* Keep trying to get a status until we get a definitive result.  */
607       do
608         {
609           errno = 0;
610 #ifdef WNOHANG
611 #  ifndef WUNTRACED
612 #    define WUNTRACED 0
613 #  endif /* not WUNTRACED */
614 #  ifdef HAVE_WAITPID
615           pid = waitpid ((pid_t) -1, &w, WNOHANG | WUNTRACED);
616 #  else
617           pid = wait3 (&w, WNOHANG | WUNTRACED, 0);
618 #  endif
619 #else /* not WNOHANG */
620           pid = wait (&w);
621 #endif /* not WNOHANG */
622         }
623       while (pid <= 0 && errno == EINTR);
624
625       if (pid <= 0)
626         break;
627
628       if (exited_processes_index < MAX_EXITED_PROCESSES)
629         {
630           exited_processes[exited_processes_index] = pid;
631           exited_processes_status[exited_processes_index] = w;
632           exited_processes_index++;
633         }
634
635       /* On systems with WNOHANG, we just ignore the number
636          of times that SIGCHLD was signalled, and keep looping
637          until there are no more processes to wait on.  If we
638          don't have WNOHANG, we have to rely on the count in
639          SIGCHLD_HAPPENED. */
640 #ifndef WNOHANG
641       sigchld_happened--;
642 #endif /* not WNOHANG */
643     }
644
645   sigchld_happened = 0;
646
647   if (block_sigchld)
648     EMACS_UNBLOCK_SIGNAL (SIGCHLD);
649 }
650
651 /* For any processes that have changed status and are recorded
652    and such, update the corresponding Lisp_Process.
653    We separate this from record_exited_processes() so that
654    we never have to call this function from within a signal
655    handler.  We block SIGCHLD in case record_exited_processes()
656    is called from a signal handler. */
657
658 /** USG WARNING:  Although it is not obvious from the documentation
659  in signal(2), on a USG system the SIGCLD handler MUST NOT call
660  signal() before executing at least one wait(), otherwise the handler
661  will be called again, resulting in an infinite loop.  The relevant
662  portion of the documentation reads "SIGCLD signals will be queued
663  and the signal-catching function will be continually reentered until
664  the queue is empty".  Invoking signal() causes the kernel to reexamine
665  the SIGCLD queue.   Fred Fish, UniSoft Systems Inc.
666
667  (Note that now this only applies in SYS V Release 2 and before.
668  On SYS V Release 3, we use sigset() to set the signal handler for
669  the first time, and so we don't have to reestablish the signal handler
670  in the handler below.  On SYS V Release 4, we don't get this weirdo
671  behavior when we use sigaction(), which we do use.) */
672
673 static SIGTYPE
674 sigchld_handler (int signo)
675 {
676 #ifdef OBNOXIOUS_SYSV_SIGCLD_BEHAVIOR
677   int old_errno = errno;
678
679   sigchld_happened++;
680   record_exited_processes (0);
681   errno = old_errno;
682 #else
683   sigchld_happened++;
684 #endif
685 #ifdef HAVE_UNIXOID_EVENT_LOOP
686   signal_fake_event ();
687 #endif
688   /* WARNING - must come after wait3() for USG systems */
689   EMACS_REESTABLISH_SIGNAL (signo, sigchld_handler);
690   SIGRETURN;
691 }
692
693 #endif /* SIGCHLD */
694
695 #ifdef SIGNALS_VIA_CHARACTERS
696 /* Get signal character to send to process if SIGNALS_VIA_CHARACTERS */
697
698 static int
699 process_signal_char (int tty_fd, int signo)
700 {
701   /* If it's not a tty, pray that these default values work */
702   if (! isatty (tty_fd)) {
703 #define CNTL(ch) (037 & (ch))
704     switch (signo)
705       {
706       case SIGINT:  return CNTL ('C');
707       case SIGQUIT: return CNTL ('\\');
708 #ifdef SIGTSTP
709       case SIGTSTP: return CNTL ('Z');
710 #endif
711       }
712   }
713
714 #ifdef HAVE_TERMIOS
715   /* TERMIOS is the latest and bestest, and seems most likely to work.
716      If the system has it, use it. */
717   {
718     struct termios t;
719     tcgetattr (tty_fd, &t);
720     switch (signo)
721       {
722       case SIGINT:  return t.c_cc[VINTR];
723       case SIGQUIT: return t.c_cc[VQUIT];
724 #if defined(SIGTSTP) && defined(VSUSP)
725       case SIGTSTP: return t.c_cc[VSUSP];
726 #endif
727       }
728   }
729
730 # elif defined (TIOCGLTC) && defined (TIOCGETC) /* not HAVE_TERMIOS */
731   {
732     /* On Berkeley descendants, the following IOCTL's retrieve the
733        current control characters.  */
734     struct tchars c;
735     struct ltchars lc;
736     switch (signo)
737       {
738       case SIGINT:  ioctl (tty_fd, TIOCGETC, &c);  return c.t_intrc;
739       case SIGQUIT: ioctl (tty_fd, TIOCGETC, &c);  return c.t_quitc;
740 #  ifdef SIGTSTP
741       case SIGTSTP: ioctl (tty_fd, TIOCGLTC, &lc); return lc.t_suspc;
742 #  endif /* SIGTSTP */
743       }
744   }
745
746 # elif defined (TCGETA) /* ! defined (TIOCGLTC) && defined (TIOCGETC) */
747   {
748     /* On SYSV descendants, the TCGETA ioctl retrieves the current
749        control characters.  */
750     struct termio t;
751     ioctl (tty_fd, TCGETA, &t);
752     switch (signo) {
753     case SIGINT:  return t.c_cc[VINTR];
754     case SIGQUIT: return t.c_cc[VQUIT];
755 #  ifdef SIGTSTP
756     case SIGTSTP: return t.c_cc[VSWTCH];
757 #  endif /* SIGTSTP */
758     }
759   }
760 # else /* ! defined (TCGETA) */
761 #error ERROR! Using SIGNALS_VIA_CHARACTERS, but not HAVE_TERMIOS || (TIOCGLTC && TIOCGETC) || TCGETA
762   /* If your system configuration files define SIGNALS_VIA_CHARACTERS,
763      you'd better be using one of the alternatives above!  */
764 # endif /* ! defined (TCGETA) */
765   return '\0';
766 }
767 #endif /* SIGNALS_VIA_CHARACTERS */
768
769
770
771 \f
772 /**********************************************************************/
773 /*              Process implementation methods                        */
774 /**********************************************************************/
775
776 /*
777  * Allocate and initialize Lisp_Process->process_data
778  */
779
780 static void
781 unix_alloc_process_data (Lisp_Process *p)
782 {
783   p->process_data = xnew (struct unix_process_data);
784
785   UNIX_DATA(p)->connected_via_filedesc_p = 0;
786   UNIX_DATA(p)->infd   = -1;
787   UNIX_DATA(p)->subtty = -1;
788   UNIX_DATA(p)->tty_name = Qnil;
789   UNIX_DATA(p)->pty_flag = 0;
790 }
791
792 /*
793  * Mark any Lisp objects in Lisp_Process->process_data
794  */
795
796 static void
797 unix_mark_process_data (Lisp_Process *proc)
798 {
799   mark_object (UNIX_DATA(proc)->tty_name);
800 }
801
802 /*
803  * Initialize XEmacs process implementation once
804  */
805
806 #ifdef SIGCHLD
807 static void
808 unix_init_process (void)
809 {
810 #ifndef CANNOT_DUMP
811   if (! noninteractive || initialized)
812 #endif
813     signal (SIGCHLD, sigchld_handler);
814 }
815 #endif /* SIGCHLD */
816
817 /*
818  * Initialize any process local data. This is called when newly
819  * created process is connected to real OS file handles. The
820  * handles are generally represented by void* type, but are
821  * of type int (file descriptors) for UNIX.
822  */
823
824 static void
825 unix_init_process_io_handles (Lisp_Process *p, void* in, void* out, int flags)
826 {
827   UNIX_DATA(p)->infd = (int)in;
828 }
829
830 /*
831  * Fork off a subprocess. P is a pointer to a newly created subprocess
832  * object. If this function signals, the caller is responsible for
833  * deleting (and finalizing) the process object.
834  *
835  * The method must return PID of the new process, a (positive??? ####) number
836  * which fits into Lisp_Int. No return value indicates an error, the method
837  * must signal an error instead.
838  */
839
840 static int
841 unix_create_process (Lisp_Process *p,
842                      Lisp_Object *argv, int nargv,
843                      Lisp_Object program, Lisp_Object cur_dir)
844 {
845   int pid;
846   int inchannel  = -1;
847   int outchannel = -1;
848   /* Use volatile to protect variables from being clobbered by longjmp.  */
849   volatile int forkin   = -1;
850   volatile int forkout  = -1;
851   volatile int pty_flag = 0;
852
853 #ifdef HAVE_PTYS
854   if (!NILP (Vprocess_connection_type))
855     {
856       /* find a new pty, open the master side, return the opened
857          file handle, and store the name of the corresponding slave
858          side in global variable pty_name. */
859       outchannel = inchannel = allocate_pty ();
860     }
861
862   if (inchannel >= 0)
863     {
864       /* You're "supposed" to now open the slave in the child.
865          On some systems, we can open it here; this allows for
866          better error checking. */
867 #if !defined(USG)
868       /* On USG systems it does not work to open the pty's tty here
869          and then close and reopen it in the child.  */
870 #ifdef O_NOCTTY
871       /* Don't let this terminal become our controlling terminal
872          (in case we don't have one).  */
873       forkout = forkin = open (pty_name, O_RDWR | O_NOCTTY | OPEN_BINARY, 0);
874 #else
875       forkout = forkin = open (pty_name, O_RDWR | OPEN_BINARY, 0);
876 #endif
877       if (forkin < 0)
878         goto io_failure;
879 #endif /* not USG */
880       UNIX_DATA(p)->pty_flag = pty_flag = 1;
881     }
882   else
883 #endif /* HAVE_PTYS */
884     if (create_bidirectional_pipe (&inchannel, &outchannel,
885                                    &forkin, &forkout) < 0)
886       goto io_failure;
887
888 #if 0
889   /* Replaced by close_process_descs */
890   set_exclusive_use (inchannel);
891   set_exclusive_use (outchannel);
892 #endif
893
894   set_descriptor_non_blocking (inchannel);
895
896   /* Record this as an active process, with its channels.
897      As a result, child_setup will close Emacs's side of the pipes.  */
898   init_process_io_handles (p, (void*)inchannel, (void*)outchannel,
899                            pty_flag ? STREAM_PTY_FLUSHING : 0);
900   /* Record the tty descriptor used in the subprocess.  */
901   UNIX_DATA(p)->subtty = forkin;
902
903   {
904 #if !defined(CYGWIN)
905     /* child_setup must clobber environ on systems with true vfork.
906        Protect it from permanent change.  */
907     char **save_environ = environ;
908 #endif
909
910     pid = fork ();
911     if (pid == 0)
912       {
913         /**** Now we're in the child process ****/
914         int xforkin = forkin;
915         int xforkout = forkout;
916
917         /* Checking for quit in the child is bad because that will 
918            cause I/O, and that, in turn, can confuse the X connection. */
919         begin_dont_check_for_quit();
920
921         /* Disconnect the current controlling terminal, pursuant to
922            making the pty be the controlling terminal of the process.
923            Also put us in our own process group. */
924
925         disconnect_controlling_terminal ();
926
927 #ifdef HAVE_PTYS
928         if (pty_flag)
929           {
930             /* Open the pty connection and make the pty's terminal
931                our controlling terminal.
932
933                On systems with TIOCSCTTY, we just use it to set
934                the controlling terminal.  On other systems, the
935                first TTY we open becomes the controlling terminal.
936                So, we end up with four possibilities:
937
938                (1) on USG and TIOCSCTTY systems, we open the pty
939                    and use TIOCSCTTY.
940                (2) on other USG systems, we just open the pty.
941                (3) on non-USG systems with TIOCSCTTY, we
942                    just use TIOCSCTTY. (On non-USG systems, we
943                    already opened the pty in the parent process.)
944                (4) on non-USG systems without TIOCSCTTY, we
945                    close the pty and reopen it.
946
947                This would be cleaner if we didn't open the pty
948                in the parent process, but doing it that way
949                makes it possible to trap error conditions.
950                It's harder to convey an error from the child
951                process, and I don't feel like messing with
952                this now. */
953
954             /* There was some weirdo, probably wrong,
955                conditionalization on RTU and UNIPLUS here.
956                I deleted it.  So sue me. */
957
958             /* SunOS has TIOCSCTTY but the close/open method
959                also works. */
960
961 #  if defined (USG) || !defined (TIOCSCTTY)
962             /* Now close the pty (if we had it open) and reopen it.
963                This makes the pty the controlling terminal of the
964                subprocess.  */
965             /* I wonder if close (open (pty_name, ...)) would work?  */
966             if (xforkin >= 0)
967               close (xforkin);
968             xforkout = xforkin = open (pty_name, O_RDWR | OPEN_BINARY, 0);
969             if (xforkin < 0)
970               {
971                 write (1, "Couldn't open the pty terminal ", 31);
972                 write (1, pty_name, strlen (pty_name));
973                 write (1, "\n", 1);
974                 _exit (1);
975               }
976 #  endif /* USG or not TIOCSCTTY */
977
978             /* Miscellaneous setup required for some systems.
979                Must be done before using tc* functions on xforkin.
980                This guarantees that isatty(xforkin) is true. */
981
982 #  if defined (HAVE_ISASTREAM) && defined (I_PUSH)
983             if (isastream (xforkin))
984               {
985 #    if defined (I_FIND)
986 #      define stream_module_pushed(fd, module) (ioctl (fd, I_FIND, module) == 1)
987 #    else
988 #      define stream_module_pushed(fd, module) 0
989 #    endif
990                 if (! stream_module_pushed (xforkin, "ptem"))
991                   ioctl (xforkin, I_PUSH, "ptem");
992                 if (! stream_module_pushed (xforkin, "ldterm"))
993                   ioctl (xforkin, I_PUSH, "ldterm");
994                 if (! stream_module_pushed (xforkin, "ttcompat"))
995                   ioctl (xforkin, I_PUSH, "ttcompat");
996               }
997 #  endif /* HAVE_ISASTREAM */
998
999 #  ifdef TIOCSCTTY
1000             /* We ignore the return value
1001                because faith@cs.unc.edu says that is necessary on Linux.  */
1002             assert (isatty (xforkin));
1003             ioctl (xforkin, TIOCSCTTY, 0);
1004 #  endif /* TIOCSCTTY */
1005
1006             /* Change the line discipline. */
1007
1008 # if defined (HAVE_TERMIOS) && defined (LDISC1)
1009             {
1010               struct termios t;
1011               assert (isatty (xforkin));
1012               tcgetattr (xforkin, &t);
1013               t.c_lflag = LDISC1;
1014               if (tcsetattr (xforkin, TCSANOW, &t) < 0)
1015                 perror ("create_process/tcsetattr LDISC1 failed\n");
1016             }
1017 # elif defined (NTTYDISC) && defined (TIOCSETD)
1018             {
1019               /* Use new line discipline.  TIOCSETD is accepted and
1020                  ignored on Sys5.4 systems with ttcompat. */
1021               int ldisc = NTTYDISC;
1022               assert (isatty (xforkin));
1023               ioctl (xforkin, TIOCSETD, &ldisc);
1024             }
1025 # endif /* TIOCSETD & NTTYDISC */
1026
1027             /* Make our process group be the foreground group
1028                of our new controlling terminal. */
1029
1030             {
1031               pid_t piddly = EMACS_GET_PROCESS_GROUP ();
1032               EMACS_SET_TTY_PROCESS_GROUP (xforkin, &piddly);
1033             }
1034
1035             /* On AIX, we've disabled SIGHUP above once we start a
1036                child on a pty.  Now reenable it in the child, so it
1037                will die when we want it to.
1038                JV: This needs to be done ALWAYS as we might have inherited
1039                a SIG_IGN handling from our parent (nohup) and we are in new
1040                process group.
1041             */
1042             signal (SIGHUP, SIG_DFL);
1043           }
1044
1045         if (pty_flag)
1046           /* Set up the terminal characteristics of the pty. */
1047           child_setup_tty (xforkout);
1048
1049 #endif /* HAVE_PTYS */
1050
1051         signal (SIGINT,  SIG_DFL);
1052         signal (SIGQUIT, SIG_DFL);
1053
1054         {
1055           char *current_dir;
1056           char **new_argv = alloca_array (char *, nargv + 2);
1057           int i;
1058
1059           /* Nothing below here GCs so our string pointers shouldn't move. */
1060           new_argv[0] = (char *) XSTRING_DATA (program);
1061           for (i = 0; i < nargv; i++)
1062             {
1063               CHECK_STRING (argv[i]);
1064               new_argv[i + 1] = (char *) XSTRING_DATA (argv[i]);
1065             }
1066           new_argv[i + 1] = 0;
1067
1068           LISP_STRING_TO_EXTERNAL (cur_dir, current_dir, Qfile_name);
1069
1070           child_setup (xforkin, xforkout, xforkout, new_argv, current_dir);
1071         }
1072
1073       } /**** End of child code ****/
1074
1075     /**** Back in parent process ****/
1076 #if !defined(CYGWIN)
1077     environ = save_environ;
1078 #endif
1079   }
1080
1081   if (pid < 0)
1082     {
1083       int save_errno = errno;
1084       close_descriptor_pair (forkin, forkout);
1085       errno = save_errno;
1086       report_file_error ("Doing fork", Qnil);
1087     }
1088
1089   /* #### dmoore - why is this commented out, otherwise we leave
1090      subtty = forkin, but then we close forkin just below. */
1091   /* UNIX_DATA(p)->subtty = -1; */
1092
1093   /* If the subfork execv fails, and it exits,
1094      this close hangs.  I don't know why.
1095      So have an interrupt jar it loose.  */
1096   if (forkin >= 0)
1097     close_safely (forkin);
1098   if (forkin != forkout && forkout >= 0)
1099     close (forkout);
1100
1101 #ifdef HAVE_PTYS
1102   if (pty_flag)
1103     UNIX_DATA (p)->tty_name = build_string (pty_name);
1104   else
1105 #endif
1106     UNIX_DATA (p)->tty_name = Qnil;
1107
1108   /* Notice that SIGCHLD was not blocked. (This is not possible on
1109      some systems.) No biggie if SIGCHLD occurs right around the
1110      time that this call happens, because SIGCHLD() does not actually
1111      deselect the process (that doesn't occur until the next time
1112      we're waiting for an event, when status_notify() is called). */
1113   return pid;
1114
1115 io_failure:
1116   {
1117     int save_errno = errno;
1118     close_descriptor_pair (forkin, forkout);
1119     close_descriptor_pair (inchannel, outchannel);
1120     errno = save_errno;
1121     report_file_error ("Opening pty or pipe", Qnil);
1122     return 0; /* not reached */
1123   }
1124 }
1125
1126 /* Return nonzero if this process is a ToolTalk connection. */
1127
1128 static int
1129 unix_tooltalk_connection_p (Lisp_Process *p)
1130 {
1131   return UNIX_DATA(p)->connected_via_filedesc_p;
1132 }
1133
1134 /* This is called to set process' virtual terminal size */
1135
1136 static int
1137 unix_set_window_size (Lisp_Process* p, int cols, int rows)
1138 {
1139   return set_window_size (UNIX_DATA(p)->infd, cols, rows);
1140 }
1141
1142 /*
1143  * This method is called to update status fields of the process
1144  * structure. If the process has not existed, this method is
1145  * expected to do nothing.
1146  *
1147  * The method is called only for real child processes.
1148  */
1149
1150 #ifdef HAVE_WAITPID
1151 static void
1152 unix_update_status_if_terminated (Lisp_Process* p)
1153 {
1154   int w;
1155 #ifdef SIGCHLD
1156   EMACS_BLOCK_SIGNAL (SIGCHLD);
1157 #endif
1158   if (waitpid (XINT (p->pid), &w, WNOHANG) == XINT (p->pid))
1159     {
1160       p->tick++;
1161       update_status_from_wait_code (p, &w);
1162     }
1163 #ifdef SIGCHLD
1164   EMACS_UNBLOCK_SIGNAL (SIGCHLD);
1165 #endif
1166 }
1167 #endif
1168
1169 /*
1170  * Update status of all exited processes. Called when SIGCLD has signaled.
1171  */
1172
1173 #ifdef SIGCHLD
1174 static void
1175 unix_reap_exited_processes (void)
1176 {
1177   int i;
1178   Lisp_Process *p;
1179
1180 #ifndef OBNOXIOUS_SYSV_SIGCLD_BEHAVIOR
1181   record_exited_processes (1);
1182 #endif
1183
1184   if (exited_processes_index <= 0)
1185     {
1186       return;
1187     }
1188
1189 #ifdef  EMACS_BLOCK_SIGNAL
1190   EMACS_BLOCK_SIGNAL (SIGCHLD);
1191 #endif
1192   for (i = 0; i < exited_processes_index; i++)
1193     {
1194       int pid = exited_processes[i];
1195       int w = exited_processes_status[i];
1196
1197       /* Find the process that signaled us, and record its status.  */
1198
1199       p = 0;
1200       {
1201         Lisp_Object tail;
1202         LIST_LOOP (tail, Vprocess_list)
1203           {
1204             Lisp_Object proc = XCAR (tail);
1205             p = XPROCESS (proc);
1206             if (INTP (p->pid) && XINT (p->pid) == pid)
1207               break;
1208             p = 0;
1209           }
1210       }
1211
1212       if (p)
1213         {
1214           /* Change the status of the process that was found.  */
1215           p->tick++;
1216           process_tick++;
1217           update_status_from_wait_code (p, &w);
1218
1219           /* If process has terminated, stop waiting for its output.  */
1220           if (WIFSIGNALED (w) || WIFEXITED (w))
1221             {
1222               if (!NILP(p->pipe_instream))
1223                 {
1224                   /* We can't just call event_stream->unselect_process_cb (p)
1225                      here, because that calls XtRemoveInput, which is not
1226                      necessarily reentrant, so we can't call this at interrupt
1227                      level.
1228                    */
1229                 }
1230             }
1231         }
1232       else
1233         {
1234           /* There was no asynchronous process found for that id.  Check
1235              if we have a synchronous process. Only set sync process status
1236              if there is one, so we work OK with the waitpid() call in
1237              wait_for_termination(). */
1238           if (synch_process_alive != 0)
1239             { /* Set the global sync process status variables. */
1240               synch_process_alive = 0;
1241
1242               /* Report the status of the synchronous process.  */
1243               if (WIFEXITED (w))
1244                 synch_process_retcode = WEXITSTATUS (w);
1245               else if (WIFSIGNALED (w))
1246                 synch_process_death = signal_name (WTERMSIG (w));
1247             }
1248         }
1249     }
1250
1251   exited_processes_index = 0;
1252
1253   EMACS_UNBLOCK_SIGNAL (SIGCHLD);
1254 }
1255 #endif /* SIGCHLD */
1256
1257 /*
1258  * Stuff the entire contents of LSTREAM to the process output pipe
1259  */
1260
1261 static JMP_BUF send_process_frame;
1262
1263 static SIGTYPE
1264 send_process_trap (int signum)
1265 {
1266   EMACS_REESTABLISH_SIGNAL (signum, send_process_trap);
1267   EMACS_UNBLOCK_SIGNAL (signum);
1268   LONGJMP (send_process_frame, 1);
1269 }
1270
1271 static void
1272 unix_send_process (Lisp_Object proc, struct lstream* lstream)
1273 {
1274   /* Use volatile to protect variables from being clobbered by longjmp.  */
1275   SIGTYPE (*volatile old_sigpipe) (int) = 0;
1276   volatile Lisp_Object vol_proc = proc;
1277   Lisp_Process *volatile p = XPROCESS (proc);
1278
1279   /* #### JV: layering violation?
1280
1281      This function knows too much about the relation between the encoding
1282      stream (DATA_OUTSTREAM) and the actual output stream p->output_stream.
1283
1284      If encoding streams properly forwarded all calls, we could simply
1285      use DATA_OUTSTREAM everywhere. */
1286
1287   if (!SETJMP (send_process_frame))
1288     {
1289       /* use a reasonable-sized buffer (somewhere around the size of the
1290          stream buffer) so as to avoid inundating the stream with blocked
1291          data. */
1292       Bufbyte chunkbuf[512];
1293       Bytecount chunklen;
1294
1295       while (1)
1296         {
1297           Lstream_data_count writeret;
1298
1299           chunklen = Lstream_read (lstream, chunkbuf, 512);
1300           if (chunklen <= 0)
1301             break; /* perhaps should abort() if < 0?
1302                       This should never happen. */
1303           old_sigpipe =
1304             (SIGTYPE (*) (int)) signal (SIGPIPE, send_process_trap);
1305           /* Lstream_write() will never successfully write less than
1306              the amount sent in.  In the worst case, it just buffers
1307              the unwritten data. */
1308           writeret = Lstream_write (XLSTREAM (DATA_OUTSTREAM(p)), chunkbuf,
1309                                     chunklen);
1310           signal (SIGPIPE, old_sigpipe);
1311           if (writeret < 0)
1312             /* This is a real error.  Blocking errors are handled
1313                specially inside of the filedesc stream. */
1314             report_file_error ("writing to process", list1 (proc));
1315           while (Lstream_was_blocked_p (XLSTREAM (p->pipe_outstream)))
1316             {
1317               /* Buffer is full.  Wait, accepting input;
1318                  that may allow the program
1319                  to finish doing output and read more.  */
1320               Faccept_process_output (Qnil, make_int (1), Qnil);
1321               /* It could have *really* finished, deleting the process */
1322               if (NILP(p->pipe_outstream))
1323                 return;
1324               old_sigpipe =
1325                 (SIGTYPE (*) (int)) signal (SIGPIPE, send_process_trap);
1326               Lstream_flush (XLSTREAM (p->pipe_outstream));
1327               signal (SIGPIPE, old_sigpipe);
1328             }
1329         }
1330     }
1331   else
1332     { /* We got here from a longjmp() from the SIGPIPE handler */
1333       signal (SIGPIPE, old_sigpipe);
1334       /* Close the file lstream so we don't attempt to write to it further */
1335       /* #### There is controversy over whether this might cause fd leakage */
1336       /*      my tests say no. -slb */
1337       XLSTREAM (p->pipe_outstream)->flags &= ~LSTREAM_FL_IS_OPEN;
1338 #ifdef FILE_CODING
1339       XLSTREAM (p->coding_outstream)->flags &= ~LSTREAM_FL_IS_OPEN;
1340 #endif
1341       p->status_symbol = Qexit;
1342       p->exit_code = 256; /* #### SIGPIPE ??? */
1343       p->core_dumped = 0;
1344       p->tick++;
1345       process_tick++;
1346       deactivate_process (vol_proc);
1347       invalid_operation ("SIGPIPE raised on process; closed it", p->name);
1348     }
1349
1350   old_sigpipe = (SIGTYPE (*) (int)) signal (SIGPIPE, send_process_trap);
1351   Lstream_flush (XLSTREAM (DATA_OUTSTREAM(p)));
1352   signal (SIGPIPE, old_sigpipe);
1353 }
1354
1355 /*
1356  * Send EOF to the process. The default implementation simply
1357  * closes the output stream. The method must return 0 to call
1358  * the default implementation, or 1 if it has taken all care about
1359  * sending EOF to the process.
1360  */
1361
1362 static int
1363 unix_process_send_eof (Lisp_Object proc)
1364 {
1365   if (!UNIX_DATA (XPROCESS (proc))->pty_flag)
1366     return 0;
1367
1368   /* #### get_eof_char simply doesn't return the correct character
1369      here.  Maybe it is needed to determine the right eof
1370      character in init_process_io_handles but here it simply screws
1371      things up. */
1372 #if 0
1373   Bufbyte eof_char = get_eof_char (XPROCESS (proc));
1374   send_process (proc, Qnil, &eof_char, 0, 1);
1375 #else
1376   send_process (proc, Qnil, (const Bufbyte *) "\004", 0, 1);
1377 #endif
1378   return 1;
1379 }
1380
1381 /*
1382  * Called before the process is deactivated. The process object
1383  * is not immediately finalized, just undergoes a transition to
1384  * inactive state.
1385  *
1386  * The return value is a unique stream ID, as returned by
1387  * event_stream_delete_stream_pair
1388  *
1389  * In the lack of this method, only event_stream_delete_stream_pair
1390  * is called on both I/O streams of the process.
1391  *
1392  * The UNIX version guards this by ignoring possible SIGPIPE.
1393  */
1394
1395 static USID
1396 unix_deactivate_process (Lisp_Process *p)
1397 {
1398   SIGTYPE (*old_sigpipe) (int) = 0;
1399   USID usid;
1400
1401   if (UNIX_DATA(p)->infd >= 0)
1402     flush_pending_output (UNIX_DATA(p)->infd);
1403
1404   /* closing the outstream could result in SIGPIPE, so ignore it. */
1405   old_sigpipe = (SIGTYPE (*) (int)) signal (SIGPIPE, SIG_IGN);
1406   usid = event_stream_delete_stream_pair (p->pipe_instream, p->pipe_outstream);
1407   signal (SIGPIPE, old_sigpipe);
1408
1409   UNIX_DATA(p)->infd  = -1;
1410
1411   return usid;
1412 }
1413
1414 /* If the subtty field of the process data is not filled in, do so now. */
1415 static void
1416 try_to_initialize_subtty (struct unix_process_data *upd)
1417 {
1418   if (upd->pty_flag
1419       && (upd->subtty == -1 || ! isatty (upd->subtty))
1420       && STRINGP (upd->tty_name))
1421     upd->subtty = open ((char *) XSTRING_DATA (upd->tty_name), O_RDWR, 0);
1422 }
1423
1424 /* Send signal number SIGNO to PROCESS.
1425    CURRENT_GROUP means send to the process group that currently owns
1426    the terminal being used to communicate with PROCESS.
1427    This is used for various commands in shell mode.
1428    If NOMSG is zero, insert signal-announcements into process's buffers
1429    right away.
1430
1431    If we can, we try to signal PROCESS by sending control characters
1432    down the pty.  This allows us to signal inferiors who have changed
1433    their uid, for which killpg would return an EPERM error,
1434    or processes running on other machines via remote login.
1435
1436    The method signals an error if the given SIGNO is not valid. */
1437
1438 static void
1439 unix_kill_child_process (Lisp_Object proc, int signo,
1440                          int current_group, int nomsg)
1441 {
1442   pid_t pgid = -1;
1443   Lisp_Process *p = XPROCESS (proc);
1444   struct unix_process_data *d = UNIX_DATA (p);
1445
1446   switch (signo)
1447     {
1448 #ifdef SIGCONT
1449     case SIGCONT:
1450       p->status_symbol = Qrun;
1451       p->exit_code = 0;
1452       p->tick++;
1453       process_tick++;
1454       if (!nomsg)
1455         status_notify ();
1456       break;
1457 #endif /* ! defined (SIGCONT) */
1458     case SIGINT:
1459     case SIGQUIT:
1460     case SIGKILL:
1461       flush_pending_output (d->infd);
1462       break;
1463     }
1464
1465   if (! d->pty_flag)
1466     current_group = 0;
1467
1468   /* If current_group is true, we want to send a signal to the
1469      foreground process group of the terminal our child process is
1470      running on.  You would think that would be easy.
1471
1472      The BSD people invented the TIOCPGRP ioctl to get the foreground
1473      process group of a tty.  That, combined with killpg, gives us
1474      what we want.
1475
1476      However, the POSIX standards people, in their infinite wisdom,
1477      have seen fit to only allow this for processes which have the
1478      terminal as controlling terminal, which doesn't apply to us.
1479
1480      Sooo..., we have to do something non-standard.  The ioctls
1481      TIOCSIGNAL, TIOCSIG, and TIOCSIGSEND send the signal directly on
1482      many systems.  POSIX tcgetpgrp(), since it is *documented* as not
1483      doing what we want, is actually less likely to work than the BSD
1484      ioctl TIOCGPGRP it is supposed to obsolete.  Sometimes we have to
1485      use TIOCGPGRP on the master end, sometimes the slave end
1486      (probably an AIX bug).  So we better get a fd for the slave if we
1487      haven't got it yet.
1488
1489      Anal operating systems like SGI Irix and Compaq Tru64 adhere
1490      strictly to the letter of the law, so our hack doesn't work.
1491      The following fragment from an Irix header file is suggestive:
1492
1493      #ifdef __notdef__
1494      // this is not currently supported
1495      #define TIOCSIGNAL      (tIOC|31)       // pty: send signal to slave
1496      #endif
1497
1498      On those systems where none of our tricks work, we just fall back
1499      to the non-current_group behavior and kill the process group of
1500      the child.
1501   */
1502   if (current_group)
1503     {
1504       try_to_initialize_subtty (d);
1505
1506 #ifdef SIGNALS_VIA_CHARACTERS
1507       /* If possible, send signals to the entire pgrp
1508          by sending an input character to it.  */
1509       {
1510         char sigchar = process_signal_char (d->subtty, signo);
1511         if (sigchar)
1512           {
1513             send_process (proc, Qnil, (Bufbyte *) &sigchar, 0, 1);
1514             return;
1515           }
1516       }
1517 #endif /* SIGNALS_VIA_CHARACTERS */
1518
1519 #ifdef TIOCGPGRP
1520       if (pgid == -1)
1521         ioctl (d->infd, TIOCGPGRP, &pgid); /* BSD */
1522       if (pgid == -1 && d->subtty != -1)
1523         ioctl (d->subtty, TIOCGPGRP, &pgid); /* Only this works on AIX! */
1524 #endif /* TIOCGPGRP */
1525
1526       if (pgid == -1)
1527         {
1528           /* Many systems provide an ioctl to send a signal directly */
1529 #ifdef TIOCSIGNAL /* Solaris, HP-UX */
1530           if (ioctl (d->infd, TIOCSIGNAL, signo) != -1)
1531             return;
1532 #endif /* TIOCSIGNAL */
1533
1534 #ifdef TIOCSIG /* BSD */
1535           if (ioctl (d->infd, TIOCSIG, signo) != -1)
1536             return;
1537 #endif /* TIOCSIG */
1538         }
1539     } /* current_group */
1540
1541   if (pgid == -1)
1542     /* Either current_group is 0, or we failed to get the foreground
1543        process group using the trickery above.  So we fall back to
1544        sending the signal to the process group of our child process.
1545        Since this is often a shell that ignores signals like SIGINT,
1546        the shell's subprocess is killed, which is the desired effect.
1547        The process group of p->pid is always p->pid, since it was
1548        created as a process group leader. */
1549     pgid = XINT (p->pid);
1550
1551   /* Finally send the signal. */
1552   if (EMACS_KILLPG (pgid, signo) == -1)
1553     {
1554       /* It's not an error if our victim is already dead.
1555          And we can't rely on the result of killing a zombie, since
1556          XPG 4.2 requires that killing a zombie fail with ESRCH,
1557          while FIPS 151-2 requires that it succeeds! */
1558 #ifdef ESRCH
1559       if (errno != ESRCH)
1560 #endif
1561         error ("kill (%ld, %ld) failed: %s",
1562                (long) pgid, (long) signo, strerror (errno));
1563     }
1564 }
1565
1566 /* Send signal SIGCODE to any process in the system given its PID.
1567    Return zero if successful, a negative number upon failure. */
1568
1569 static int
1570 unix_kill_process_by_pid (int pid, int sigcode)
1571 {
1572   return kill (pid, sigcode);
1573 }
1574
1575 /* Return TTY name used to communicate with subprocess. */
1576
1577 static Lisp_Object
1578 unix_get_tty_name (Lisp_Process *p)
1579 {
1580   return UNIX_DATA (p)->tty_name;
1581 }
1582
1583 /* Canonicalize host name HOST, and return its canonical form.
1584    The default implementation just takes HOST for a canonical name. */
1585
1586 #ifdef HAVE_SOCKETS
1587 static Lisp_Object
1588 unix_canonicalize_host_name (Lisp_Object host)
1589 {
1590 #if defined(HAVE_GETADDRINFO) && defined(HAVE_GETNAMEINFO)
1591   struct addrinfo hints, *res;
1592   static char addrbuf[NI_MAXHOST];
1593   Lisp_Object canonname;
1594   int retval;
1595   char *ext_host;
1596
1597   xzero (hints);
1598   hints.ai_flags = AI_CANONNAME;
1599 #ifdef IPV6_CANONICALIZE
1600   hints.ai_family = AF_UNSPEC;
1601 #else
1602   hints.ai_family = PF_INET;
1603 #endif
1604   hints.ai_socktype = SOCK_STREAM;
1605   hints.ai_protocol = 0;
1606   LISP_STRING_TO_EXTERNAL (host, ext_host, Qnative);
1607   retval = getaddrinfo (ext_host, NULL, &hints, &res);
1608   if (retval != 0)
1609     {
1610       char *gai_error;
1611
1612       EXTERNAL_TO_C_STRING (gai_strerror (retval), gai_error, Qnative);
1613       maybe_error (Qprocess, ERROR_ME_NOT,
1614                    "%s \"%s\"", gai_error, XSTRING_DATA (host));
1615       canonname = host;
1616     }
1617   else
1618     {
1619       int gni = getnameinfo (res->ai_addr, res->ai_addrlen,
1620                              addrbuf, sizeof(addrbuf),
1621                              NULL, 0, NI_NUMERICHOST);
1622       canonname = gni ? host : build_ext_string (addrbuf, Qnative);
1623
1624       freeaddrinfo (res);
1625     }
1626
1627   return canonname;
1628 #else /* ! HAVE_GETADDRINFO */
1629   struct sockaddr_in address;
1630
1631   if (!get_internet_address (host, &address, ERROR_ME_NOT))
1632     return host;
1633
1634   if (address.sin_family == AF_INET)
1635     return build_string (inet_ntoa (address.sin_addr));
1636   else
1637     /* #### any clue what to do here? */
1638     return host;
1639 #endif /* ! HAVE_GETADDRINFO */
1640 }
1641
1642 /* Open a TCP network connection to a given HOST/SERVICE.
1643    Treated exactly like a normal process when reading and writing.
1644    Only differences are in status display and process deletion.
1645    A network connection has no PID; you cannot signal it.  All you can
1646    do is deactivate and close it via delete-process. */
1647
1648 static void
1649 unix_open_network_stream (Lisp_Object name, Lisp_Object host, Lisp_Object service,
1650                           Lisp_Object protocol, void** vinfd, void** voutfd)
1651 {
1652   int inch;
1653   int outch;
1654   volatile int s;
1655   volatile int port;
1656   volatile int retry = 0;
1657   int retval;
1658
1659   CHECK_STRING (host);
1660
1661   if (!EQ (protocol, Qtcp) && !EQ (protocol, Qudp))
1662     invalid_argument ("Unsupported protocol", protocol);
1663
1664   {
1665 #if defined(HAVE_GETADDRINFO) && defined(HAVE_GETNAMEINFO)
1666     struct addrinfo hints, *res;
1667     struct addrinfo * volatile lres;
1668     char *portstring;
1669     volatile int xerrno = 0;
1670     volatile int failed_connect = 0;
1671     char *ext_host;
1672     /*
1673      * Caution: service can either be a string or int.
1674      * Convert to a C string for later use by getaddrinfo.
1675      */
1676     if (INTP (service))
1677       {
1678         char portbuf[128];
1679         snprintf (portbuf, sizeof (portbuf), "%ld", (long) XINT (service));
1680         portstring = portbuf;
1681         port = htons ((unsigned short) XINT (service));
1682       }
1683     else
1684       {
1685         CHECK_STRING (service);
1686         LISP_STRING_TO_EXTERNAL (service, portstring, Qnative);
1687         port = 0;
1688       }
1689
1690     xzero (hints);
1691     hints.ai_flags = 0;
1692     hints.ai_family = AF_UNSPEC;
1693     if (EQ (protocol, Qtcp))
1694       hints.ai_socktype = SOCK_STREAM;
1695     else /* EQ (protocol, Qudp) */
1696       hints.ai_socktype = SOCK_DGRAM;
1697     hints.ai_protocol = 0;
1698     LISP_STRING_TO_EXTERNAL (host, ext_host, Qnative);
1699     retval = getaddrinfo (ext_host, portstring, &hints, &res);
1700     if (retval != 0)
1701       {
1702         char *gai_error;
1703
1704         EXTERNAL_TO_C_STRING (gai_strerror (retval), gai_error, Qnative);
1705         error ("%s/%s %s", XSTRING_DATA (host), portstring, gai_error);
1706       }
1707
1708     /* address loop */
1709     for (lres = res; lres ; lres = lres->ai_next)
1710       {
1711         if (EQ (protocol, Qtcp))
1712           s = socket (lres->ai_family, SOCK_STREAM, 0);
1713         else /* EQ (protocol, Qudp) */
1714           s = socket (lres->ai_family, SOCK_DGRAM, 0);
1715
1716         if (s < 0)
1717           continue;
1718
1719         /* Turn off interrupts here -- see comments below.  There used to
1720            be code which called bind_polling_period() to slow the polling
1721            period down rather than turn it off, but that seems rather
1722            bogus to me.  Best thing here is to use a non-blocking connect
1723            or something, to check for QUIT. */
1724
1725         /* Comments that are not quite valid: */
1726
1727         /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
1728            when connect is interrupted.  So let's not let it get interrupted.
1729            Note we do not turn off polling, because polling is only used
1730            when not interrupt_input, and thus not normally used on the systems
1731            which have this bug.  On systems which use polling, there's no way
1732            to quit if polling is turned off.  */
1733
1734         /* Slow down polling.  Some kernels have a bug which causes retrying
1735            connect to fail after a connect.  */
1736
1737         slow_down_interrupts ();
1738
1739       loop:
1740
1741         /* A system call interrupted with a SIGALRM or SIGIO comes back
1742            here, with can_break_system_calls reset to 0. */
1743         SETJMP (break_system_call_jump);
1744         if (QUITP)
1745           {
1746             speed_up_interrupts ();
1747             REALLY_QUIT;
1748             /* In case something really weird happens ... */
1749             slow_down_interrupts ();
1750           }
1751
1752         /* Break out of connect with a signal (it isn't otherwise possible).
1753            Thus you don't get screwed with a hung network. */
1754         can_break_system_calls = 1;
1755         retval = connect (s, lres->ai_addr, lres->ai_addrlen);
1756         can_break_system_calls = 0;
1757         if (retval == -1)
1758           {
1759             xerrno = errno;
1760             if (errno != EISCONN)
1761               {
1762                 if (errno == EINTR)
1763                   goto loop;
1764                 if (errno == EADDRINUSE && retry < 20)
1765                   {
1766                     /* A delay here is needed on some FreeBSD systems,
1767                        and it is harmless, since this retrying takes time anyway
1768                        and should be infrequent.
1769                        `sleep-for' allowed for quitting this loop with interrupts
1770                        slowed down so it can't be used here.  Async timers should
1771                        already be disabled at this point so we can use `sleep'. */
1772                     sleep (1);
1773                     retry++;
1774                     goto loop;
1775                   }
1776               }
1777
1778             failed_connect = 1;
1779             close (s);
1780             s = -1;
1781
1782             speed_up_interrupts ();
1783
1784             continue;
1785           }
1786
1787         if (port == 0)
1788           {
1789             int gni;
1790             char servbuf[NI_MAXSERV];
1791
1792             if (EQ (protocol, Qtcp))
1793               gni = getnameinfo (lres->ai_addr, lres->ai_addrlen,
1794                                  NULL, 0, servbuf, sizeof(servbuf),
1795                                  NI_NUMERICSERV);
1796             else /* EQ (protocol, Qudp) */
1797               gni = getnameinfo (lres->ai_addr, lres->ai_addrlen,
1798                                  NULL, 0, servbuf, sizeof(servbuf),
1799                                  NI_NUMERICSERV | NI_DGRAM);
1800
1801             if (gni == 0)
1802               port = strtol (servbuf, NULL, 10);
1803           }
1804
1805         break;
1806       } /* address loop */
1807
1808     speed_up_interrupts ();
1809
1810     freeaddrinfo (res);
1811     if (s < 0)
1812       {
1813         errno = xerrno;
1814
1815         if (failed_connect)
1816           report_file_error ("connection failed", list2 (host, name));
1817         else
1818           report_file_error ("error creating socket", list1 (name));
1819       }
1820 #else /* ! HAVE_GETADDRINFO */
1821     struct sockaddr_in address;
1822
1823     if (INTP (service))
1824       port = htons ((unsigned short) XINT (service));
1825     else
1826       {
1827         struct servent *svc_info;
1828         CHECK_STRING (service);
1829
1830         if (EQ (protocol, Qtcp))
1831           svc_info = getservbyname ((char *) XSTRING_DATA (service), "tcp");
1832         else /* EQ (protocol, Qudp) */
1833           svc_info = getservbyname ((char *) XSTRING_DATA (service), "udp");
1834
1835         if (svc_info == 0)
1836           invalid_argument ("Unknown service", service);
1837         port = svc_info->s_port;
1838       }
1839
1840     get_internet_address (host, &address, ERROR_ME);
1841     address.sin_port = port;
1842
1843     if (EQ (protocol, Qtcp))
1844       s = socket (address.sin_family, SOCK_STREAM, 0);
1845     else /* EQ (protocol, Qudp) */
1846       s = socket (address.sin_family, SOCK_DGRAM, 0);
1847
1848     if (s < 0)
1849       report_file_error ("error creating socket", list1 (name));
1850
1851     /* Turn off interrupts here -- see comments below.  There used to
1852        be code which called bind_polling_period() to slow the polling
1853        period down rather than turn it off, but that seems rather
1854        bogus to me.  Best thing here is to use a non-blocking connect
1855        or something, to check for QUIT. */
1856
1857     /* Comments that are not quite valid: */
1858
1859     /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
1860        when connect is interrupted.  So let's not let it get interrupted.
1861        Note we do not turn off polling, because polling is only used
1862        when not interrupt_input, and thus not normally used on the systems
1863        which have this bug.  On systems which use polling, there's no way
1864        to quit if polling is turned off.  */
1865
1866     /* Slow down polling.  Some kernels have a bug which causes retrying
1867        connect to fail after a connect.  */
1868
1869     slow_down_interrupts ();
1870
1871   loop:
1872
1873     /* A system call interrupted with a SIGALRM or SIGIO comes back
1874        here, with can_break_system_calls reset to 0. */
1875     SETJMP (break_system_call_jump);
1876     if (QUITP)
1877       {
1878         speed_up_interrupts ();
1879         REALLY_QUIT;
1880         /* In case something really weird happens ... */
1881         slow_down_interrupts ();
1882       }
1883
1884     /* Break out of connect with a signal (it isn't otherwise possible).
1885        Thus you don't get screwed with a hung network. */
1886     can_break_system_calls = 1;
1887     retval = connect (s, (struct sockaddr *) &address, sizeof (address));
1888     can_break_system_calls = 0;
1889     if (retval == -1 && errno != EISCONN)
1890       {
1891         int xerrno = errno;
1892         if (errno == EINTR)
1893           goto loop;
1894         if (errno == EADDRINUSE && retry < 20)
1895           {
1896             /* A delay here is needed on some FreeBSD systems,
1897                and it is harmless, since this retrying takes time anyway
1898                and should be infrequent.
1899                `sleep-for' allowed for quitting this loop with interrupts
1900                slowed down so it can't be used here.  Async timers should
1901                already be disabled at this point so we can use `sleep'. */
1902             sleep (1);
1903             retry++;
1904             goto loop;
1905           }
1906
1907         close (s);
1908
1909         speed_up_interrupts ();
1910
1911         errno = xerrno;
1912         report_file_error ("connection failed", list2 (host, name));
1913       }
1914
1915     speed_up_interrupts ();
1916 #endif /* ! HAVE_GETADDRINFO */
1917   }
1918
1919   inch = s;
1920   outch = dup (s);
1921   if (outch < 0)
1922     {
1923       close (s); /* this used to be leaked; from Kyle Jones */
1924       report_file_error ("error duplicating socket", list1 (name));
1925     }
1926
1927   set_socket_nonblocking_maybe (inch, port, "tcp");
1928
1929   *vinfd = (void*)inch;
1930   *voutfd = (void*)outch;
1931 }
1932
1933
1934 #ifdef HAVE_MULTICAST
1935
1936 /* Didier Verna <didier@xemacs.org> Nov. 28 1997.
1937
1938    This function is similar to open-network-stream-internal, but provides a
1939    mean to open an UDP multicast connection instead of a TCP one. Like in the
1940    TCP case, the multicast connection will be seen as a sub-process,
1941
1942    Some notes:
1943    - Normally, we should use sendto and recvfrom with non connected
1944    sockets. The current code doesn't allow us to do this. In the future, it
1945    would be a good idea to extend the process data structure in order to deal
1946    properly with the different types network connections.
1947    - For the same reason, when leaving a multicast group, it is better to make
1948    a setsockopt - IP_DROP_MEMBERSHIP before closing the descriptors.
1949    Unfortunately, this can't be done here because delete_process doesn't know
1950    about the kind of connection we have. However, this is not such an
1951    important issue.
1952 */
1953
1954 static void
1955 unix_open_multicast_group (Lisp_Object name, Lisp_Object dest,
1956                            Lisp_Object port, Lisp_Object ttl, void** vinfd,
1957                            void** voutfd)
1958 {
1959   struct ip_mreq imr;
1960   struct sockaddr_in sa;
1961   struct protoent *udp;
1962   int ws, rs;
1963   int theport;
1964   unsigned char thettl;
1965   int one = 1; /* For REUSEADDR */
1966   int ret;
1967   volatile int retry = 0;
1968
1969   CHECK_STRING (dest);
1970
1971   CHECK_NATNUM (port);
1972   theport = htons ((unsigned short) XINT (port));
1973
1974   CHECK_NATNUM (ttl);
1975   thettl = (unsigned char) XINT (ttl);
1976
1977   if ((udp = getprotobyname ("udp")) == NULL)
1978     type_error (Qinvalid_operation, "No info available for UDP protocol");
1979
1980   /* Init the sockets. Yes, I need 2 sockets. I couldn't duplicate one. */
1981   if ((rs = socket (PF_INET, SOCK_DGRAM, udp->p_proto)) < 0)
1982     report_file_error ("error creating socket", list1(name));
1983   if ((ws = socket (PF_INET, SOCK_DGRAM, udp->p_proto)) < 0)
1984     {
1985       close (rs);
1986       report_file_error ("error creating socket", list1(name));
1987     }
1988
1989   /* This will be used for both sockets */
1990   memset (&sa, 0, sizeof(sa));
1991   sa.sin_family = AF_INET;
1992   sa.sin_port = theport;
1993   sa.sin_addr.s_addr = inet_addr ((char *) XSTRING_DATA (dest));
1994
1995   /* Socket configuration for reading ------------------------ */
1996
1997   /* Multiple connections from the same machine. This must be done before
1998      bind. If it fails, it shouldn't be fatal. The only consequence is that
1999      people won't be able to connect twice from the same machine. */
2000   if (setsockopt (rs, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof (one))
2001       < 0)
2002     warn_when_safe (Qmulticast, Qwarning, "Cannot reuse socket address");
2003
2004   /* bind socket name */
2005   if (bind (rs, (struct sockaddr *)&sa, sizeof(sa)))
2006     {
2007       close (rs);
2008       close (ws);
2009       report_file_error ("error binding socket", list2(name, port));
2010     }
2011
2012   /* join multicast group */
2013   imr.imr_multiaddr.s_addr = inet_addr ((char *) XSTRING_DATA (dest));
2014   imr.imr_interface.s_addr = htonl (INADDR_ANY);
2015   if (setsockopt (rs, IPPROTO_IP, IP_ADD_MEMBERSHIP,
2016                   &imr, sizeof (struct ip_mreq)) < 0)
2017     {
2018       close (ws);
2019       close (rs);
2020       report_file_error ("error adding membership", list2(name, dest));
2021     }
2022
2023   /* Socket configuration for writing ----------------------- */
2024
2025   /* Normally, there's no 'connect' in multicast, since we prefer to use
2026      'sendto' and 'recvfrom'. However, in order to handle this connection in
2027      the process-like way it is done for TCP, we must be able to use 'write'
2028      instead of 'sendto'. Consequently, we 'connect' this socket. */
2029
2030   /* See open-network-stream-internal for comments on this part of the code */
2031   slow_down_interrupts ();
2032
2033  loop:
2034
2035   /* A system call interrupted with a SIGALRM or SIGIO comes back
2036      here, with can_break_system_calls reset to 0. */
2037   SETJMP (break_system_call_jump);
2038   if (QUITP)
2039     {
2040       speed_up_interrupts ();
2041       REALLY_QUIT;
2042       /* In case something really weird happens ... */
2043       slow_down_interrupts ();
2044     }
2045
2046   /* Break out of connect with a signal (it isn't otherwise possible).
2047      Thus you don't get screwed with a hung network. */
2048   can_break_system_calls = 1;
2049   ret = connect (ws, (struct sockaddr *) &sa, sizeof (sa));
2050   can_break_system_calls = 0;
2051   if (ret == -1 && errno != EISCONN)
2052     {
2053       int xerrno = errno;
2054
2055       if (errno == EINTR)
2056         goto loop;
2057       if (errno == EADDRINUSE && retry < 20)
2058         {
2059           /* A delay here is needed on some FreeBSD systems,
2060              and it is harmless, since this retrying takes time anyway
2061              and should be infrequent.
2062              `sleep-for' allowed for quitting this loop with interrupts
2063              slowed down so it can't be used here.  Async timers should
2064              already be disabled at this point so we can use `sleep'. */
2065           sleep (1);
2066           retry++;
2067           goto loop;
2068         }
2069
2070       close (rs);
2071       close (ws);
2072       speed_up_interrupts ();
2073
2074       errno = xerrno;
2075       report_file_error ("error connecting socket", list2(name, port));
2076     }
2077
2078   speed_up_interrupts ();
2079
2080   /* scope */
2081   if (setsockopt (ws, IPPROTO_IP, IP_MULTICAST_TTL,
2082                   &thettl, sizeof (thettl)) < 0)
2083     {
2084       close (rs);
2085       close (ws);
2086       report_file_error ("error setting ttl", list2(name, ttl));
2087     }
2088
2089   set_socket_nonblocking_maybe (rs, theport, "udp");
2090
2091   *vinfd = (void*)rs;
2092   *voutfd = (void*)ws;
2093 }
2094
2095 #endif /* HAVE_MULTICAST */
2096
2097 #endif /* HAVE_SOCKETS */
2098
2099 \f
2100 /**********************************************************************/
2101 /*                            Initialization                          */
2102 /**********************************************************************/
2103
2104 void
2105 process_type_create_unix (void)
2106 {
2107   PROCESS_HAS_METHOD (unix, alloc_process_data);
2108   PROCESS_HAS_METHOD (unix, mark_process_data);
2109 #ifdef SIGCHLD
2110   PROCESS_HAS_METHOD (unix, init_process);
2111   PROCESS_HAS_METHOD (unix, reap_exited_processes);
2112 #endif
2113   PROCESS_HAS_METHOD (unix, init_process_io_handles);
2114   PROCESS_HAS_METHOD (unix, create_process);
2115   PROCESS_HAS_METHOD (unix, tooltalk_connection_p);
2116   PROCESS_HAS_METHOD (unix, set_window_size);
2117 #ifdef HAVE_WAITPID
2118   PROCESS_HAS_METHOD (unix, update_status_if_terminated);
2119 #endif
2120   PROCESS_HAS_METHOD (unix, send_process);
2121   PROCESS_HAS_METHOD (unix, process_send_eof);
2122   PROCESS_HAS_METHOD (unix, deactivate_process);
2123   PROCESS_HAS_METHOD (unix, kill_child_process);
2124   PROCESS_HAS_METHOD (unix, kill_process_by_pid);
2125   PROCESS_HAS_METHOD (unix, get_tty_name);
2126 #ifdef HAVE_SOCKETS
2127   PROCESS_HAS_METHOD (unix, canonicalize_host_name);
2128   PROCESS_HAS_METHOD (unix, open_network_stream);
2129 #ifdef HAVE_MULTICAST
2130   PROCESS_HAS_METHOD (unix, open_multicast_group);
2131 #endif
2132 #endif
2133 }
2134
2135 void
2136 vars_of_process_unix (void)
2137 {
2138   Fprovide (intern ("unix-processes"));
2139 }
2140
2141 #endif /* !defined (NO_SUBPROCESSES) */