GNU bug report logs - #12958
Assume POSIX 1003.1-1988 or later for dirent.h.

Previous Next

Package: emacs;

Reported by: Paul Eggert <eggert <at> cs.ucla.edu>

Date: Thu, 22 Nov 2012 04:18:02 UTC

Severity: normal

Tags: patch

Done: Paul Eggert <eggert <at> cs.ucla.edu>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 12958 in the body.
You can then email your comments to 12958 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#12958; Package emacs. (Thu, 22 Nov 2012 04:18:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Paul Eggert <eggert <at> cs.ucla.edu>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Thu, 22 Nov 2012 04:18:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: bug-gnu-emacs <at> gnu.org
Subject: Assume POSIX 1003.1-1988 or later for dirent.h.
Date: Wed, 21 Nov 2012 20:16:23 -0800
Here's a patch that I'd like to install to simplify Emacs based
on assuming that the underyling system supports POSIX 1003.1-1988
or later with respect to dirent.h.  This is universal these days
on GNUish hosts.  I'm CC'ing this to Eli, as this affects the
Microsoft port, by updating it a bit to use the POSIXish
"struct dirent" rather than the pre-POSIX "struct direct".
I have tested this on GNU/Linux but not on Microsoft.

=== modified file 'ChangeLog'
--- ChangeLog	2012-11-21 21:06:52 +0000
+++ ChangeLog	2012-11-22 04:03:01 +0000
@@ -1,3 +1,8 @@
+2012-11-22  Paul Eggert  <eggert <at> cs.ucla.edu>
+
+	Assume POSIX 1003.1-1988 or later for dirent.h.
+	* configure.ac: Do not check for dirent.h or closdir.
+
 2012-11-21  Paul Eggert  <eggert <at> cs.ucla.edu>
 
 	Assume POSIX 1003.1-1988 or later for unistd.h (Bug#12945).

=== modified file 'admin/CPP-DEFINES'
--- admin/CPP-DEFINES	2012-11-21 21:06:52 +0000
+++ admin/CPP-DEFINES	2012-11-22 04:03:01 +0000
@@ -118,7 +118,6 @@
 HAVE_CFSETSPEED
 HAVE_CLOCK_GETTIME
 HAVE_CLOCK_SETTIME
-HAVE_CLOSEDIR
 HAVE_COFF_H
 HAVE_COM_ERR_H
 HAVE_COPYSIGN
@@ -143,7 +142,6 @@
 HAVE_DEV_PTMX
 HAVE_DIALOGS
 HAVE_DIFFTIME
-HAVE_DIRENT_H
 HAVE_DUP2
 HAVE_ENDGRENT
 HAVE_ENDPWENT

=== modified file 'admin/ChangeLog'
--- admin/ChangeLog	2012-11-21 21:06:52 +0000
+++ admin/ChangeLog	2012-11-22 04:03:01 +0000
@@ -1,3 +1,9 @@
+2012-11-22  Paul Eggert  <eggert <at> cs.ucla.edu>
+
+	Assume POSIX 1003.1-1988 or later for dirent.h.
+	* CPP-DEFINES (HAVE_CLOSEDIR, HAVE_DIRENT_H): Remove.
+	* notes/copyright: Adjust to src/ndir.h -> nt/inc/dirent.h renaming.
+
 2012-11-21  Paul Eggert  <eggert <at> cs.ucla.edu>
 
 	Assume POSIX 1003.1-1988 or later for unistd.h (Bug#12945).

=== modified file 'admin/notes/copyright'
--- admin/notes/copyright	2012-01-19 07:21:25 +0000
+++ admin/notes/copyright	2012-11-22 04:03:01 +0000
@@ -380,7 +380,7 @@
 src/gmalloc.c
   - contains numerous copyrights from the GNU C library. Leave them alone.
 
-src/ndir.h
+nt/inc/dirent.h
   - see comments below. This file is OK to be released with Emacs
   22, but we may want to revisit it afterwards.
 
@@ -429,7 +429,7 @@
   File says it's in the public domain, but that might not make it so.
 
 etc/e/eterm-color.ti
-src/ndir.h
+nt/inc/dirent.h
   On legal advice from Matt Norwood, the following comment was added
   to these files in Feb/Mar 2007:
 

=== modified file 'configure.ac'
--- configure.ac	2012-11-21 21:06:52 +0000
+++ configure.ac	2012-11-22 04:03:01 +0000
@@ -1289,7 +1289,7 @@
   linux/version.h sys/systeminfo.h
   coff.h pty.h
   sys/vlimit.h sys/resource.h
-  sys/utsname.h pwd.h utmp.h dirent.h util.h)
+  sys/utsname.h pwd.h utmp.h util.h)
 
 AC_MSG_CHECKING(if personality LINUX32 can be set)
 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/personality.h>]], [[personality (PER_LINUX32)]])],
