/* Asynchronous subprocess control for GNU Emacs.
- Copyright (C) 1985, 1986, 1987, 1988, 1992, 1993 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1987, 1988, 1993 Free Software Foundation, Inc.
This file is part of GNU Emacs.
#ifndef VMS
#ifndef WAITTYPE
-#if !defined (BSD) && !defined (UNIPLUS) && !defined (STRIDE) && !(defined (HPUX) && !defined (NOMULTIPLEJOBS)) && !defined (HAVE_WAIT_HEADER)
+#if (!defined (BSD) && !defined (UNIPLUS) && !defined (STRIDE) && !(defined (HPUX) && !defined (NOMULTIPLEJOBS)) && !defined (HAVE_WAIT_HEADER)) || defined (LINUX)
#define WAITTYPE int
#define WIFSTOPPED(w) ((w&0377) == 0177)
#define WIFSIGNALED(w) ((w&0377) != 0177 && (w&~0377) == 0)
#ifndef VMS
#ifndef BSD4_1
+#ifndef LINUX
extern char *sys_siglist[];
+#endif
#else
char *sys_siglist[] =
{
/* We could get this from param.h, but better not to depend on finding that.
And better not to risk that it might define other symbols used in this
file. */
+#ifdef FD_SETSIZE
+#define MAXDESC FD_SETSIZE
+#else
#define MAXDESC 64
+#endif
#define SELECT_TYPE fd_set
#else /* no FD_SET */
#define MAXDESC 32
p->raw_status_high = Qnil;
}
-/* Convert a process status work in Unix format to
+/* Convert a process status word in Unix format to
the list that we use internally. */
Lisp_Object
abort ();
/* Was PROC started successfully? */
- if (XPROCESS (proc)->pid <= 0)
+ if (XINT (XPROCESS (proc)->pid) <= 0)
remove_process (proc);
return Qnil;
setsid ();
#ifdef TIOCSCTTY
/* Make the pty's terminal the controlling terminal. */
- if (pty_flag && (ioctl (xforkin, TIOCSCTTY, 0) < 0))
- abort ();
+ if (pty_flag)
+ /* We ignore the return value
+ because faith@cs.unc.edu says that is necessary on Linux. */
+ ioctl (xforkin, TIOCSCTTY, 0);
#endif
#else /* not HAVE_SETSID */
#ifdef USG
host_info.h_name = 0;
host_info.h_aliases = 0;
host_info.h_addrtype = AF_INET;
- host_info.h_addr_list = &(addr_list[0]);
- addr_list[0] = (char*)(&numeric_addr);
+#ifdef h_addr
+ /* Older machines have only one address slot called h_addr.
+ Newer machines have h_addr_list, but #define h_addr to
+ be its first element. */
+ host_info.h_addr_list = &(addr_list[0]);
+#endif
+ host_info.h_addr = (char*)(&numeric_addr);
addr_list[1] = 0;
host_info.h_length = strlen (addr_list[0]);
}
report_file_error ("error creating socket", Fcons (name, Qnil));
loop:
- if (connect (s, &address, sizeof address) == -1)
+ if (connect (s, (struct sockaddr *) &address, sizeof address) == -1)
{
int xerrno = errno;
if (errno == EINTR)
If read_kbd is a pointer to a struct Lisp_Process, then the
function returns true iff we received input from that process
before the timeout elapsed.
- Otherwise, return true iff we recieved input from any process. */
+ Otherwise, return true iff we received input from any process. */
wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
int time_limit, microsecs;
EMACS_SET_SECS_USECS (timeout, 100000, 0);
}
+ /* Cause C-g and alarm signals to take immediate action,
+ and cause input available signals to zero out timeout.
+
+ It is important that we do this before checking for process
+ activity. If we get a SIGCHLD after the explicit checks for
+ process activity, timeout is the only way we will know. */
+ if (XINT (read_kbd) < 0)
+ set_waiting_for_input (&timeout);
+
/* If status of something has changed, and no input is
available, notify the user of the change right away. After
this explicit check, we'll let the SIGCHLD handler zap
Atemp = input_wait_mask;
EMACS_SET_SECS_USECS (timeout, 0, 0);
if (select (MAXDESC, &Atemp, 0, 0, &timeout) <= 0)
- status_notify ();
+ {
+ /* It's okay for us to do this and then continue with
+ the loop, since timeout has already been zeroed out. */
+ clear_waiting_for_input ();
+ status_notify ();
+ }
}
- /* Cause C-g and alarm signals to take immediate action,
- and cause input available signals to zero out timeout.
-
- It is important that we do this before checking for process
- activity. If we get a SIGCHLD after the explicit checks for
- process activity, timeout is the only way we will know. */
- if (XINT (read_kbd) < 0)
- set_waiting_for_input (&timeout);
-
/* Don't wait for output from a non-running process. */
if (wait_proc != 0 && !NILP (wait_proc->raw_status_low))
update_status (wait_proc);
if (wait_proc != 0
&& ! EQ (wait_proc->status, Qrun))
- break;
+ {
+ clear_waiting_for_input ();
+ break;
+ }
/* Wait till there is something to do */
to give it higher priority than subprocesses */
if (XINT (read_kbd) && detect_input_pending ())
- break;
+ {
+ swallow_events ();
+ if (detect_input_pending ())
+ break;
+ }
/* Exit now if the cell we're waiting for became non-nil. */
if (wait_for_cell && ! NILP (*wait_for_cell))
hitting ^G when a filter happens to be running won't screw
it up. */
int count = specpdl_ptr - specpdl;
+ Lisp_Object odeactivate;
+
+ odeactivate = Vdeactivate_mark;
+
specbind (Qinhibit_quit, Qt);
call2 (outstream, proc, make_string (chars, nchars));
+ /* Handling the process output should not deactivate the mark. */
+ Vdeactivate_mark = odeactivate;
+
#ifdef VMS
start_vms_process_read (vs);
#endif
{
Lisp_Object old_read_only;
Lisp_Object old_begv, old_zv;
+ Lisp_Object odeactivate;
+
+ odeactivate = Vdeactivate_mark;
Fset_buffer (p->buffer);
opoint = point;
if (XFASTINT (old_begv) != BEGV || XFASTINT (old_zv) != ZV)
Fnarrow_to_region (old_begv, old_zv);
+ /* Handling the process output should not deactivate the mark. */
+ Vdeactivate_mark = odeactivate;
+
current_buffer->read_only = old_read_only;
SET_PT (opoint);
set_buffer_internal (old);
synch_process_retcode = WRETCODE (w);
else if (WIFSIGNALED (w))
#ifndef VMS
- synch_process_death = sys_siglist[WTERMSIG (w)];
+ synch_process_death = (char *) sys_siglist[WTERMSIG (w)];
#else
synch_process_death = sys_errlist[WTERMSIG (w)];
#endif
do_display != 0 means redisplay should be done to show subprocess
output that arrives. This version of the function ignores it.
- Return true iff we recieved input from any process. */
+ Return true iff we received input from any process. */
int
wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)