Replace symbol BSD with BSD_SYSTEM.
[bpt/emacs.git] / src / process.c
index 8e53378..b94b1d3 100644 (file)
@@ -110,13 +110,10 @@ Lisp_Object Qlast_nonmenu_event;
 /* Qexit is declared and initialized in eval.c.  */
 
 /* a process object is a network connection when its childp field is neither
-   Qt nor Qnil but is instead a string (name of foreign host we
-   are connected to + name of port we are connected to) */
+   Qt nor Qnil but is instead a cons cell (HOSTNAME PORTNUM).  */
 
 #ifdef HAVE_SOCKETS
-static Lisp_Object stream_process;
-
-#define NETCONN_P(p) (GC_STRINGP (XPROCESS (p)->childp))
+#define NETCONN_P(p) (GC_CONSP (XPROCESS (p)->childp))
 #else
 #define NETCONN_P(p) 0
 #endif /* HAVE_SOCKETS */
@@ -848,6 +845,17 @@ Value is t if a query was formerly required.")
   return Fnull (tem);
 }
 
+DEFUN ("process-contact", Fprocess_contact, Sprocess_contact,
+  1, 1, 0,
+  "Return the contact info of PROCESS; t for a real child.\n\
+For a net connection, the value is a cons cell of the form (HOST SERVICE).")
+  (process)
+     register Lisp_Object process;
+{
+  CHECK_PROCESS (process, 0);
+  return XPROCESS (process)->childp;
+}
+
 #if 0 /* Turned off because we don't currently record this info
         in the process.  Perhaps add it.  */
 DEFUN ("process-connection", Fprocess_connection, Sprocess_connection, 1, 1, 0,
@@ -958,7 +966,7 @@ Proc         Status   Buffer         Tty         Command\n\
       if (NETCONN_P (proc))
         {
          sprintf (tembuf, "(network stream connection to %s)\n",
-                  XSTRING (p->childp)->data);
+                  XSTRING (XCONS (p->childp)->car)->data);
          insert_string (tembuf);
         }
       else 
@@ -1167,7 +1175,7 @@ SIGTYPE
 create_process_1 (signo)
      int signo;
 {
-#ifdef USG
+#if defined (USG) && !defined (POSIX_SIGNALS)
   /* USG systems forget handlers when they are used;
      must reestablish each time */
   signal (signo, create_process_1);
@@ -1427,7 +1435,7 @@ create_process (process, new_argv, current_dir)
            /* In order to get a controlling terminal on some versions
               of BSD, it is necessary to put the process in pgrp 0
               before it opens the terminal.  */
-#ifdef OSF1
+#ifdef HAVE_SETPGID
            setpgid (0, 0);
 #else
            setpgrp (0, 0);
@@ -1436,9 +1444,13 @@ create_process (process, new_argv, current_dir)
          }
 #endif /* TIOCNOTTY */
 
-#if !defined (RTU) && !defined (UNIPLUS)
+#if !defined (RTU) && !defined (UNIPLUS) && !defined (DONT_REOPEN_PTY)
 /*** There is a suggestion that this ought to be a
-     conditional on TIOCSPGRP.  */
+     conditional on TIOCSPGRP,
+     or !(defined (HAVE_SETSID) && defined (TIOCSCTTY)).
+     Trying the latter gave the wrong results on Debian GNU/Linux 1.1;
+     that system does seem to need this code, even though
+     both HAVE_SETSID and TIOCSCTTY are defined.  */
        /* Now close the pty (if we had it open) and reopen it.
           This makes the pty the controlling terminal of the subprocess.  */
        if (pty_flag)
@@ -1465,7 +1477,8 @@ create_process (process, new_argv, current_dir)
            ioctl (xforkout, TIOCSPGRP, &pgrp);
 #endif
          }
-#endif /* not UNIPLUS and not RTU */
+#endif /* not UNIPLUS and not RTU and not DONT_REOPEN_PTY */
+
 #ifdef SETUP_SLAVE_PTY
        if (pty_flag)
          {
@@ -1788,7 +1801,7 @@ Fourth arg SERVICE is name of the service desired, or an integer\n\
 #endif
 #endif
 
-  XPROCESS (proc)->childp = host;
+  XPROCESS (proc)->childp = Fcons (host, Fcons (service, Qnil));
   XPROCESS (proc)->command_channel_p = Qnil;
   XPROCESS (proc)->buffer = buffer;
   XPROCESS (proc)->sentinel = Qnil;
@@ -2036,6 +2049,14 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
       EMACS_SET_SECS_USECS (timeout, time_limit, microsecs);
       EMACS_ADD_TIME (end_time, end_time, timeout);
     }
+#ifdef hpux
+  /* AlainF 5-Jul-1996
+     HP-UX 10.10 seem to have problems with signals coming in
+     Causes "poll: interrupted system call" messages when Emacs is run
+     in an X window
+     Turn off periodic alarms (in case they are in use) */
+  stop_polling ();
+#endif
 
   while (1)
     {
@@ -2329,7 +2350,9 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
 #ifdef EWOULDBLOCK
              else if (nread == -1 && errno == EWOULDBLOCK)
                ;
-#else
+#endif
+             /* ISC 4.1 defines both EWOULDBLOCK and O_NONBLOCK,
+                and Emacs uses O_NONBLOCK, so what we get is EAGAIN.  */
 #ifdef O_NONBLOCK
              else if (nread == -1 && errno == EAGAIN)
                ;
@@ -2345,7 +2368,6 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
                ;
 #endif                         /* O_NDELAY */
 #endif                         /* O_NONBLOCK */
-#endif                         /* EWOULDBLOCK */
 #ifdef HAVE_PTYS
              /* On some OSs with ptys, when the process on one end of
                 a pty exits, the other end gets an error reading with
@@ -2389,7 +2411,15 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
       clear_input_pending ();
       QUIT;
     }
-
+#ifdef hpux
+  /* AlainF 5-Jul-1996
+     HP-UX 10.10 seems to have problems with signals coming in
+     Causes "poll: interrupted system call" messages when Emacs is run
+     in an X window
+     Turn periodic alarms back on */
+  start_polling();
+#endif
+   
   return got_some_input;
 }
 \f