@@ -2891,7 +2891,7 @@
 
 
 AC_CHECK_FUNCS(gethostname \
-closedir getrusage get_current_dir_name \
+getrusage get_current_dir_name \
 lrand48 \
 select getpagesize setlocale \
 utimes getrlimit setrlimit shutdown getaddrinfo \

=== modified file 'nt/ChangeLog'
--- nt/ChangeLog	2012-11-21 21:06:52 +0000
+++ nt/ChangeLog	2012-11-22 04:03:01 +0000
@@ -1,3 +1,10 @@
+2012-11-22  Paul Eggert  <eggert <at> cs.ucla.edu>
+
+	Assume POSIX 1003.1-1988 or later for dirent.h.
+	* inc/dirent.h: Rename from ../src/ndir.h, with these changes:
+	(struct dirent): Rename from struct direct.  All uses changed.
+	* inc/sys/dir.h: Remove.
+
 2012-11-21  Paul Eggert  <eggert <at> cs.ucla.edu>
 
 	Assume POSIX 1003.1-1988 or later for unistd.h (Bug#12945).

=== renamed file 'src/ndir.h' => 'nt/inc/dirent.h'
--- src/ndir.h	2011-01-15 23:16:57 +0000
+++ nt/inc/dirent.h	2012-11-22 04:03:01 +0000
@@ -1,7 +1,5 @@
 /*
-	<dir.h> -- definitions for 4.2BSD-compatible directory access
-
-	last edit:	09-Jul-1983	D A Gwyn
+	<dirent.h> -- definitions for POSIX-compatible directory access
 
  * The code here is forced by the interface, and is not subject to
  * copyright, constituting the only possible expression of the
@@ -16,7 +14,7 @@
 #endif /* not WINDOWSNT */
 	/* NOTE:  MAXNAMLEN must be one less than a multiple of 4 */
 
-struct direct				/* data from readdir() */
+struct dirent				/* data from readdir() */
 	{
 	long		d_ino;		/* inode number of entry */
 	unsigned short	d_reclen;	/* length of this record */
@@ -33,9 +31,8 @@
 	}	DIR;			/* stream data from opendir() */
 
 extern DIR		*opendir (char *);
-extern struct direct	*readdir (DIR *);
+extern struct dirent	*readdir (DIR *);
 extern void		seekdir (DIR *, long);
 extern void		closedir (DIR *);
 
 #define rewinddir( dirp )	seekdir( dirp, 0L )
-

=== removed file 'nt/inc/sys/dir.h'
--- nt/inc/sys/dir.h	2011-01-15 23:16:57 +0000
+++ nt/inc/sys/dir.h	1970-01-01 00:00:00 +0000
@@ -1,6 +0,0 @@
-/*
- * map sys\dir.h to ..\..\..\src\ndir.h
- */
-
-#include "..\..\..\src\ndir.h"
-

=== modified file 'src/ChangeLog'
--- src/ChangeLog	2012-11-22 03:56:38 +0000
+++ src/ChangeLog	2012-11-22 04:06:38 +0000
@@ -1,3 +1,20 @@
+2012-11-22  Paul Eggert  <eggert <at> cs.ucla.edu>
+
+	Assume POSIX 1003.1-1988 or later for dirent.h.
+	* dired.c: Assume HAVE_DIRENT_H.
+	(NAMLEN): Remove, replacing with ...
+	(dirent_namelen): New function.  All uses changed.  Use the GNU macro
+	_D_EXACT_NAMELEN if available, as it's faster than strlen.
+	(DIRENTRY): Remove, replacing all uses with 'struct dirent'.
+	(DIRENTRY_NONEMPTY): Remove, replacing with ...
+	(dirent_nonempty): New function.  All uses changed.
+	* makefile.w32-in (DIR_H): Now just dirent.h, not sys/dir.h and ndir.h.
+	($(BLD)/w32.$(O)): Depend on $(DIR_H), not $(SRC)/ndir.h.
+	* ndir.h: Rename to ../nt/inc/dirent.h.
+	* sysdep.h (closedir) [!HAVE_CLOSEDIR]: Remove.
+	Do not include <dirent.h>; no longer needed.
+	* w32.c: Include <dirent.h> rather than "ndir.h".
+
 2012-11-22  Eli Zaretskii  <eliz <at> gnu.org>
 
 	* w32.c (getcwd): Fix the 2nd argument type, to prevent conflicts

=== modified file 'src/dired.c'
--- src/dired.c	2012-10-01 02:07:14 +0000
+++ src/dired.c	2012-11-22 04:03:01 +0000
@@ -31,44 +31,10 @@
 #include <errno.h>
 #include <unistd.h>
 
-/* The d_nameln member of a struct dirent includes the '\0' character
-   on some systems, but not on others.  What's worse, you can't tell
-   at compile-time which one it will be, since it really depends on
-   the sort of system providing the filesystem you're reading from,
-   not the system you are running on.  Paul Eggert
-   <eggert <at> bi.twinsun.com> says this occurs when Emacs is running on a
-   SunOS 4.1.2 host, reading a directory that is remote-mounted from a
-   Solaris 2.1 host and is in a native Solaris 2.1 filesystem.
-
-   Since applying strlen to the name always works, we'll just do that.  */
-#define NAMLEN(p) strlen (p->d_name)
-
-#ifdef HAVE_DIRENT_H
-
 #include <dirent.h>
-#define DIRENTRY struct dirent
-
-#else /* not HAVE_DIRENT_H */
-
-#include <sys/dir.h>
-#include <sys/stat.h>
-
-#define DIRENTRY struct direct
-
-extern DIR *opendir (char *);
-extern struct direct *readdir (DIR *);
-
-#endif /* HAVE_DIRENT_H */
-
 #include <filemode.h>
 #include <stat-time.h>
 
-#ifdef MSDOS
-#define DIRENTRY_NONEMPTY(p) ((p)->d_name[0] != 0)
-#else
-#define DIRENTRY_NONEMPTY(p) ((p)->d_ino)
-#endif
-
 #include "lisp.h"
 #include "systime.h"
 #include "character.h"
@@ -88,6 +54,28 @@
 
 static ptrdiff_t scmp (const char *, const char *, ptrdiff_t);
 
+/* Return the number of bytes in DP's name.  */
+static ptrdiff_t
+dirent_namelen (struct dirent *dp)
+{
+#ifdef _D_EXACT_NAMLEN
+  return _D_EXACT_NAMLEN (dp);
+#else
+  return strlen (dp->d_name);
+#endif
+}
+
+/* Return true if DP represents a real directory entry.  */
+static bool
+dirent_nonempty (struct dirent *dp)
+{
+#ifdef MSDOS
+  return dp->d_name[0] != 0;
+#else
+  return 1;
+#endif
+}
+
 #ifdef WINDOWSNT
 Lisp_Object
 directory_files_internal_w32_unwind (Lisp_Object arg)
@@ -124,7 +112,7 @@
   bool needsep = 0;
   ptrdiff_t count = SPECPDL_INDEX ();
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
-  DIRENTRY *dp;
+  struct dirent *dp;
 #ifdef WINDOWSNT
   Lisp_Object w32_save = Qnil;
 #endif
@@ -225,14 +213,14 @@
       if (dp == NULL)
 	break;
 
-      if (DIRENTRY_NONEMPTY (dp))
+      if (dirent_nonempty (dp))
 	{
 	  ptrdiff_t len;
 	  bool wanted = 0;
 	  Lisp_Object name, finalname;
 	  struct gcpro gcpro1, gcpro2;
 
-	  len = NAMLEN (dp);
+	  len = dirent_namelen (dp);
 	  name = finalname = make_unibyte_string (dp->d_name, len);
 	  GCPRO2 (finalname, name);
 
@@ -442,7 +430,8 @@
   return file_name_completion (file, directory, 1, Qnil);
 }
 
-static int file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr);
+static int file_name_completion_stat (Lisp_Object dirname, struct dirent *dp,
+				      struct stat *st_addr);
 static Lisp_Object Qdefault_directory;
 
 static Lisp_Object
@@ -499,7 +488,7 @@
   /* (att3b compiler bug requires do a null comparison this way) */
   while (1)
     {
-      DIRENTRY *dp;
+      struct dirent *dp;
       ptrdiff_t len;
       bool canexclude = 0;
 
@@ -517,10 +506,10 @@
 
       if (!dp) break;
 
-      len = NAMLEN (dp);
+      len = dirent_namelen (dp);
 
       QUIT;
-      if (! DIRENTRY_NONEMPTY (dp)
+      if (! dirent_nonempty (dp)
 	  || len < SCHARS (encoded_file)
 	  || 0 <= scmp (dp->d_name, SSDATA (encoded_file),
 			SCHARS (encoded_file)))
@@ -806,9 +795,10 @@
 }
 
 static int
-file_name_completion_stat (Lisp_Object dirname, DIRENTRY *dp, struct stat *st_addr)
+file_name_completion_stat (Lisp_Object dirname, struct dirent *dp,
+			   struct stat *st_addr)
 {
-  ptrdiff_t len = NAMLEN (dp);
+  ptrdiff_t len = dirent_namelen (dp);
   ptrdiff_t pos = SCHARS (dirname);
   int value;
   USE_SAFE_ALLOCA;

=== modified file 'src/makefile.w32-in'
--- src/makefile.w32-in	2012-11-17 23:16:24 +0000
+++ src/makefile.w32-in	2012-11-22 04:03:01 +0000
@@ -413,8 +413,7 @@
 		 $(MS_W32_H)
 CONFIG_H       = $(SRC)/config.h \
 		 $(CONF_POST_H)
-DIR_H          = $(NT_INC)/sys/dir.h \
-		 $(SRC)/ndir.h
+DIR_H          = $(NT_INC)/dirent.h
 W32GUI_H       = $(SRC)/w32gui.h \
 		 $(SYSTIME_H)
 DISPEXTERN_H   = $(SRC)/dispextern.h \
@@ -1175,7 +1174,6 @@
 
 $(BLD)/w32.$(O) : \
 	$(SRC)/w32.c \
-	$(SRC)/ndir.h \
 	$(SRC)/w32.h \
 	$(SRC)/w32common.h \
 	$(SRC)/w32heap.h \
@@ -1187,6 +1185,7 @@
 	$(CAREADLINKAT_H) \
 	$(CODING_H) \
 	$(CONFIG_H) \
+	$(DIR_H) \
 	$(DISPEXTERN_H) \
 	$(GRP_H) \
 	$(LISP_H) \

=== modified file 'src/sysdep.c'
--- src/sysdep.c	2012-11-21 21:06:52 +0000
+++ src/sysdep.c	2012-11-22 04:03:01 +0000
@@ -2220,28 +2220,6 @@
 		       &emacs_norealloc_allocator, careadlinkatcwd);
 }
 
-/* Directory routines for systems that don't have them. */
-
-#ifdef HAVE_DIRENT_H
-
-#include <dirent.h>
-
-#if !defined (HAVE_CLOSEDIR)
-
-int
-closedir (DIR *dirp /* stream from opendir */)
-{
-  int rtnval;
-
-  rtnval = emacs_close (dirp->dd_fd);
-  xfree (dirp);
-
-  return rtnval;
-}
-#endif /* not HAVE_CLOSEDIR */
-#endif /* HAVE_DIRENT_H */
-
-
 /* Return a struct timeval that is roughly equivalent to T.
    Use the least timeval not less than T.
    Return an extremal value if the result would overflow.  */

=== modified file 'src/w32.c'
--- src/w32.c	2012-11-22 03:56:38 +0000
+++ src/w32.c	2012-11-22 04:06:38 +0000
@@ -179,7 +179,7 @@
 #undef sendto
 
 #include "w32.h"
-#include "ndir.h"
+#include <dirent.h>
 #include "w32common.h"
 #include "w32heap.h"
 #include "w32select.h"
@@ -2448,7 +2448,7 @@
    and readdir.  We can't use the procedures supplied in sysdep.c,
    so we provide them here.  */
 
-struct direct dir_static;       /* simulated directory contents */
+struct dirent dir_static;       /* simulated directory contents */
 static HANDLE dir_find_handle = INVALID_HANDLE_VALUE;
 static int    dir_is_fat;
 static char   dir_pathname[MAXPATHLEN+1];
@@ -2518,7 +2518,7 @@
   xfree ((char *) dirp);
 }
 
