From: Paul Eggert <eggert@cs.ucla.edu>
To: 12881@debbugs.gnu.org
Subject: bug#12881: Assume at least POSIX.1-1988 for fcntl.h
Date: Tue, 13 Nov 2012 23:37:58 -0800 [thread overview]
Message-ID: <50A34A56.9080007@cs.ucla.edu> (raw)
[-- Attachment #1: Type: text/plain, Size: 485 bytes --]
Tags: patch
On POSIXish hosts it's long been safe to assume at least
POSIX.1-1988, as the pre-POSIX platforms died out long ago.
Attached is a patch to simplify Emacs to assume this
for <fcntl.h>. I haven't tested this on Windows but have
tried to make the Windows port work by renaming its O_NDELAY
flag to O_NONBLOCK, as POSIX standardized the spelling of this
flag to be O_NONBLOCK. I'll CC: this patch to Eli to give
him a heads-up. This patch is relative to trunk bzr 110892.
[-- Attachment #2: fcntl.txt --]
[-- Type: text/plain, Size: 17926 bytes --]
=== modified file 'ChangeLog'
--- ChangeLog 2012-11-14 04:55:41 +0000
+++ ChangeLog 2012-11-14 07:26:25 +0000
@@ -1,5 +1,8 @@
2012-11-14 Paul Eggert <eggert@cs.ucla.edu>
+ Assume POSIX 1003.1-1988 or later for fcntl.h.
+ * lib/gnulib.mk: Regenerate.
+
Use faccessat, not access, when checking file permissions (Bug#12632).
* .bzrignore: Add lib/fcntl.h.
* configure.ac (euidaccess): Remove check; gnulib does this for us now.
=== modified file 'admin/CPP-DEFINES'
--- admin/CPP-DEFINES 2012-11-05 03:18:32 +0000
+++ admin/CPP-DEFINES 2012-11-14 07:26:25 +0000
@@ -420,8 +420,6 @@
NSIG_MINIMUM
NULL_DEVICE
ORDINARY_LINK
-O_RDONLY
-O_RDWR
PAGESIZE
PREFER_VSUSP
PTY_ITERATION
=== modified file 'admin/ChangeLog'
--- admin/ChangeLog 2012-11-14 04:55:41 +0000
+++ admin/ChangeLog 2012-11-14 07:26:25 +0000
@@ -1,5 +1,9 @@
2012-11-14 Paul Eggert <eggert@cs.ucla.edu>
+ Assume POSIX 1003.1-1988 or later for fcntl.h.
+ * CPP-DEFINES (O_RDONLY, O_RDWR): Remove.
+ * merge-gnulib (GNULIB_MODULES): Add fcntl-h.
+
Use faccessat, not access, when checking file permissions (Bug#12632).
* merge-gnulib (GNULIB_MODULES): Add faccessat.
(GNULIB_TOOL_FLAGS): Avoid at-internal, fchdir, malloc-posix,
=== modified file 'admin/merge-gnulib'
--- admin/merge-gnulib 2012-11-14 04:55:41 +0000
+++ admin/merge-gnulib 2012-11-14 07:26:25 +0000
@@ -29,7 +29,7 @@
alloca-opt c-ctype c-strcase
careadlinkat close-stream crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512
dtoastr dtotimespec dup2 environ execinfo faccessat
- filemode getloadavg getopt-gnu gettime gettimeofday
+ fcntl-h filemode getloadavg getopt-gnu gettime gettimeofday
ignore-value intprops largefile lstat
manywarnings mktime pselect pthread_sigmask readlink
socklen stat-time stdalign stdarg stdbool stdio
=== modified file 'lib/gnulib.mk'
--- lib/gnulib.mk 2012-11-14 04:55:41 +0000
+++ lib/gnulib.mk 2012-11-14 07:26:25 +0000
@@ -21,7 +21,7 @@
# the same distribution terms as the rest of that program.
#
# Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=at-internal --avoid=errno --avoid=fchdir --avoid=fcntl --avoid=fstat --avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=openat-die --avoid=openat-h --avoid=raise --avoid=save-cwd --avoid=select --avoid=sigprocmask --avoid=sys_types --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt c-ctype c-strcase careadlinkat close-stream crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo faccessat filemode getloadavg getopt-gnu gettime gettimeofday ignore-value intprops largefile lstat manywarnings mktime pselect pthread_sigmask readlink socklen stat-time stdalign stdarg stdbool stdio strftime strtoimax strtoumax symlink sys_stat sys_time time timer-time timespec-add timespec-sub utimens warnings
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=at-internal --avoid=errno --avoid=fchdir --avoid=fcntl --avoid=fstat --avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=openat-die --avoid=openat-h --avoid=raise --avoid=save-cwd --avoid=select --avoid=sigprocmask --avoid=sys_types --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt c-ctype c-strcase careadlinkat close-stream crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo faccessat fcntl-h filemode getloadavg getopt-gnu gettime gettimeofday ignore-value intprops largefile lstat manywarnings mktime pselect pthread_sigmask readlink socklen stat-time stdalign stdarg stdbool stdio strftime strtoimax strtoumax symlink sys_stat sys_time time timer-time timespec-add timespec-sub utimens warnings
MOSTLYCLEANFILES += core *.stackdump
=== modified file 'nt/ChangeLog'
--- nt/ChangeLog 2012-11-14 04:55:41 +0000
+++ nt/ChangeLog 2012-11-14 07:26:25 +0000
@@ -1,5 +1,9 @@
2012-11-14 Paul Eggert <eggert@cs.ucla.edu>
+ Assume POSIX 1003.1-1988 or later for fcntl.h.
+ * inc/sys/socket.h (O_NONBLOCK): Rename from O_NDELAY, since the
+ POSIX name for this flag is O_NONBLOCK. All uses changed.
+
Use faccessat, not access, when checking file permissions (Bug#12632).
* inc/ms-w32.h (AT_FDCWD, AT_EACCESS): New symbols.
(access): Remove.
=== modified file 'nt/inc/sys/socket.h'
--- nt/inc/sys/socket.h 2012-09-30 21:36:42 +0000
+++ nt/inc/sys/socket.h 2012-11-14 07:26:25 +0000
@@ -119,7 +119,7 @@
an fcntl function, for setting sockets to non-blocking mode. */
int fcntl (int s, int cmd, int options);
#define F_SETFL 4
-#define O_NDELAY 04000
+#define O_NONBLOCK 04000
/* we are providing a real h_errno variable */
#undef h_errno
=== modified file 'src/ChangeLog'
--- src/ChangeLog 2012-11-14 04:55:41 +0000
+++ src/ChangeLog 2012-11-14 07:26:25 +0000
@@ -1,5 +1,24 @@
2012-11-14 Paul Eggert <eggert@cs.ucla.edu>
+ Assume POSIX 1003.1-1988 or later for fcntl.h.
+ * callproc.c (relocate_fd): Assume F_DUPFD.
+ * emacs.c, term.c (O_RDWR): Remove.
+ * keyboard.c (tty_read_avail_input): Use O_NONBLOCK rather than
+ O_NDELAY, since O_NONBLOCK is the standard name for this flag.
+ * process.c (NON_BLOCKING_CONNECT, allocate_pty, create_process)
+ (create_pty, Fmake_network_process, server_accept_connection)
+ (wait_reading_process_output, init_process_emacs):
+ Assume O_NONBLOCK.
+ (create_process): Assume FD_CLOEXEC.
+ (create_process, create_pty): Assume O_NOCTTY.
+ * sysdep.c (init_sys_modes, reset_sys_modes): Assume F_SETFL.
+ (reset_sys_modes): Use O_NONBLOCK rather than O_NDELAY.
+ (serial_open): Assume O_NONBLOCK and O_NOCTTY.
+ * term.c (O_NOCTTY): Remove.
+ (init_tty): Assume O_IGNORE_CTTY is defined to 0 on platforms that
+ lack it, since gnulib guarantees this.
+ * w32.c (fcntl): Test for O_NONBLOCK rather than O_NDELAY.
+
Use faccessat, not access, when checking file permissions (Bug#12632).
This fixes a bug that has been present in Emacs since its creation.
It was reported by Chris Torek in 1983 even before GNU Emacs existed,
=== modified file 'src/callproc.c'
--- src/callproc.c 2012-11-14 04:55:41 +0000
+++ src/callproc.c 2012-11-14 07:26:25 +0000
@@ -1317,16 +1317,7 @@
return fd;
else
{
- int new;
-#ifdef F_DUPFD
- new = fcntl (fd, F_DUPFD, minfd);
-#else
- new = dup (fd);
- if (new != -1)
- /* Note that we hold the original FD open while we recurse,
- to guarantee we'll get a new FD if we need it. */
- new = relocate_fd (new, minfd);
-#endif
+ int new = fcntl (fd, F_DUPFD, minfd);
if (new == -1)
{
const char *message_1 = "Error while setting up child: ";
=== modified file 'src/emacs.c'
--- src/emacs.c 2012-11-08 19:12:23 +0000
+++ src/emacs.c 2012-11-14 07:26:25 +0000
@@ -95,10 +95,6 @@
#include <sys/personality.h>
#endif
-#ifndef O_RDWR
-#define O_RDWR 2
-#endif
-
static const char emacs_version[] = VERSION;
static const char emacs_copyright[] = COPYRIGHT;
=== modified file 'src/keyboard.c'
--- src/keyboard.c 2012-11-08 09:26:40 +0000
+++ src/keyboard.c 2012-11-14 07:26:25 +0000
@@ -6948,7 +6948,7 @@
#elif defined USG || defined CYGWIN
/* Read some input if available, but don't wait. */
n_to_read = sizeof cbuf;
- fcntl (fileno (tty->input), F_SETFL, O_NDELAY);
+ fcntl (fileno (tty->input), F_SETFL, O_NONBLOCK);
#else
# error "Cannot read without possibly delaying"
#endif
@@ -6982,7 +6982,7 @@
}
while (
/* We used to retry the read if it was interrupted.
- But this does the wrong thing when O_NDELAY causes
+ But this does the wrong thing when O_NONBLOCK causes
an EAGAIN error. Does anybody know of a situation
where a retry is actually needed? */
#if 0
=== modified file 'src/process.c'
--- src/process.c 2012-11-14 04:55:41 +0000
+++ src/process.c 2012-11-14 07:26:25 +0000
@@ -208,11 +208,9 @@
#ifndef NON_BLOCKING_CONNECT
#ifdef HAVE_SELECT
#if defined (HAVE_GETPEERNAME) || defined (GNU_LINUX)
-#if O_NONBLOCK || O_NDELAY
#if defined (EWOULDBLOCK) || defined (EINPROGRESS)
#define NON_BLOCKING_CONNECT
#endif /* EWOULDBLOCK || EINPROGRESS */
-#endif /* O_NONBLOCK || O_NDELAY */
#endif /* HAVE_GETPEERNAME || GNU_LINUX */
#endif /* HAVE_SELECT */
#endif /* NON_BLOCKING_CONNECT */
@@ -654,13 +652,7 @@
#ifdef PTY_OPEN
PTY_OPEN;
#else /* no PTY_OPEN */
- {
-# if O_NONBLOCK
- fd = emacs_open (pty_name, O_RDWR | O_NONBLOCK, 0);
-# else
- fd = emacs_open (pty_name, O_RDWR | O_NDELAY, 0);
-# endif
- }
+ fd = emacs_open (pty_name, O_RDWR | O_NONBLOCK, 0);
#endif /* no PTY_OPEN */
if (fd >= 0)
@@ -1598,7 +1590,7 @@
int inchannel, outchannel;
pid_t pid;
int sv[2];
-#if !defined (WINDOWSNT) && defined (FD_CLOEXEC)
+#ifndef WINDOWSNT
int wait_child_setup[2];
#endif
#ifdef SIGCHLD
@@ -1624,13 +1616,9 @@
#if ! defined (USG) || defined (USG_SUBTTY_WORKS)
/* On most USG systems it does not work to open the pty's tty here,
then close it and reopen it in the child. */
-#if O_NOCTTY
/* Don't let this terminal become our controlling terminal
(in case we don't have one). */
forkout = forkin = emacs_open (pty_name, O_RDWR | O_NOCTTY, 0);
-#else
- forkout = forkin = emacs_open (pty_name, O_RDWR, 0);
-#endif
if (forkin < 0)
report_file_error ("Opening pty", Qnil);
#else
@@ -1659,7 +1647,7 @@
forkin = sv[0];
}
-#if !defined (WINDOWSNT) && defined (FD_CLOEXEC)
+#ifndef WINDOWSNT
{
int tem;
@@ -1678,15 +1666,8 @@
}
#endif
-#if O_NONBLOCK
fcntl (inchannel, F_SETFL, O_NONBLOCK);
fcntl (outchannel, F_SETFL, O_NONBLOCK);
-#else
-#if O_NDELAY
- fcntl (inchannel, F_SETFL, O_NDELAY);
- fcntl (outchannel, F_SETFL, O_NDELAY);
-#endif
-#endif
/* Record this as an active process, with its channels.
As a result, child_setup will close Emacs's side of the pipes. */
@@ -1845,9 +1826,7 @@
pid = child_setup (xforkin, xforkout, xforkout,
new_argv, 1, encoded_current_dir);
#else /* not WINDOWSNT */
-#ifdef FD_CLOEXEC
emacs_close (wait_child_setup[0]);
-#endif
child_setup (xforkin, xforkout, xforkout,
new_argv, 1, encoded_current_dir);
#endif /* not WINDOWSNT */
@@ -1906,7 +1885,7 @@
pset_tty_name (XPROCESS (process), lisp_pty_name);
-#if !defined (WINDOWSNT) && defined (FD_CLOEXEC)
+#ifndef WINDOWSNT
/* Wait for child_setup to complete in case that vfork is
actually defined as fork. The descriptor wait_child_setup[1]
of a pipe is closed at the child side either by close-on-exec
@@ -1943,13 +1922,9 @@
#if ! defined (USG) || defined (USG_SUBTTY_WORKS)
/* On most USG systems it does not work to open the pty's tty here,
then close it and reopen it in the child. */
-#if O_NOCTTY
/* Don't let this terminal become our controlling terminal
(in case we don't have one). */
int forkout = emacs_open (pty_name, O_RDWR | O_NOCTTY, 0);
-#else
- int forkout = emacs_open (pty_name, O_RDWR, 0);
-#endif
if (forkout < 0)
report_file_error ("Opening pty", Qnil);
#if defined (DONT_REOPEN_PTY)
@@ -1963,15 +1938,8 @@
}
#endif /* HAVE_PTYS */
-#if O_NONBLOCK
fcntl (inchannel, F_SETFL, O_NONBLOCK);
fcntl (outchannel, F_SETFL, O_NONBLOCK);
-#else
-#if O_NDELAY
- fcntl (inchannel, F_SETFL, O_NDELAY);
- fcntl (outchannel, F_SETFL, O_NDELAY);
-#endif
-#endif
/* Record this as an active process, with its channels.
As a result, child_setup will close Emacs's side of the pipes. */
@@ -2927,13 +2895,9 @@
{
/* Don't support network sockets when non-blocking mode is
not available, since a blocked Emacs is not useful. */
-#if !O_NONBLOCK && !O_NDELAY
- error ("Network servers not supported");
-#else
is_server = 1;
if (TYPE_RANGED_INTEGERP (int, tem))
backlog = XINT (tem);
-#endif
}
/* Make QCaddress an alias for :local (server) or :remote (client). */
@@ -3193,11 +3157,7 @@
#ifdef NON_BLOCKING_CONNECT
if (is_non_blocking_client)
{
-#if O_NONBLOCK
ret = fcntl (s, F_SETFL, O_NONBLOCK);
-#else
- ret = fcntl (s, F_SETFL, O_NDELAY);
-#endif
if (ret < 0)
{
xerrno = errno;
@@ -3410,13 +3370,7 @@
chan_process[inch] = proc;
-#if O_NONBLOCK
fcntl (inch, F_SETFL, O_NONBLOCK);
-#else
-#if O_NDELAY
- fcntl (inch, F_SETFL, O_NDELAY);
-#endif
-#endif
p = XPROCESS (proc);
@@ -4145,13 +4099,7 @@
chan_process[s] = proc;
-#if O_NONBLOCK
fcntl (s, F_SETFL, O_NONBLOCK);
-#else
-#if O_NDELAY
- fcntl (s, F_SETFL, O_NDELAY);
-#endif
-#endif
p = XPROCESS (proc);
@@ -4847,23 +4795,8 @@
else if (nread == -1 && errno == EWOULDBLOCK)
;
#endif
- /* ISC 4.1 defines both EWOULDBLOCK and O_NONBLOCK,
- and Emacs uses O_NONBLOCK, so what we get is EAGAIN. */
-#if O_NONBLOCK
- else if (nread == -1 && errno == EAGAIN)
- ;
-#else
-#if O_NDELAY
- else if (nread == -1 && errno == EAGAIN)
- ;
- /* Note that we cannot distinguish between no input
- available now and a closed pipe.
- With luck, a closed pipe will be accompanied by
- subprocess termination and SIGCHLD. */
- else if (nread == 0 && !NETCONN_P (proc) && !SERIALCONN_P (proc))
- ;
-#endif /* O_NDELAY */
-#endif /* O_NONBLOCK */
+ else if (nread == -1 && errno == EAGAIN)
+ ;
#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
@@ -7348,9 +7281,7 @@
#ifdef HAVE_GETSOCKNAME
ADD_SUBFEATURE (QCservice, Qt);
#endif
-#if O_NONBLOCK || O_NDELAY
ADD_SUBFEATURE (QCserver, Qt);
-#endif
for (sopt = socket_options; sopt->name; sopt++)
subfeatures = pure_cons (intern_c_string (sopt->name), subfeatures);
=== modified file 'src/sysdep.c'
--- src/sysdep.c 2012-11-14 04:55:41 +0000
+++ src/sysdep.c 2012-11-14 07:26:25 +0000
@@ -1039,8 +1039,7 @@
#endif
#endif
-#ifdef F_SETFL
-#ifdef F_GETOWN /* F_SETFL does not imply existence of F_GETOWN */
+#ifdef F_GETOWN
if (interrupt_input)
{
old_fcntl_owner[fileno (tty_out->input)] =
@@ -1058,7 +1057,6 @@
#endif /* HAVE_GPM */
}
#endif /* F_GETOWN */
-#endif /* F_SETFL */
#ifdef _IOFBF
/* This symbol is defined on recent USG systems.
@@ -1278,8 +1276,7 @@
fsync (fileno (tty_out->output));
#endif
-#ifdef F_SETFL
-#ifdef F_SETOWN /* F_SETFL does not imply existence of F_SETOWN */
+#ifdef F_SETOWN
if (interrupt_input)
{
reset_sigio (fileno (tty_out->input));
@@ -1287,11 +1284,8 @@
old_fcntl_owner[fileno (tty_out->input)]);
}
#endif /* F_SETOWN */
-#if O_NDELAY
fcntl (fileno (tty_out->input), F_SETFL,
- fcntl (fileno (tty_out->input), F_GETFL, 0) & ~O_NDELAY);
-#endif
-#endif /* F_SETFL */
+ fcntl (fileno (tty_out->input), F_GETFL, 0) & ~O_NONBLOCK);
if (tty_out->old_tty)
while (emacs_set_tty (fileno (tty_out->input),
@@ -2380,19 +2374,7 @@
int
serial_open (char *port)
{
- int fd = -1;
-
- fd = emacs_open ((char*) port,
- O_RDWR
-#if O_NONBLOCK
- | O_NONBLOCK
-#else
- | O_NDELAY
-#endif
-#if O_NOCTTY
- | O_NOCTTY
-#endif
- , 0);
+ int fd = emacs_open (port, O_RDWR | O_NOCTTY | O_NONBLOCK, 0);
if (fd < 0)
{
error ("Could not open %s: %s",
=== modified file 'src/term.c'
--- src/term.c 2012-11-14 04:55:41 +0000
+++ src/term.c 2012-11-14 07:26:25 +0000
@@ -55,14 +55,6 @@
#include "xterm.h"
#endif
-#ifndef O_RDWR
-#define O_RDWR 2
-#endif
-
-#ifndef O_NOCTTY
-#define O_NOCTTY 0
-#endif
-
/* The name of the default console device. */
#ifdef WINDOWSNT
#define DEV_TTY "CONOUT$"
@@ -2989,22 +2981,18 @@
set_tty_hooks (terminal);
{
- int fd;
+ /* Open the terminal device. */
FILE *file;
-#if O_IGNORE_CTTY
- if (!ctty)
- /* Open the terminal device. Don't recognize it as our
- controlling terminal, and don't make it the controlling tty
- if we don't have one at the moment. */
- fd = emacs_open (name, O_RDWR | O_IGNORE_CTTY | O_NOCTTY, 0);
- else
-#endif /* O_IGNORE_CTTY */
- /* Alas, O_IGNORE_CTTY is a GNU extension that seems to be only
- defined on Hurd. On other systems, we need to explicitly
- dissociate ourselves from the controlling tty when we want to
- open a frame on the same terminal. */
- fd = emacs_open (name, O_RDWR | O_NOCTTY, 0);
+ /* If !ctty, don't recognize it as our controlling terminal, and
+ don't make it the controlling tty if we don't have one now.
+
+ Alas, O_IGNORE_CTTY is a GNU extension that seems to be only
+ defined on Hurd. On other systems, we need to explicitly
+ dissociate ourselves from the controlling tty when we want to
+ open a frame on the same terminal. */
+ int flags = O_RDWR | O_NOCTTY | (ctty ? 0 : O_IGNORE_CTTY);
+ int fd = emacs_open (name, flags, 0);
tty->name = xstrdup (name);
terminal->name = xstrdup (name);
@@ -3023,10 +3011,8 @@
name);
}
-#if !O_IGNORE_CTTY
- if (!ctty)
+ if (!O_IGNORE_CTTY && !ctty)
dissociate_if_controlling_tty (fd);
-#endif
file = fdopen (fd, "w+");
tty->input = file;
=== modified file 'src/w32.c'
--- src/w32.c 2012-11-14 04:55:41 +0000
+++ src/w32.c 2012-11-14 07:26:25 +0000
@@ -5849,7 +5849,7 @@
check_errno ();
if (fd_info[s].flags & FILE_SOCKET)
{
- if (cmd == F_SETFL && options == O_NDELAY)
+ if (cmd == F_SETFL && options == O_NONBLOCK)
{
unsigned long nblock = 1;
int rc = pfn_ioctlsocket (SOCK_HANDLE (s), FIONBIO, &nblock);
next reply other threads:[~2012-11-14 7:37 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-14 7:37 Paul Eggert [this message]
2012-11-14 17:33 ` bug#12881: Assume at least POSIX.1-1988 for fcntl.h Eli Zaretskii
2012-11-15 6:32 ` Paul Eggert
2012-11-15 17:42 ` Eli Zaretskii
2012-11-15 20:07 ` Paul Eggert
2012-11-16 9:49 ` Eli Zaretskii
2012-11-16 14:37 ` Stefan Monnier
2012-11-16 14:55 ` Juanma Barranquero
2012-11-16 15:26 ` Stefan Monnier
2012-11-16 16:00 ` Eli Zaretskii
2012-11-16 16:29 ` Juanma Barranquero
2012-11-16 17:41 ` Eli Zaretskii
2012-11-16 17:10 ` Stefan Monnier
2012-11-16 17:14 ` Juanma Barranquero
2012-11-16 17:20 ` Juanma Barranquero
2012-11-16 17:44 ` Eli Zaretskii
2012-11-16 17:52 ` Drew Adams
2012-11-17 22:17 ` Paul Eggert
2012-11-18 3:46 ` Eli Zaretskii
2012-11-18 4:41 ` Paul Eggert
2012-11-18 16:58 ` Eli Zaretskii
2012-11-16 4:38 ` Paul Eggert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50A34A56.9080007@cs.ucla.edu \
--to=eggert@cs.ucla.edu \
--cc=12881@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).