allocate_pty() tries all the different known easy ways of opening
a pty. In case of failure, we resort to the old BSD-style pty
grovelling code in allocate_pty_the_old_fashioned_way(). */
+#ifndef FORCE_ALLOCATE_PTY_THE_OLD_FASHIONED_WAY
int master_fd = -1;
const char *slave_name = NULL;
const char *clone = NULL;
lose:
if (master_fd >= 0)
close (master_fd);
+#endif /* ndef FORCE_ALLOCATE_PTY_THE_OLD_FASHIONED_WAY */
return allocate_pty_the_old_fashioned_way ();
}
#endif
set_descriptor_non_blocking (inchannel);
+ set_descriptor_non_blocking (outchannel);
/* Record this as an active process, with its channels.
As a result, child_setup will close Emacs's side of the pipes. */
int xforkin = forkin;
int xforkout = forkout;
+ /* Checking for quit in the child is bad because that will
+ cause I/O, and that, in turn, can confuse the X connection. */
+ begin_dont_check_for_quit();
+
/* Disconnect the current controlling terminal, pursuant to
making the pty be the controlling terminal of the process.
Also put us in our own process group. */
while (1)
{
- ssize_t writeret;
+ Lstream_data_count writeret;
chunklen = Lstream_read (lstream, chunkbuf, 512);
if (chunklen <= 0)
/* #### There is controversy over whether this might cause fd leakage */
/* my tests say no. -slb */
XLSTREAM (p->pipe_outstream)->flags &= ~LSTREAM_FL_IS_OPEN;
+#ifdef FILE_CODING
+ XLSTREAM (p->coding_outstream)->flags &= ~LSTREAM_FL_IS_OPEN;
+#endif
p->status_symbol = Qexit;
p->exit_code = 256; /* #### SIGPIPE ??? */
p->core_dumped = 0;
p->tick++;
process_tick++;
- deactivate_process (*((Lisp_Object *) (&vol_proc)));
+ deactivate_process (vol_proc);
invalid_operation ("SIGPIPE raised on process; closed it", p->name);
}
/* Finally send the signal. */
if (EMACS_KILLPG (pgid, signo) == -1)
- error ("kill (%ld, %ld) failed: %s",
- (long) pgid, (long) signo, strerror (errno));
+ {
+ /* It's not an error if our victim is already dead.
+ And we can't rely on the result of killing a zombie, since
+ XPG 4.2 requires that killing a zombie fail with ESRCH,
+ while FIPS 151-2 requires that it succeeds! */
+#ifdef ESRCH
+ if (errno != ESRCH)
+#endif
+ error ("kill (%ld, %ld) failed: %s",
+ (long) pgid, (long) signo, strerror (errno));
+ }
}
/* Send signal SIGCODE to any process in the system given its PID.
xzero (hints);
hints.ai_flags = AI_CANONNAME;
+#ifdef IPV6_CANONICALIZE
hints.ai_family = AF_UNSPEC;
+#else
+ hints.ai_family = PF_INET;
+#endif
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = 0;
LISP_STRING_TO_EXTERNAL (host, ext_host, Qnative);
failed_connect = 1;
close (s);
+ s = -1;
speed_up_interrupts ();
memset (&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = theport;
- sa.sin_addr.s_addr = htonl (inet_addr ((char *) XSTRING_DATA (dest)));
+ sa.sin_addr.s_addr = inet_addr ((char *) XSTRING_DATA (dest));
/* Socket configuration for reading ------------------------ */
}
/* join multicast group */
- imr.imr_multiaddr.s_addr = htonl (inet_addr ((char *) XSTRING_DATA (dest)));
+ imr.imr_multiaddr.s_addr = inet_addr ((char *) XSTRING_DATA (dest));
imr.imr_interface.s_addr = htonl (INADDR_ANY);
if (setsockopt (rs, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&imr, sizeof (struct ip_mreq)) < 0)