-struct direct *
+struct dirent *
 readdir (DIR *dirp)
 {
   int downcase = !NILP (Vw32_downcase_file_names);
@@ -2572,7 +2572,7 @@
       downcase = 1;	/* 8+3 aliases are returned in all caps */
     }
   dir_static.d_namlen = strlen (dir_static.d_name);
-  dir_static.d_reclen = sizeof (struct direct) - MAXNAMLEN + 3 +
+  dir_static.d_reclen = sizeof (struct dirent) - MAXNAMLEN + 3 +
     dir_static.d_namlen - dir_static.d_namlen % 4;
 
   /* If the file name in cFileName[] includes `?' characters, it means





Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#12958; Package emacs. (Thu, 22 Nov 2012 04:39:01 GMT) Full text and rfc822 format available.

Message #8 received at 12958 <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 12958 <at> debbugs.gnu.org
Subject: Re: Assume POSIX 1003.1-1988 or later for dirent.h.
Date: Wed, 21 Nov 2012 20:36:45 -0800
Whoops, forgot to CC: it to Eli.  Eli, here's the
URL for this proposed cleanup patch to Emacs:

http://bugs.gnu.org/12958




Added tag(s) patch. Request was from Paul Eggert <eggert <at> cs.ucla.edu> to control <at> debbugs.gnu.org. (Thu, 22 Nov 2012 05:15:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#12958; Package emacs. (Thu, 22 Nov 2012 16:29:02 GMT) Full text and rfc822 format available.

Message #13 received at 12958 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 12958 <at> debbugs.gnu.org
Subject: Re: Assume POSIX 1003.1-1988 or later for dirent.h.
Date: Thu, 22 Nov 2012 18:26:25 +0200
> Date: Wed, 21 Nov 2012 20:36:45 -0800
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> CC: 12958 <at> debbugs.gnu.org
> 
> Whoops, forgot to CC: it to Eli.

No sweat, I'm subscribed to bug-gnu-emacs.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#12958; Package emacs. (Thu, 22 Nov 2012 17:23:02 GMT) Full text and rfc822 format available.

Message #16 received at 12958 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 12958 <at> debbugs.gnu.org
Subject: Re: bug#12958: Assume POSIX 1003.1-1988 or later for dirent.h.
Date: Thu, 22 Nov 2012 19:19:49 +0200
> Date: Wed, 21 Nov 2012 20:16:23 -0800
> From: Paul Eggert <eggert <at> cs.ucla.edu>
> 
> Here's a patch that I'd like to install to simplify Emacs based
> on assuming that the underyling system supports POSIX 1003.1-1988
> or later with respect to dirent.h.  This is universal these days
> on GNUish hosts.  I'm CC'ing this to Eli, as this affects the
> Microsoft port, by updating it a bit to use the POSIXish
> "struct dirent" rather than the pre-POSIX "struct direct".
> I have tested this on GNU/Linux but not on Microsoft.

This is OK, but this part:

> +/* Return true if DP represents a real directory entry.  */
> +static bool
> +dirent_nonempty (struct dirent *dp)
> +{
> +#ifdef MSDOS
> +  return dp->d_name[0] != 0;
> +#else
> +  return 1;
> +#endif
> +}

