From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.bugs Subject: bug#12958: Assume POSIX 1003.1-1988 or later for dirent.h. Date: Wed, 21 Nov 2012 20:16:23 -0800 Organization: UCLA Computer Science Department Message-ID: <50ADA717.4060007@cs.ucla.edu> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1353557816 31324 80.91.229.3 (22 Nov 2012 04:16:56 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 22 Nov 2012 04:16:56 +0000 (UTC) To: 12958@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Thu Nov 22 05:17:07 2012 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1TbODk-0003Up-Ne for geb-bug-gnu-emacs@m.gmane.org; Thu, 22 Nov 2012 05:17:01 +0100 Original-Received: from localhost ([::1]:58416 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TbODZ-0007nV-Qe for geb-bug-gnu-emacs@m.gmane.org; Wed, 21 Nov 2012 23:16:49 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:35400) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TbODW-0007nL-AK for bug-gnu-emacs@gnu.org; Wed, 21 Nov 2012 23:16:48 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TbODU-0001TJ-Fw for bug-gnu-emacs@gnu.org; Wed, 21 Nov 2012 23:16:46 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:49871) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TbODU-0001TD-CH for bug-gnu-emacs@gnu.org; Wed, 21 Nov 2012 23:16:44 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.72) (envelope-from ) id 1TbOEk-00018I-DW for bug-gnu-emacs@gnu.org; Wed, 21 Nov 2012 23:18:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Paul Eggert Original-Sender: debbugs-submit-bounces@debbugs.gnu.org Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 22 Nov 2012 04:18:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 12958 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.13535578714335 (code B ref -1); Thu, 22 Nov 2012 04:18:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 22 Nov 2012 04:17:51 +0000 Original-Received: from localhost ([127.0.0.1]:60122 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TbOEY-00017o-Ic for submit@debbugs.gnu.org; Wed, 21 Nov 2012 23:17:51 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:38611) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TbOEV-00017g-R1 for submit@debbugs.gnu.org; Wed, 21 Nov 2012 23:17:49 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TbODD-0001SO-Lw for submit@debbugs.gnu.org; Wed, 21 Nov 2012 23:16:29 -0500 Original-Received: from lists.gnu.org ([208.118.235.17]:39754) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TbODD-0001SK-Id for submit@debbugs.gnu.org; Wed, 21 Nov 2012 23:16:27 -0500 Original-Received: from eggs.gnu.org ([208.118.235.92]:35372) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TbODB-0007m9-HG for bug-gnu-emacs@gnu.org; Wed, 21 Nov 2012 23:16:27 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TbOD9-0001S8-9Z for bug-gnu-emacs@gnu.org; Wed, 21 Nov 2012 23:16:25 -0500 Original-Received: from smtp.cs.ucla.edu ([131.179.128.62]:43133) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TbOD8-0001S2-SW for bug-gnu-emacs@gnu.org; Wed, 21 Nov 2012 23:16:23 -0500 Original-Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id 2F24039E8100 for ; Wed, 21 Nov 2012 20:16:22 -0800 (PST) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu Original-Received: from smtp.cs.ucla.edu ([127.0.0.1]) by localhost (smtp.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id IvRZouKaR1Lf for ; Wed, 21 Nov 2012 20:16:20 -0800 (PST) Original-Received: from [192.168.1.3] (pool-71-189-154-249.lsanca.fios.verizon.net [71.189.154.249]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 9B4F1A60008 for ; Wed, 21 Nov 2012 20:16:20 -0800 (PST) User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:67303 Archived-At: 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 + + 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 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 + + 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 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 ]], [[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 + + 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 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 @@ /* - -- definitions for 4.2BSD-compatible directory access - - last edit: 09-Jul-1983 D A Gwyn + -- 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 + + 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 ; no longer needed. + * w32.c: Include rather than "ndir.h". + 2012-11-22 Eli Zaretskii * 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 #include -/* 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 - 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 -#define DIRENTRY struct dirent - -#else /* not HAVE_DIRENT_H */ - -#include -#include - -#define DIRENTRY struct direct - -extern DIR *opendir (char *); -extern struct direct *readdir (DIR *); - -#endif /* HAVE_DIRENT_H */ - #include #include -#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 - -#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 #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