X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-workers-bounces using -f From: sandmann AT clio DOT rice DOT edu (Charles Sandmann) Message-Id: <10201100202.AA16147@clio.rice.edu> Subject: Re: LFN32 optimizations [was: Re: Proposed lstat.c patch for Win2000/XP device bit fix To: djgpp-workers AT delorie DOT com Date: Wed, 9 Jan 2002 20:02:37 -0600 (CST) Cc: ams AT ludd DOT luth DOT se In-Reply-To: <10201100031.AA16325@clio.rice.edu> from "Charles Sandmann" at Jan 09, 2002 06:31:43 PM X-Mailer: ELM [version 2.5 PL2] Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Reply-To: djgpp-workers AT delorie DOT com Errors-To: nobody AT delorie DOT com X-Mailing-List: djgpp-workers AT delorie DOT com X-Unsubscribes-To: listserv AT delorie DOT com Precedence: bulk Seemingly working example. I would suggest moving _is_ff_LFN() macro to dir.h and using it in access.c also. *** lstat.c_ Tue Dec 11 21:28:06 2001 --- lstat2.c Wed Jan 9 19:59:22 2002 *************** int __findfirst(const char *, struct ffb *** 128,133 **** --- 128,135 ---- int __findnext(struct ffblk *); #define ALL_FILES (FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC|FA_ARCH) + #define _is_ff_LFN(ff_blk) ( *(long *)(&(ff_blk.lfn_magic[0])) == \ + 'L'+('F'<<8)+('N'<<16)+('3'<<24) && *(short *)(&(ff_blk.lfn_magic[4])) == '2' ) /* Should we bother about executables at all? */ #define _STAT_EXECBIT (_STAT_EXEC_EXT | _STAT_EXEC_MAGIC) *************** stat_assist(const char *path, struct sta *** 600,605 **** --- 602,617 ---- if ( !(ff_blk.ff_attrib & 0x07) ) /* no R, H or S bits set */ statbuf->st_mode |= WRITE_ACCESS; + /* Windows 2000 and XP - devices don't set attributes correctly */ + if( _os_trueversion == 0x532 && + (_djstat_fail_bits & _STFAIL_TRUENAME) && !ff_blk.ff_fsize && + !ff_blk.ff_ftime && (ff_blk.ff_fdate == 33) && + !ff_blk.lfn_ctime && (ff_blk.lfn_cdate == 33) && + !ff_blk.lfn_atime && (ff_blk.lfn_adate == 33) && + _is_ff_LFN(ff_blk) && + /* strlen(ff_blk.ff_name) == 3 && */ ff_blk.ff_attrib == 0x20) + ff_blk.ff_attrib = 0x40; + /* Sometimes `_truename' doesn't return X:/FOO for character devices. However, FindFirst returns attribute 40h for them. */ if (ff_blk.ff_attrib == 0x40) *************** stat_assist(const char *path, struct sta *** 773,779 **** statbuf->st_atime = statbuf->st_mtime = statbuf->st_ctime = _file_time_stamp(dos_ftime); ! if ( ! strcmp(ff_blk.lfn_magic,"LFN32") ) { unsigned xtime; xtime = *(unsigned *)&ff_blk.lfn_ctime; --- 785,791 ---- statbuf->st_atime = statbuf->st_mtime = statbuf->st_ctime = _file_time_stamp(dos_ftime); ! if ( _is_ff_LFN(ff_blk) ) { unsigned xtime; xtime = *(unsigned *)&ff_blk.lfn_ctime;