Tcl Source Code

View Ticket
Login
Ticket UUID: 32afa6e256555ebd6179b7227a15a923e1434ee6
Title: dirent64 check is incorrect in tcl.m4
Type: Bug Version: 8.5
Submitter: anonymous Created on: 2013-06-28 18:44:42
Subsystem: 53. Configure and Build Tools Assigned To: nobody
Priority: 5 Medium Severity: Severe
Status: Closed Last Modified: 2013-07-02 07:19:14
Resolution: Fixed Closed By: jan.nijtmans
    Closed on: 2013-07-02 07:19:14
Description:
This check, defined in tcl.m4 is incorrect:

	# Now check for auxiliary declarations
	AC_CACHE_CHECK([for struct dirent64], tcl_cv_struct_dirent64,[
	    AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/dirent.h>],[struct dirent64 p;],
		tcl_cv_struct_dirent64=yes,tcl_cv_struct_dirent64=no)])
	if test "x${tcl_cv_struct_dirent64}" = "xyes" ; then
	    AC_DEFINE(HAVE_STRUCT_DIRENT64, 1, [Is 'struct dirent64' in <sys/types.h>?])
	fi

The header file is incorrect, it should be:

#include <dirent.h>

From the readdir() man page:


READDIR(3)                 Linux Programmer's Manual                READDIR(3)

NAME
       readdir - read a directory

SYNOPSIS
       #include <sys/types.h>
       #include <dirent.h>

       struct dirent *readdir(DIR *dir);

DESCRIPTION ...

---------

This was discovered using  32-bit linux build, which had a failure with [glob *] used during package discovery in the init phase.  Basically, tclsh utterly failed to find any packages because readdir() failed.  Readdir() failed because it was using the 32-bit struct and readdir could not store the inode values in the dirent struct.

Ultimately traced back to the build configure not doing the right thing for a large filesystem aware OS.
User Comments: jan.nijtmans added on 2013-07-02 07:19:14:
Fixed in core-8-5-branch [f8d461fd57] and trunk [a3ae798ed1].