@@ -2536,7 +2566,7 @@ read_process_output (proc, channel)
       odeactivate = Vdeactivate_mark;
 
       Fset_buffer (p->buffer);
-      opoint = point;
+      opoint = PT;
       old_read_only = current_buffer->read_only;
       XSETFASTINT (old_begv, BEGV);
       XSETFASTINT (old_zv, ZV);
@@ -2553,24 +2583,24 @@ read_process_output (proc, channel)
 
       /* If the output marker is outside of the visible region, save
         the restriction and widen.  */
-      if (! (BEGV <= point && point <= ZV))
+      if (! (BEGV <= PT && PT <= ZV))
        Fwiden ();
 
       /* Make sure opoint floats ahead of any new text, just as point
         would.  */
-      if (point <= opoint)
+      if (PT <= opoint)
        opoint += nchars;
 
       /* Insert after old_begv, but before old_zv.  */
-      if (point < XFASTINT (old_begv))
+      if (PT < XFASTINT (old_begv))
        XSETFASTINT (old_begv, XFASTINT (old_begv) + nchars);
-      if (point <= XFASTINT (old_zv))
+      if (PT <= XFASTINT (old_zv))
        XSETFASTINT (old_zv, XFASTINT (old_zv) + nchars);
 
       /* Insert before markers in case we are inserting where
         the buffer's mark is, and the user's next command is Meta-y.  */
       insert_before_markers (chars, nchars);
-      Fset_marker (p->mark, make_number (point), p->buffer);
+      Fset_marker (p->mark, make_number (PT), p->buffer);
 
       update_mode_lines++;
 
@@ -2627,6 +2657,9 @@ send_process (proc, buf, len, object)
   /* Use volatile to protect variables from being clobbered by longjmp.  */
   int rv;
   volatile unsigned char *procname = XSTRING (XPROCESS (proc)->name)->data;
+  struct gcpro gcpro1;
+
+  GCPRO1 (object);
 
 #ifdef VMS
   struct Lisp_Process *p = XPROCESS (proc);
@@ -2765,6 +2798,8 @@ send_process (proc, buf, len, object)
       error ("SIGPIPE raised on process %s; closed it", procname);
 #endif
     }
+
+  UNGCPRO;
 }
 
 DEFUN ("process-send-region", Fprocess_send_region, Sprocess_send_region,
@@ -3334,7 +3369,7 @@ sigchld_handler (signo)
 
          /* USG systems forget handlers when they are used;
             must reestablish each time */
-#ifdef USG
+#if defined (USG) && !defined (POSIX_SIGNALS)
          signal (signo, sigchld_handler);   /* WARNING - must come after wait3() */
 #endif
 #ifdef  BSD4_1
@@ -3442,7 +3477,7 @@ sigchld_handler (signo)
         Otherwise (on systems that have WNOHANG), loop around
         to use up all the processes that have something to tell us.  */
 #if defined (USG) && ! (defined (HPUX) && defined (WNOHANG)) || defined (WINDOWSNT)
-#ifdef USG
+#if defined (USG) && ! defined (POSIX_SIGNALS)
       signal (signo, sigchld_handler);
 #endif
       errno = old_errno;
@@ -3597,7 +3632,7 @@ status_notify ()
              if (NILP (XBUFFER (buffer)->name))
                continue;
              Fset_buffer (buffer);
-             opoint = point;
+             opoint = PT;
              /* Insert new output into buffer
                 at the current end-of-output marker,
                 thus preserving logical ordering of input and output.  */
@@ -3605,7 +3640,7 @@ status_notify ()
                SET_PT (marker_position (p->mark));
              else
                SET_PT (ZV);
-             if (point <= opoint)
+             if (PT <= opoint)
                opoint += XSTRING (msg)->size + XSTRING (p->name)->size + 10;
 
              tem = current_buffer->read_only;
@@ -3615,7 +3650,7 @@ status_notify ()
              insert_string (" ");
              Finsert (1, &msg);
              current_buffer->read_only = tem;
-             Fset_marker (p->mark, make_number (point), p->buffer);
+             Fset_marker (p->mark, make_number (PT), p->buffer);
 
              SET_PT (opoint);
              set_buffer_internal (old);
@@ -3710,9 +3745,6 @@ init_process ()
 
 syms_of_process ()
 {
-#ifdef HAVE_SOCKETS
-  stream_process = intern ("stream");
-#endif
   Qprocessp = intern ("processp");
   staticpro (&Qprocessp);
   Qrun = intern ("run");
@@ -3768,9 +3800,10 @@ The value takes effect when `start-process' is called.");
   defsubr (&Sset_process_filter);
   defsubr (&Sprocess_filter);
   defsubr (&Sset_process_sentinel);
-  defsubr (&Sset_process_window_size);
   defsubr (&Sprocess_sentinel);
+  defsubr (&Sset_process_window_size);
   defsubr (&Sprocess_kill_without_query);
+  defsubr (&Sprocess_contact);
   defsubr (&Slist_processes);
   defsubr (&Sprocess_list);
   defsubr (&Sstart_process);