[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/process.c
From: |
Kim F. Storm |
Subject: |
[Emacs-diffs] Changes to emacs/src/process.c |
Date: |
Tue, 16 Sep 2003 19:05:24 -0400 |
Index: emacs/src/process.c
diff -c emacs/src/process.c:1.410 emacs/src/process.c:1.411
*** emacs/src/process.c:1.410 Sat Sep 13 19:34:33 2003
--- emacs/src/process.c Tue Sep 16 19:05:24 2003
***************
*** 965,972 ****
(process, sentinel)
register Lisp_Object process, sentinel;
{
CHECK_PROCESS (process);
! XPROCESS (process)->sentinel = sentinel;
return sentinel;
}
--- 965,978 ----
(process, sentinel)
register Lisp_Object process, sentinel;
{
+ struct Lisp_Process *p;
+
CHECK_PROCESS (process);
! p = XPROCESS (process);
!
! p->sentinel = sentinel;
! if (NETCONN1_P (p))
! p->childp = Fplist_put (p->childp, QCsentinel, sentinel);
return sentinel;
}
***************
*** 2308,2540 ****
/* The name of this option. Should be lowercase version of option
name without SO_ prefix. */
char *name;
- /* Length of name. */
- int nlen;
/* Option level SOL_... */
int optlevel;
/* Option number SO_... */
int optnum;
enum { SOPT_UNKNOWN, SOPT_BOOL, SOPT_INT, SOPT_STR, SOPT_LINGER } opttype;
} socket_options[] =
{
#ifdef SO_BINDTODEVICE
! { "bindtodevice", 12, SOL_SOCKET, SO_BINDTODEVICE, SOPT_STR },
#endif
#ifdef SO_BROADCAST
! { "broadcast", 9, SOL_SOCKET, SO_BROADCAST, SOPT_BOOL },
#endif
#ifdef SO_DONTROUTE
! { "dontroute", 9, SOL_SOCKET, SO_DONTROUTE, SOPT_BOOL },
#endif
#ifdef SO_KEEPALIVE
! { "keepalive", 9, SOL_SOCKET, SO_KEEPALIVE, SOPT_BOOL },
#endif
#ifdef SO_LINGER
! { "linger", 6, SOL_SOCKET, SO_LINGER, SOPT_LINGER },
#endif
#ifdef SO_OOBINLINE
! { "oobinline", 9, SOL_SOCKET, SO_OOBINLINE, SOPT_BOOL },
#endif
#ifdef SO_PRIORITY
! { "priority", 8, SOL_SOCKET, SO_PRIORITY, SOPT_INT },
#endif
#ifdef SO_REUSEADDR
! { "reuseaddr", 9, SOL_SOCKET, SO_REUSEADDR, SOPT_BOOL },
#endif
! { 0, 0, 0, 0, SOPT_UNKNOWN }
};
! /* Process list of socket options OPTS on socket S.
! Only check if options are supported is S < 0.
! If NO_ERROR is non-zero, continue silently if an option
! cannot be set.
!
! Each element specifies one option. An element is either a string
! "OPTION=VALUE" or a cons (OPTION . VALUE) where OPTION is a string
! or a symbol. */
static int
! set_socket_options (s, opts, no_error)
int s;
! Lisp_Object opts;
! int no_error;
{
! if (!CONSP (opts))
! opts = Fcons (opts, Qnil);
! while (CONSP (opts))
! {
! Lisp_Object opt;
! Lisp_Object val;
! char *name, *arg;
! struct socket_options *sopt;
! int ret = 0;
!
! opt = XCAR (opts);
! opts = XCDR (opts);
!
! name = 0;
! val = Qt;
! if (CONSP (opt))
! {
! val = XCDR (opt);
! opt = XCAR (opt);
! }
! if (STRINGP (opt))
! name = (char *) SDATA (opt);
! else if (SYMBOLP (opt))
! name = (char *) SDATA (SYMBOL_NAME (opt));
! else {
! error ("Mal-formed option list");
! return 0;
! }
! if (strncmp (name, "no", 2) == 0)
! {
! val = Qnil;
! name += 2;
! }
! arg = 0;
! for (sopt = socket_options; sopt->name; sopt++)
! if (strncmp (name, sopt->name, sopt->nlen) == 0)
! {
! if (name[sopt->nlen] == 0)
! break;
! if (name[sopt->nlen] == '=')
! {
! arg = name + sopt->nlen + 1;
! break;
! }
! }
! switch (sopt->opttype)
! {
! case SOPT_BOOL:
! {
! int optval;
! if (s < 0)
! return 1;
! if (arg)
! optval = (*arg == '0' || *arg == 'n') ? 0 : 1;
! else if (INTEGERP (val))
! optval = XINT (val) == 0 ? 0 : 1;
! else
! optval = NILP (val) ? 0 : 1;
! ret = setsockopt (s, sopt->optlevel, sopt->optnum,
! &optval, sizeof (optval));
! break;
! }
! case SOPT_INT:
! {
! int optval;
! if (arg)
! optval = atoi(arg);
! else if (INTEGERP (val))
! optval = XINT (val);
! else
! error ("Bad option argument for %s", name);
! if (s < 0)
! return 1;
! ret = setsockopt (s, sopt->optlevel, sopt->optnum,
! &optval, sizeof (optval));
! break;
! }
! case SOPT_STR:
! {
! if (!arg)
! {
! if (NILP (val))
! arg = "";
! else if (STRINGP (val))
! arg = (char *) SDATA (val);
! else if (XSYMBOL (val))
! arg = (char *) SDATA (SYMBOL_NAME (val));
! else
! error ("Invalid argument to %s option", name);
! }
! ret = setsockopt (s, sopt->optlevel, sopt->optnum,
! arg, strlen (arg));
! }
#ifdef SO_LINGER
! case SOPT_LINGER:
! {
! struct linger linger;
! linger.l_onoff = 1;
! linger.l_linger = 0;
! if (s < 0)
! return 1;
! if (arg)
! {
! if (*arg == 'n' || *arg == 't' || *arg == 'y')
! linger.l_onoff = (*arg == 'n') ? 0 : 1;
! else
! linger.l_linger = atoi(arg);
! }
! else if (INTEGERP (val))
! linger.l_linger = XINT (val);
! else
! linger.l_onoff = NILP (val) ? 0 : 1;
! ret = setsockopt (s, sopt->optlevel, sopt->optnum,
! &linger, sizeof (linger));
! break;
! }
! #endif
! default:
! if (s < 0)
! return 0;
! if (no_error)
! continue;
! error ("Unsupported option: %s", name);
! }
! if (ret < 0 && ! no_error)
! report_file_error ("Cannot set network option: %s", opt);
! }
! return 1;
! }
!
! DEFUN ("set-network-process-options",
! Fset_network_process_options, Sset_network_process_options,
! 1, MANY, 0,
! doc: /* Set one or more options for network process PROCESS.
! Each option is either a string "OPT=VALUE" or a cons (OPT . VALUE).
! A boolean value is false if it either zero or nil, true otherwise.
!
! The following options are known. Consult the relevant system manual
! pages for more information.
!
! bindtodevice=NAME -- bind to interface NAME, or remove binding if nil.
! broadcast=BOOL -- Allow send and receive of datagram broadcasts.
! dontroute=BOOL -- Only send to directly connected hosts.
! keepalive=BOOL -- Send keep-alive messages on network stream.
! linger=BOOL or TIMEOUT -- Send queued messages before closing.
! oobinline=BOOL -- Place out-of-band data in receive data stream.
! priority=INT -- Set protocol defined priority for sent packets.
! reuseaddr=BOOL -- Allow reusing a recently used address.
! usage: (set-network-process-options PROCESS &rest OPTIONS) */)
! (nargs, args)
! int nargs;
! Lisp_Object *args;
{
! Lisp_Object process;
! Lisp_Object opts;
- process = args[0];
CHECK_PROCESS (process);
! if (nargs > 1 && XINT (XPROCESS (process)->infd) >= 0)
! {
! opts = Flist (nargs, args);
! set_socket_options (XINT (XPROCESS (process)->infd), opts, 0);
! }
! return process;
}
/* A version of request_sigio suitable for a record_unwind_protect. */
--- 2314,2471 ----
/* The name of this option. Should be lowercase version of option
name without SO_ prefix. */
char *name;
/* Option level SOL_... */
int optlevel;
/* Option number SO_... */
int optnum;
enum { SOPT_UNKNOWN, SOPT_BOOL, SOPT_INT, SOPT_STR, SOPT_LINGER } opttype;
+ enum { OPIX_NONE=0, OPIX_MISC=1, OPIX_REUSEADDR=2 } optbit;
} socket_options[] =
{
#ifdef SO_BINDTODEVICE
! { ":bindtodevice", SOL_SOCKET, SO_BINDTODEVICE, SOPT_STR, OPIX_MISC },
#endif
#ifdef SO_BROADCAST
! { ":broadcast", SOL_SOCKET, SO_BROADCAST, SOPT_BOOL, OPIX_MISC },
#endif
#ifdef SO_DONTROUTE
! { ":dontroute", SOL_SOCKET, SO_DONTROUTE, SOPT_BOOL, OPIX_MISC },
#endif
#ifdef SO_KEEPALIVE
! { ":keepalive", SOL_SOCKET, SO_KEEPALIVE, SOPT_BOOL, OPIX_MISC },
#endif
#ifdef SO_LINGER
! { ":linger", SOL_SOCKET, SO_LINGER, SOPT_LINGER, OPIX_MISC },
#endif
#ifdef SO_OOBINLINE
! { ":oobinline", SOL_SOCKET, SO_OOBINLINE, SOPT_BOOL, OPIX_MISC },
#endif
#ifdef SO_PRIORITY
! { ":priority", SOL_SOCKET, SO_PRIORITY, SOPT_INT, OPIX_MISC },
#endif
#ifdef SO_REUSEADDR
! { ":reuseaddr", SOL_SOCKET, SO_REUSEADDR, SOPT_BOOL, OPIX_REUSEADDR },
#endif
! { 0, 0, 0, SOPT_UNKNOWN, OPIX_NONE }
};
! /* Set option OPT to value VAL on socket S.
!
! Returns (1<<socket_options[OPT].optbit) if option is known, 0 otherwise.
! Signals an error if setting a known option fails.
! */
static int
! set_socket_option (s, opt, val)
int s;
! Lisp_Object opt, val;
{
! char *name;
! struct socket_options *sopt;
! int ret = 0;
! CHECK_SYMBOL (opt);
! name = (char *) SDATA (SYMBOL_NAME (opt));
! for (sopt = socket_options; sopt->name; sopt++)
! if (strcmp (name, sopt->name) == 0)
! break;
! switch (sopt->opttype)
! {
! case SOPT_BOOL:
! {
! int optval;
! optval = NILP (val) ? 0 : 1;
! ret = setsockopt (s, sopt->optlevel, sopt->optnum,
! &optval, sizeof (optval));
! break;
! }
! case SOPT_INT:
! {
! int optval;
! if (INTEGERP (val))
! optval = XINT (val);
! else
! error ("Bad option value for %s", name);
! ret = setsockopt (s, sopt->optlevel, sopt->optnum,
! &optval, sizeof (optval));
! break;
! }
! case SOPT_STR:
! {
! char *arg;
! if (NILP (val))
! arg = "";
! else if (STRINGP (val))
! arg = (char *) SDATA (val);
! else if (XSYMBOL (val))
! arg = (char *) SDATA (SYMBOL_NAME (val));
! else
! error ("Bad option value for %s", name);
! ret = setsockopt (s, sopt->optlevel, sopt->optnum,
! arg, strlen (arg));
! }
#ifdef SO_LINGER
! case SOPT_LINGER:
! {
! struct linger linger;
! linger.l_onoff = 1;
! linger.l_linger = 0;
! if (INTEGERP (val))
! linger.l_linger = XINT (val);
! else
! linger.l_onoff = NILP (val) ? 0 : 1;
! ret = setsockopt (s, sopt->optlevel, sopt->optnum,
! &linger, sizeof (linger));
! break;
! }
! #endif
! default:
! return 0;
! }
! if (ret < 0)
! report_file_error ("Cannot set network option",
! Fcons (opt, Fcons (val, Qnil)));
! return (1 << sopt->optbit);
! }
!
! DEFUN ("set-network-process-option",
! Fset_network_process_option, Sset_network_process_option,
! 3, 4, 0,
! doc: /* For network process PROCESS set option OPTION to value VALUE.
! See `make-network-process' for a list of options and values.
! If optional fourth arg NO-ERROR is non-nil, don't signal an error if
! OPTION is not a supported option, return nil instead; otherwise return t. */)
! (process, option, value, no_error)
! Lisp_Object process, option, value;
! Lisp_Object no_error;
{
! int s, i;
CHECK_PROCESS (process);
!
! s = XINT (XPROCESS (process)->infd);
! if (s < 0)
! error ("Process is not running");
!
! if (set_socket_option (s, option, value))
! return Qt;
!
! if (NILP (no_error))
! error ("Unknown or unsupported option");
!
! return Qnil;
}
+
/* A version of request_sigio suitable for a record_unwind_protect. */
***************
*** 2614,2623 ****
this format in portable code, as it may depend on implementation
defined constants, data sizes, and data structure alignment.
! :coding CODING -- CODING is coding system for this process.
!
! :options OPTIONS -- Set the specified options for the network process.
! See `set-network-process-options' for details.
:nowait BOOL -- If BOOL is non-nil for a stream type client process,
return without waiting for the connection to complete; instead, the
--- 2545,2554 ----
this format in portable code, as it may depend on implementation
defined constants, data sizes, and data structure alignment.
! :coding CODING -- If CODING is a symbol, it specifies the coding
! system used for both reading and writing for this process. If CODING
! is a cons (DECODING . ENCODING), DECODING is used for reading, and
! ENCODING is used for writing.
:nowait BOOL -- If BOOL is non-nil for a stream type client process,
return without waiting for the connection to complete; instead, the
***************
*** 2651,2663 ****
:plist PLIST -- Install PLIST as the new process' initial plist.
! :server BOOL -- if BOOL is non-nil, create a server process for the
specified FAMILY, SERVICE, and connection type (stream or datagram).
! Default is a client process.
- A server process will listen for and accept connections from
- clients. When a client connection is accepted, a new network process
- is created for the connection with the following parameters:
- The client's process name is constructed by concatenating the server
process' NAME and a client identification string.
- If the FILTER argument is non-nil, the client process will not get a
--- 2582,2613 ----
:plist PLIST -- Install PLIST as the new process' initial plist.
! :server QLEN -- if QLEN is non-nil, create a server process for the
specified FAMILY, SERVICE, and connection type (stream or datagram).
! If QLEN is an integer, it is used as the max. length of the server's
! pending connection queue (also known as the backlog); the default
! queue length is 5. Default is to create a client process.
!
! The following network options can be specified for this connection:
!
! :bindtodevice NAME -- bind to interface NAME.
! :broadcast BOOL -- Allow send and receive of datagram broadcasts.
! :dontroute BOOL -- Only send to directly connected hosts.
! :keepalive BOOL -- Send keep-alive messages on network stream.
! :linger BOOL or TIMEOUT -- Send queued messages before closing.
! :oobinline BOOL -- Place out-of-band data in receive data stream.
! :priority INT -- Set protocol defined priority for sent packets.
! :reuseaddr BOOL -- Allow reusing a recently used local address
! (this is allowed by default for a server process).
!
! Consult the relevant system programmer's manual pages for more
! information on using these options.
!
!
! A server process will listen for and accept connections from clients.
! When a client connection is accepted, a new network process is created
! for the connection with the following parameters:
- The client's process name is constructed by concatenating the server
process' NAME and a client identification string.
- If the FILTER argument is non-nil, the client process will not get a
***************
*** 2718,2724 ****
Lisp_Object name, buffer, host, service, address;
Lisp_Object filter, sentinel;
int is_non_blocking_client = 0;
! int is_server = 0;
int socktype;
int family = -1;
--- 2668,2674 ----
Lisp_Object name, buffer, host, service, address;
Lisp_Object filter, sentinel;
int is_non_blocking_client = 0;
! int is_server = 0, backlog = 5;
int socktype;
int family = -1;
***************
*** 2755,2760 ****
--- 2705,2712 ----
error ("Network servers not supported");
#else
is_server = 1;
+ if (INTEGERP (tem))
+ backlog = XINT (tem);
#endif
}
***************
*** 3007,3012 ****
--- 2959,2966 ----
for (lres = res; lres; lres = lres->ai_next)
{
+ int optn, optbits;
+
s = socket (lres->ai_family, lres->ai_socktype, lres->ai_protocol);
if (s < 0)
{
***************
*** 3040,3056 ****
/* Make us close S if quit. */
record_unwind_protect (close_file_unwind, make_number (s));
if (is_server)
{
/* Configure as a server socket. */
#ifdef HAVE_LOCAL_SOCKETS
if (family != AF_LOCAL)
#endif
! {
! int optval = 1;
! if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof
optval))
! report_file_error ("Cannot set reuse option on server socket.",
Qnil);
! }
if (bind (s, lres->ai_addr, lres->ai_addrlen))
report_file_error ("Cannot bind server socket", Qnil);
--- 2994,3020 ----
/* Make us close S if quit. */
record_unwind_protect (close_file_unwind, make_number (s));
+ /* Parse network options in the arg list.
+ We simply ignore anything which isn't a known option (including other
keywords).
+ An error is signalled if setting a known option fails. */
+ for (optn = optbits = 0; optn < nargs-1; optn += 2)
+ optbits |= set_socket_option (s, args[optn], args[optn+1]);
+
if (is_server)
{
/* Configure as a server socket. */
+
+ /* SO_REUSEADDR = 1 is default for server sockets; must specify
+ explicit :reuseaddr key to override this. */
#ifdef HAVE_LOCAL_SOCKETS
if (family != AF_LOCAL)
#endif
! if (!(optbits & (1 << OPIX_REUSEADDR)))
! {
! int optval = 1;
! if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof
optval))
! report_file_error ("Cannot set reuse option on server
socket.", Qnil);
! }
if (bind (s, lres->ai_addr, lres->ai_addrlen))
report_file_error ("Cannot bind server socket", Qnil);
***************
*** 3069,3075 ****
}
#endif
! if (socktype == SOCK_STREAM && listen (s, 5))
report_file_error ("Cannot listen on server socket", Qnil);
break;
--- 3033,3039 ----
}
#endif
! if (socktype == SOCK_STREAM && listen (s, backlog))
report_file_error ("Cannot listen on server socket", Qnil);
break;
***************
*** 3205,3214 ****
report_file_error ("make client process failed", contact);
}
- tem = Fplist_get (contact, QCoptions);
- if (!NILP (tem))
- set_socket_options (s, tem, 1);
-
#endif /* not TERM */
inch = s;
--- 3169,3174 ----
***************
*** 3290,3296 ****
Lisp_Object args[5], val;
if (!NILP (tem))
! val = XCAR (XCDR (tem));
else if (!NILP (Vcoding_system_for_read))
val = Vcoding_system_for_read;
else if ((!NILP (buffer) && NILP (XBUFFER
(buffer)->enable_multibyte_characters))
--- 3250,3260 ----
Lisp_Object args[5], val;
if (!NILP (tem))
! {
! val = XCAR (XCDR (tem));
! if (CONSP (val))
! val = XCAR (val);
! }
else if (!NILP (Vcoding_system_for_read))
val = Vcoding_system_for_read;
else if ((!NILP (buffer) && NILP (XBUFFER
(buffer)->enable_multibyte_characters))
***************
*** 3322,3328 ****
p->decode_coding_system = val;
if (!NILP (tem))
! val = XCAR (XCDR (tem));
else if (!NILP (Vcoding_system_for_write))
val = Vcoding_system_for_write;
else if (NILP (current_buffer->enable_multibyte_characters))
--- 3286,3296 ----
p->decode_coding_system = val;
if (!NILP (tem))
! {
! val = XCAR (XCDR (tem));
! if (CONSP (val))
! val = XCDR (val);
! }
else if (!NILP (Vcoding_system_for_write))
val = Vcoding_system_for_write;
else if (NILP (current_buffer->enable_multibyte_characters))
***************
*** 3490,3496 ****
{ 0, 0 }
};
! DEFUN ("get-network-interface-info", Fget_network_interface_info,
Sget_network_interface_info, 1, 1, 0,
doc: /* Return information about network interface named IFNAME.
The return value is a list (ADDR BCAST NETMASK HWADDR FLAGS),
where ADDR is the layer 3 address, BCAST is the layer 3 broadcast address,
--- 3458,3464 ----
{ 0, 0 }
};
! DEFUN ("network-interface-info", Fnetwork_interface_info,
Snetwork_interface_info, 1, 1, 0,
doc: /* Return information about network interface named IFNAME.
The return value is a list (ADDR BCAST NETMASK HWADDR FLAGS),
where ADDR is the layer 3 address, BCAST is the layer 3 broadcast address,
***************
*** 6540,6545 ****
--- 6508,6515 ----
#ifdef HAVE_SOCKETS
{
Lisp_Object subfeatures = Qnil;
+ struct socket_options *sopt;
+
#define ADD_SUBFEATURE(key, val) \
subfeatures = Fcons (Fcons (key, Fcons (val, Qnil)), subfeatures)
***************
*** 6558,6587 ****
#if !defined(TERM) && (defined(O_NONBLOCK) || defined(O_NDELAY))
ADD_SUBFEATURE (QCserver, Qt);
#endif
! #ifdef SO_BINDTODEVICE
! ADD_SUBFEATURE (QCoptions, intern ("bindtodevice"));
! #endif
! #ifdef SO_BROADCAST
! ADD_SUBFEATURE (QCoptions, intern ("broadcast"));
! #endif
! #ifdef SO_DONTROUTE
! ADD_SUBFEATURE (QCoptions, intern ("dontroute"));
! #endif
! #ifdef SO_KEEPALIVE
! ADD_SUBFEATURE (QCoptions, intern ("keepalive"));
! #endif
! #ifdef SO_LINGER
! ADD_SUBFEATURE (QCoptions, intern ("linger"));
! #endif
! #ifdef SO_OOBINLINE
! ADD_SUBFEATURE (QCoptions, intern ("oobinline"));
! #endif
! #ifdef SO_PRIORITY
! ADD_SUBFEATURE (QCoptions, intern ("priority"));
! #endif
! #ifdef SO_REUSEADDR
! ADD_SUBFEATURE (QCoptions, intern ("reuseaddr"));
! #endif
Fprovide (intern ("make-network-process"), subfeatures);
}
#endif /* HAVE_SOCKETS */
--- 6528,6537 ----
#if !defined(TERM) && (defined(O_NONBLOCK) || defined(O_NDELAY))
ADD_SUBFEATURE (QCserver, Qt);
#endif
!
! for (sopt = socket_options; sopt->name; sopt++)
! subfeatures = Fcons (intern (sopt->name), subfeatures);
!
Fprovide (intern ("make-network-process"), subfeatures);
}
#endif /* HAVE_SOCKETS */
***************
*** 6703,6716 ****
defsubr (&Sprocess_list);
defsubr (&Sstart_process);
#ifdef HAVE_SOCKETS
! defsubr (&Sset_network_process_options);
defsubr (&Smake_network_process);
defsubr (&Sformat_network_address);
#ifdef SIOCGIFCONF
defsubr (&Snetwork_interface_list);
#endif
#if defined(SIOCGIFADDR) || defined(SIOCGIFHWADDR) || defined(SIOCGIFFLAGS)
! defsubr (&Sget_network_interface_info);
#endif
#endif /* HAVE_SOCKETS */
#ifdef DATAGRAM_SOCKETS
--- 6653,6666 ----
defsubr (&Sprocess_list);
defsubr (&Sstart_process);
#ifdef HAVE_SOCKETS
! defsubr (&Sset_network_process_option);
defsubr (&Smake_network_process);
defsubr (&Sformat_network_address);
#ifdef SIOCGIFCONF
defsubr (&Snetwork_interface_list);
#endif
#if defined(SIOCGIFADDR) || defined(SIOCGIFHWADDR) || defined(SIOCGIFFLAGS)
! defsubr (&Snetwork_interface_info);
#endif
#endif /* HAVE_SOCKETS */
#ifdef DATAGRAM_SOCKETS
- [Emacs-diffs] Changes to emacs/src/process.c, Miles Bader, 2003/09/01
- [Emacs-diffs] Changes to emacs/src/process.c, Kim F. Storm, 2003/09/13
- [Emacs-diffs] Changes to emacs/src/process.c,
Kim F. Storm <=
- [Emacs-diffs] Changes to emacs/src/process.c, Kim F. Storm, 2003/09/17
- [Emacs-diffs] Changes to emacs/src/process.c, Dave Love, 2003/09/18
- [Emacs-diffs] Changes to emacs/src/process.c, Dave Love, 2003/09/23
- [Emacs-diffs] Changes to emacs/src/process.c, Kim F. Storm, 2003/09/23
- [Emacs-diffs] Changes to emacs/src/process.c, Kenichi Handa, 2003/09/26