is not needed at all.  The reason there was an MSDOS specific
definition of DIRENT_NONEMPTY macro is that the Posix definition used
d_ino, which the MSDOS implementation doesn't provide.  But if that
member is not used, we can toss this macro and assume that every entry
is "real".

Otherwise, I see no problems with this patch.

Thanks.




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#12958; Package emacs. (Thu, 22 Nov 2012 17:51:02 GMT) Full text and rfc822 format available.

Message #19 received at 12958 <at> debbugs.gnu.org (full text, mbox):

From: Juanma Barranquero <lekktu <at> gmail.com>
To: Paul Eggert <eggert <at> cs.ucla.edu>
Cc: 12958 <at> debbugs.gnu.org
Subject: Re: bug#12958: Assume POSIX 1003.1-1988 or later for dirent.h.
Date: Thu, 22 Nov 2012 18:47:58 +0100
On Thu, Nov 22, 2012 at 5:16 AM, Paul Eggert <eggert <at> cs.ucla.edu> wrote:

> -DIR_H          = $(NT_INC)/sys/dir.h \
> -                $(SRC)/ndir.h
> +DIR_H          = $(NT_INC)/dirent.h

Just remove DIR_H, and modify dired.$(O) entry to include
$(NT_INC)/dirent.h instead just after $(SRC)/regex.h.

Thanks,

    Juanma




Reply sent to Paul Eggert <eggert <at> cs.ucla.edu>:
You have taken responsibility. (Fri, 23 Nov 2012 09:12:02 GMT) Full text and rfc822 format available.

Notification sent to Paul Eggert <eggert <at> cs.ucla.edu>:
bug acknowledged by developer. (Fri, 23 Nov 2012 09:12:03 GMT) Full text and rfc822 format available.

Message #24 received at 12958-done <at> debbugs.gnu.org (full text, mbox):

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 12958-done <at> debbugs.gnu.org
Subject: Re: bug#12958: Assume POSIX 1003.1-1988 or later for dirent.h.
Date: Fri, 23 Nov 2012 01:09:44 -0800
Thanks, Eli and Juanma.  I made both sets of changes and
installed it as trunk bzr 110986.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 21 Dec 2012 12:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 11 years and 135 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.