#include "syswait.h"
+extern void set_waiting_for_input P_ ((EMACS_TIME *));
+
extern int errno;
extern char *strerror ();
#ifdef VMS
#include "sysselect.h"
+extern int keyboard_bit_set P_ ((SELECT_TYPE *));
+
/* If we support a window system, turn on the code to poll periodically
to detect C-g. It isn't actually used when doing interrupt input. */
#ifdef HAVE_WINDOW_SYSTEM
}
else
{
- *symbol = XCONS (l)->car;
- tem = XCONS (l)->cdr;
- *code = XFASTINT (XCONS (tem)->car);
- tem = XCONS (tem)->cdr;
+ *symbol = XCAR (l);
+ tem = XCDR (l);
+ *code = XFASTINT (XCAR (tem));
+ tem = XCDR (tem);
*coredump = !NILP (tem);
}
}
update_status (p);
status = p->status;
if (CONSP (status))
- status = XCONS (status)->car;
+ status = XCAR (status);
if (NETCONN_P (process))
{
if (EQ (status, Qrun))
if (!NILP (XPROCESS (process)->raw_status_low))
update_status (XPROCESS (process));
if (CONSP (XPROCESS (process)->status))
- return XCONS (XCONS (XPROCESS (process)->status)->cdr)->car;
+ return XCAR (XCDR (XPROCESS (process)->status));
return make_number (0);
}
CHECK_NATNUM (height, 0);
CHECK_NATNUM (width, 0);
if (set_window_size (XINT (XPROCESS (process)->infd),
- XINT (height), XINT(width)) <= 0)
+ XINT (height), XINT (width)) <= 0)
return Qnil;
else
return Qt;
{
register Lisp_Object tail, tem;
Lisp_Object proc, minspace, tem1;
- register struct buffer *old = current_buffer;
register struct Lisp_Process *p;
- register int state;
char tembuf[80];
XSETFASTINT (minspace, 1);
update_status (p);
symbol = p->status;
if (CONSP (p->status))
- symbol = XCONS (p->status)->car;
+ symbol = XCAR (p->status);
if (EQ (symbol, Qsignal))
if (NETCONN_P (proc))
{
sprintf (tembuf, "(network stream connection to %s)\n",
- XSTRING (XCONS (p->childp)->car)->data);
+ XSTRING (XCAR (p->childp))->data);
insert_string (tembuf);
}
else
coding_systems = Ffind_operation_coding_system (nargs + 1, args2);
UNGCPRO;
if (CONSP (coding_systems))
- val = XCONS (coding_systems)->car;
+ val = XCAR (coding_systems);
else if (CONSP (Vdefault_process_coding_system))
- val = XCONS (Vdefault_process_coding_system)->car;
+ val = XCAR (Vdefault_process_coding_system);
}
XPROCESS (proc)->decode_coding_system = val;
UNGCPRO;
}
if (CONSP (coding_systems))
- val = XCONS (coding_systems)->cdr;
+ val = XCDR (coding_systems);
else if (CONSP (Vdefault_process_coding_system))
- val = XCONS (Vdefault_process_coding_system)->cdr;
+ val = XCDR (Vdefault_process_coding_system);
}
XPROCESS (proc)->encode_coding_system = val;
}
struct sigaction sighup_action;
#endif
#else /* !POSIX_SIGNALS */
+#if 0
#ifdef SIGCHLD
SIGTYPE (*sigchld)();
#endif
+#endif /* 0 */
#endif /* !POSIX_SIGNALS */
/* Use volatile to protect variables from being clobbered by longjmp. */
volatile int forkin, forkout;
}
#else /* not SKTPAIR */
{
- pipe (sv);
+ int tem;
+ tem = pipe (sv);
+ if (tem < 0)
+ report_file_error ("Creating pipe", Qnil);
inchannel = sv[0];
forkout = sv[1];
- pipe (sv);
+ tem = pipe (sv);
+ if (tem < 0)
+ {
+ close (inchannel);
+ close (forkout);
+ report_file_error ("Creating pipe", Qnil);
+ }
outchannel = sv[1];
forkin = sv[0];
}
setup_coding_system (XPROCESS (process)->encode_coding_system,
proc_encode_coding_system[outchannel]);
- if (!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters)
+ if ((!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters))
|| (NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters)))
{
/* In unibyte mode, character code conversion should not take
Lisp_Object name, buffer, host, service;
{
Lisp_Object proc;
- register int i;
+#ifndef HAVE_GETADDRINFO
struct sockaddr_in address;
struct servent *svc_info;
struct hostent *host_info_ptr, host_info;
char *(addr_list[2]);
IN_ADDR numeric_addr;
- int s, outch, inch;
- char errstring[80];
int port;
- struct hostent host_info_fixed;
+#else /* HAVE_GETADDRINFO */
+ struct addrinfo hints, *res, *lres;
+ int ret = 0;
+ int xerrno = 0;
+ char *portstring, portbuf[128];
+#endif /* HAVE_GETADDRINFO */
+ int s = -1, outch, inch;
struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
int retry = 0;
int count = specpdl_ptr - specpdl;
+ int count1;
#ifdef WINDOWSNT
/* Ensure socket support is loaded if available. */
GCPRO4 (name, buffer, host, service);
CHECK_STRING (name, 0);
CHECK_STRING (host, 0);
+
+#ifdef HAVE_GETADDRINFO
+ /*
+ * SERVICE can either be a string or int.
+ * Convert to a C string for later use by getaddrinfo.
+ */
+ if (INTEGERP (service))
+ {
+ sprintf (portbuf, "%d", XINT (service));
+ portstring = portbuf;
+ }
+ else
+ {
+ CHECK_STRING (service, 0);
+ portstring = XSTRING (service)->data;
+ }
+#else /* ! HAVE_GETADDRINFO */
if (INTEGERP (service))
port = htons ((unsigned short) XINT (service));
else
error ("Unknown service \"%s\"", XSTRING (service)->data);
port = svc_info->s_port;
}
+#endif /* ! HAVE_GETADDRINFO */
+
/* Slow down polling to every ten seconds.
Some kernels have a bug which causes retrying connect to fail
#endif
#ifndef TERM
+#ifdef HAVE_GETADDRINFO
+ {
+ immediate_quit = 1;
+ QUIT;
+ memset (&hints, 0, sizeof (hints));
+ hints.ai_flags = 0;
+ hints.ai_family = AF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ hints.ai_protocol = 0;
+ ret = getaddrinfo (XSTRING (host)->data, portstring, &hints, &res);
+ if (ret)
+ {
+ error ("%s/%s %s", XSTRING (host)->data, portstring,
+ strerror (ret));
+ }
+ immediate_quit = 0;
+ }
+
+ s = -1;
+ count1 = specpdl_ptr - specpdl;
+ record_unwind_protect (close_file_unwind, make_number (s));
+
+ for (lres = res; lres; lres = lres->ai_next)
+ {
+ s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol);
+ if (s < 0)
+ continue;
+
+ /* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
+ when connect is interrupted. So let's not let it get interrupted.
+ Note we do not turn off polling, because polling is only used
+ when not interrupt_input, and thus not normally used on the systems
+ which have this bug. On systems which use polling, there's no way
+ to quit if polling is turned off. */
+ if (interrupt_input)
+ unrequest_sigio ();
+
+ immediate_quit = 1;
+ QUIT;
+
+ ret = connect (s, lres->ai_addr, lres->ai_addrlen);
+ if (ret == 0)
+ break;
+ close (s);
+ s = -1;
+ }
+
+ freeaddrinfo (res);
+ if (s < 0)
+ {
+ if (interrupt_input)
+ request_sigio ();
+
+ errno = xerrno;
+ report_file_error ("connection failed",
+ Fcons (host, Fcons (name, Qnil)));
+ }
+#else /* ! HAVE_GETADDRINFO */
+
while (1)
{
#ifdef TRY_AGAIN
if (s < 0)
report_file_error ("error creating socket", Fcons (name, Qnil));
+ count1 = specpdl_ptr - specpdl;
+ record_unwind_protect (close_file_unwind, make_number (s));
+
/* Kernel bugs (on Ultrix at least) cause lossage (not just EINTR)
when connect is interrupted. So let's not let it get interrupted.
Note we do not turn off polling, because polling is only used
goto loop;
}
+ /* Discard the unwind protect. */
+ specpdl_ptr = specpdl + count1;
+
close (s);
if (interrupt_input)
report_file_error ("connection failed",
Fcons (host, Fcons (name, Qnil)));
}
+#endif /* ! HAVE_GETADDRINFO */
immediate_quit = 0;
+ /* Discard the unwind protect. */
+ specpdl_ptr = specpdl + count1;
+
#ifdef POLL_FOR_INPUT
unbind_to (count, Qnil);
#endif
if (!NILP (Vcoding_system_for_read))
val = Vcoding_system_for_read;
- else if (!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters)
- || NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters))
+ else if ((!NILP (buffer) && NILP (XBUFFER (buffer)->enable_multibyte_characters))
+ || (NILP (buffer) && NILP (buffer_defaults.enable_multibyte_characters)))
/* We dare not decode end-of-line format by setting VAL to
Qraw_text, because the existing Emacs Lisp libraries
assume that they receive bare code including a sequene of
coding_systems = Ffind_operation_coding_system (5, args);
UNGCPRO;
if (CONSP (coding_systems))
- val = XCONS (coding_systems)->car;
+ val = XCAR (coding_systems);
else if (CONSP (Vdefault_process_coding_system))
- val = XCONS (Vdefault_process_coding_system)->car;
+ val = XCAR (Vdefault_process_coding_system);
else
val = Qnil;
}
UNGCPRO;
}
if (CONSP (coding_systems))
- val = XCONS (coding_systems)->cdr;
+ val = XCDR (coding_systems);
else if (CONSP (Vdefault_process_coding_system))
- val = XCONS (Vdefault_process_coding_system)->cdr;
+ val = XCDR (Vdefault_process_coding_system);
else
val = Qnil;
}
Lisp_Object read_kbd;
int do_display;
{
- register int channel, nfds, m;
+ register int channel, nfds;
static SELECT_TYPE Available;
int xerrno;
Lisp_Object proc;
- EMACS_TIME timeout, end_time, garbage;
+ EMACS_TIME timeout, end_time;
SELECT_TYPE Atemp;
int wait_channel = -1;
struct Lisp_Process *wait_proc = 0;
/* If waiting for non-nil in a cell, record where. */
if (CONSP (read_kbd))
{
- wait_for_cell = &XCONS (read_kbd)->car;
+ wait_for_cell = &XCAR (read_kbd);
XSETFASTINT (read_kbd, 0);
}
{
int timeout_reduced_for_timers = 0;
+#ifdef HAVE_X_WINDOWS
+ if (display_busy_cursor_p)
+ Fx_hide_busy_cursor (Qnil);
+#endif
+
/* If calling from keyboard input, do not quit
since we want to return C-g as an input character.
Otherwise, do pending quit if requested. */
clear_waiting_for_input ();
/* If we woke up due to SIGWINCH, actually change size now. */
- do_pending_window_change ();
+ do_pending_window_change (0);
if (time_limit && nfds == 0 && ! timeout_reduced_for_timers)
/* We wanted the full specified time, so return now. */
/* If checking input just got us a size-change event from X,
obey it now if we should. */
if (XINT (read_kbd) || wait_for_cell)
- do_pending_window_change ();
+ do_pending_window_change (0);
/* Check for data from a process. */
/* Really FIRST_PROC_DESC should be 0 on Unix,
Turn periodic alarms back on */
start_polling ();
#endif
+
+#ifdef HAVE_X_WINDOWS
+ if (display_busy_cursor_p)
+ if (!inhibit_busy_cursor)
+ Fx_show_busy_cursor ();
+#endif
return got_some_input;
}
read_process_output_call (fun_and_args)
Lisp_Object fun_and_args;
{
- return apply1 (XCONS (fun_and_args)->car, XCONS (fun_and_args)->cdr);
+ return apply1 (XCAR (fun_and_args), XCDR (fun_and_args));
}
static Lisp_Object
if (vs)
{
if (!vs->iosb[0])
- return(0); /* Really weird if it does this */
+ return (0); /* Really weird if it does this */
if (!(vs->iosb[0] & 1))
return -1; /* I/O error */
}
if (CODING_REQUIRE_ENCODING (coding))
{
int require = encoding_buffer_size (coding, len);
- int offset, dummy;
+ int offset;
unsigned char *temp_buf = NULL;
/* Remember the offset of data because a string or a buffer may
{
int this = len;
SIGTYPE (*old_sigpipe)();
- int flush_pty = 0;
/* Decide how much data we can send in one batch.
Long lines need to be split into multiple batches. */
{
Lisp_Object tail, proc;
- for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCONS (tail)->cdr)
+ for (tail = Vprocess_alist; GC_CONSP (tail); tail = XCDR (tail))
{
- proc = XCONS (XCONS (tail)->car)->cdr;
+ proc = XCDR (XCAR (tail));
if (GC_PROCESSP (proc)
&& (NILP (buffer) || EQ (XPROCESS (proc)->buffer, buffer)))
{
/* Find the process that signaled us, and record its status. */
p = 0;
- for (tail = Vprocess_alist; CONSP (tail); tail = XCONS (tail)->cdr)
+ for (tail = Vprocess_alist; CONSP (tail); tail = XCDR (tail))
{
- proc = XCONS (XCONS (tail)->car)->cdr;
+ proc = XCDR (XCAR (tail));
p = XPROCESS (proc);
if (EQ (p->childp, Qt) && XFASTINT (p->pid) == pid)
break;
/* Look for an asynchronous process whose pid hasn't been filled
in yet. */
if (p == 0)
- for (tail = Vprocess_alist; CONSP (tail); tail = XCONS (tail)->cdr)
+ for (tail = Vprocess_alist; CONSP (tail); tail = XCDR (tail))
{
- proc = XCONS (XCONS (tail)->car)->cdr;
+ proc = XCDR (XCAR (tail));
p = XPROCESS (proc);
if (INTEGERP (p->pid) && XINT (p->pid) == -1)
break;
exec_sentinel_unwind (data)
Lisp_Object data;
{
- XPROCESS (XCONS (data)->car)->sentinel = XCONS (data)->cdr;
+ XPROCESS (XCAR (data))->sentinel = XCDR (data);
return Qnil;
}
/* If process is terminated, deactivate it or delete it. */
symbol = p->status;
if (CONSP (p->status))
- symbol = XCONS (p->status)->car;
+ symbol = XCAR (p->status);
if (EQ (symbol, Qsignal) || EQ (symbol, Qexit)
|| EQ (symbol, Qclosed))
/* If waiting for non-nil in a cell, record where. */
if (CONSP (read_kbd))
{
- wait_for_cell = &XCONS (read_kbd)->car;
+ wait_for_cell = &XCAR (read_kbd);
XSETFASTINT (read_kbd, 0);
}
clear_waiting_for_input ();
/* If we woke up due to SIGWINCH, actually change size now. */
- do_pending_window_change ();
+ do_pending_window_change (0);
if (time_limit && nfds == 0 && ! timeout_reduced_for_timers)
/* We waited the full specified time, so return now. */