X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-workers-bounces using -f Sender: rich AT phekda DOT freeserve DOT co DOT uk Message-ID: <3C08FA41.B9181F10@phekda.freeserve.co.uk> Date: Sat, 01 Dec 2001 15:41:53 +0000 From: Richard Dawe X-Mailer: Mozilla 4.77 [en] (X11; U; Linux 2.2.19 i586) X-Accept-Language: de,fr MIME-Version: 1.0 To: DJGPP workers Subject: st_blksize patch, revision 4 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Reply-To: djgpp-workers AT delorie DOT com Hello. Below is the latest revision of the st_blksize patch for *stat(). Here are the changes since the last revision: * Describe blksize_t and blkcnt_t in 'What's Changed' texinfo docs. * The block size for network drives is now defaulted to 4096. * The default block sizes are described (for floppies & network drives) in *stat() texinfo docs. * statfs() is now in libc/stubs.h. * Fixed a bug in lstat(), where the path was being passed to _get_cached_blksize() without having been _fixpath()'d. * *stat() now check that _get_cached_blksize() was successful, otherwise they pass on the error. * Removed _STAT_* definitions from xstat.c and _STFAIL_* from xstat.h, since they're both in sys/stat.h. OK to commit? Thanks, bye, Rich =] -- Richard Dawe http://www.phekda.freeserve.co.uk/richdawe/ Index: include/sys/types.h =================================================================== RCS file: /cvs/djgpp/djgpp/include/sys/types.h,v retrieving revision 1.6 diff -p -c -3 -r1.6 types.h *** include/sys/types.h 2000/12/05 14:05:53 1.6 --- include/sys/types.h 2001/12/01 15:28:28 *************** extern "C" { *** 13,19 **** #ifndef __STRICT_ANSI__ #include ! typedef int dev_t; typedef int ino_t; typedef int mode_t; --- 13,21 ---- #ifndef __STRICT_ANSI__ #include ! ! typedef int blkcnt_t; ! typedef int blksize_t; typedef int dev_t; typedef int ino_t; typedef int mode_t; Index: include/sys/stat.h =================================================================== RCS file: /cvs/djgpp/djgpp/include/sys/stat.h,v retrieving revision 1.4 diff -p -c -3 -r1.4 stat.h *** include/sys/stat.h 2000/12/05 14:05:53 1.4 --- include/sys/stat.h 2001/12/01 15:28:31 *************** struct stat { *** 49,57 **** time_t st_mtime; nlink_t st_nlink; off_t st_size; ! off_t st_blksize; uid_t st_uid; ! dev_t st_rdev; /* unused */ }; int chmod(const char *_path, mode_t _mode); --- 49,57 ---- time_t st_mtime; nlink_t st_nlink; off_t st_size; ! blksize_t st_blksize; uid_t st_uid; ! dev_t st_rdev; }; int chmod(const char *_path, mode_t _mode); Index: include/libc/fd_props.h =================================================================== RCS file: /cvs/djgpp/djgpp/include/libc/fd_props.h,v retrieving revision 1.6 diff -p -c -3 -r1.6 fd_props.h *** include/libc/fd_props.h 2001/06/06 21:09:50 1.6 --- include/libc/fd_props.h 2001/12/01 15:28:38 *************** extern "C" { *** 8,13 **** --- 8,15 ---- #ifndef __dj_ENFORCE_ANSI_FREESTANDING + #include + #ifndef __STRICT_ANSI__ #ifndef _POSIX_SOURCE *************** static __inline__ void __clear_fd_flags( *** 63,68 **** --- 65,75 ---- static __inline__ unsigned long __get_fd_flags(int _fd) { return __has_fd_properties(_fd) ? __fd_properties[_fd]->flags : 0; + } + + static __inline__ const char * __get_fd_name(int _fd) + { + return __has_fd_properties(_fd) ? __fd_properties[_fd]->filename : NULL; } #endif /* !_POSIX_SOURCE */ Index: src/libc/posix/sys/stat/fstat.c =================================================================== RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/fstat.c,v retrieving revision 1.7 diff -p -c -3 -r1.7 fstat.c *** src/libc/posix/sys/stat/fstat.c 2001/09/25 01:00:52 1.7 --- src/libc/posix/sys/stat/fstat.c 2001/12/01 15:28:47 *************** *** 106,111 **** --- 106,113 ---- #include #include #include + #include + #include #include #include *************** fstat_assist(int fhandle, struct stat *s *** 433,440 **** stat_buf->st_uid = getuid(); stat_buf->st_gid = getgid(); stat_buf->st_nlink = 1; #ifndef NO_ST_BLKSIZE ! stat_buf->st_blksize = _go32_info_block.size_of_transfer_buffer; #endif /* If SFT entry for our handle is required and available, we will use it. */ --- 435,460 ---- stat_buf->st_uid = getuid(); stat_buf->st_gid = getgid(); stat_buf->st_nlink = 1; + + /* Get the block size for the device associated with `fhandle'. */ #ifndef NO_ST_BLKSIZE ! if (__get_fd_name(fhandle)) ! { ! const char *filename; ! char fixed_filename[PATH_MAX + 1]; ! ! filename = __get_fd_name(fhandle); ! _fixpath(filename, fixed_filename); ! stat_buf->st_blksize = _get_cached_blksize(fixed_filename); ! if (stat_buf->st_blksize == -1) ! return -1; /* errno set by _get_cached_blksize() */ ! } ! else ! { ! /* Fall back on transfer buffer size, if we can't determine file name ! * (which gives the drive letter and then the drive's cluster size). */ ! stat_buf->st_blksize = _go32_info_block.size_of_transfer_buffer; ! } #endif /* If SFT entry for our handle is required and available, we will use it. */ *************** int main(int argc, char *argv[]) *** 936,941 **** --- 956,964 ---- _djstat_describe_lossage(stderr); } + if (!argc) + return EXIT_SUCCESS; + /* Now call fstat() for each command-line argument. */ while (++argv, --argc) { *************** int main(int argc, char *argv[]) *** 956,961 **** --- 979,986 ---- fprintf (stderr, "\t\t\tTimes: %lu %lu\n", (unsigned long)stat_buf.st_atime, (unsigned long)stat_buf.st_ctime); + fprintf(stderr, "\t\t\tBlock size: %d\n", + stat_buf.st_blksize); _djstat_describe_lossage(stderr); } else *************** int main(int argc, char *argv[]) *** 965,971 **** _djstat_describe_lossage(stderr); } } ! return 0; } #endif /* TEST */ --- 990,996 ---- _djstat_describe_lossage(stderr); } } ! return EXIT_SUCCESS; } #endif /* TEST */ Index: src/libc/posix/sys/stat/lstat.c =================================================================== RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/lstat.c,v retrieving revision 1.7 diff -p -c -3 -r1.7 lstat.c *** src/libc/posix/sys/stat/lstat.c 2001/10/17 05:08:39 1.7 --- src/libc/posix/sys/stat/lstat.c 2001/12/01 15:28:57 *************** stat_assist(const char *path, struct sta *** 444,452 **** statbuf->st_uid = getuid(); statbuf->st_gid = getgid(); statbuf->st_nlink = 1; - #ifndef NO_ST_BLKSIZE - statbuf->st_blksize = _go32_info_block.size_of_transfer_buffer; - #endif /* Make the path explicit. This makes the rest of our job much easier by getting rid of some constructs which, if present, --- 444,449 ---- *************** stat_assist(const char *path, struct sta *** 455,460 **** --- 452,464 ---- to make an illusion of having a ".." entry in root directories. */ _fixpath (path, pathname); + /* Get the block size for the device associated with `pathname'. */ + #ifndef NO_ST_BLKSIZE + statbuf->st_blksize = _get_cached_blksize(pathname); + if (statbuf->st_blksize == -1) + return -1; /* errno set by _get_cached_blksize() */ + #endif + /* Get the drive number. It is always explicit, since we called `_fixpath' on the original pathname. */ drv_no = toupper((unsigned char)pathname[0]) - 'A'; *************** lstat(const char *path, struct stat *sta *** 932,940 **** #ifdef TEST unsigned short _djstat_flags = 0; ! void main(int argc, char *argv[]) { struct stat stat_buf; --- 936,946 ---- #ifdef TEST + #include + unsigned short _djstat_flags = 0; ! int main(int argc, char *argv[]) { struct stat stat_buf; *************** main(int argc, char *argv[]) *** 943,949 **** if (argc < 2) { fprintf (stderr, "Usage: %s <_djstat_flags> \n", argv[0]); ! exit(0); } if (lstat(*argv, &stat_buf) != 0) --- 949,955 ---- if (argc < 2) { fprintf (stderr, "Usage: %s <_djstat_flags> \n", argv[0]); ! return (EXIT_FAILURE); } if (lstat(*argv, &stat_buf) != 0) *************** main(int argc, char *argv[]) *** 968,973 **** --- 974,981 ---- (long)stat_buf.st_size, (unsigned long)stat_buf.st_mtime, ctime(&stat_buf.st_mtime)); + fprintf(stderr, "\t\t\tBlock size: %d\n", + stat_buf.st_blksize); _djstat_describe_lossage(stderr); } else *************** main(int argc, char *argv[]) *** 980,986 **** ++argv; } ! exit (0); } #endif --- 988,994 ---- ++argv; } ! return (EXIT_SUCCESS); } #endif Index: src/libc/posix/sys/stat/xstat.c =================================================================== RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/xstat.c,v retrieving revision 1.3 diff -p -c -3 -r1.3 xstat.c *** src/libc/posix/sys/stat/xstat.c 2000/08/05 16:53:46 1.3 --- src/libc/posix/sys/stat/xstat.c 2001/12/01 15:29:03 *************** *** 13,24 **** --- 13,26 ---- * */ + #include #include #include #include #include #include #include + #include #include #include #include *************** static int xstat_count = -1; *** 40,51 **** This improvement was suggested by Charles Sandmann and DJ Delorie . */ ! #define _STAT_INODE 1 /* should we bother getting inode numbers? */ ! #define _STAT_EXEC_EXT 2 /* get execute bits from file extension? */ ! #define _STAT_EXEC_MAGIC 4 /* get execute bits from magic signature? */ ! #define _STAT_DIRSIZE 8 /* compute directory size? */ ! #define _STAT_ROOT_TIME 0x10 /* try to get root dir time stamp? */ ! #define _STAT_WRITEBIT 0x20 /* fstat() needs write bit? */ /* Should we bother about executables at all? */ #define _STAT_EXECBIT (_STAT_EXEC_EXT | _STAT_EXEC_MAGIC) --- 42,48 ---- This improvement was suggested by Charles Sandmann and DJ Delorie . */ ! /* Please see the header file sys/stat.h for the definitions of _STAT_*. */ /* Should we bother about executables at all? */ #define _STAT_EXECBIT (_STAT_EXEC_EXT | _STAT_EXEC_MAGIC) *************** _getftime(int fhandle, unsigned int *dos *** 116,121 **** --- 113,193 ---- *dos_ftime = ((unsigned int)regs.x.dx << 16) + (unsigned int)regs.x.cx; return 0; + } + + /* Cache the cluster size (aka block size) for each drive letter, so we can + * populate the st_blksize of struct stat easily. The cluster size is + * measured in bytes. + * + * ASSUMPTION: path has already been fixed by `_fixpath'. + */ + + /* Comment copied from DJGPP 2.03's src/libc/compat/mntent/mntent.c: + * + * There may be a maximum of 32 block devices. Novell Netware indeed + * allows for 32 disks (A-Z plus 6 more characters from '[' to '\'') + */ + static blksize_t cache_blksize[32]; + static int cache_blksize_count = -1; + + blksize_t + _get_cached_blksize (const char *path) + { + struct statfs sbuf; + int d; /* index into drive cache = drive_num - 1 */ + static int overmax_d = sizeof(cache_blksize) / sizeof(cache_blksize[0]); + + /* Force initialization in restarted programs (emacs). */ + if (cache_blksize_count != __bss_count) + { + cache_blksize_count = __bss_count; + memset(cache_blksize, 0, sizeof(cache_blksize)); + + /* Default floppy drives to 512B block size, to improve performance. */ + cache_blksize[0] = cache_blksize[1] = 512; + } + + /* Get the drive number. The fixed filename will begin with a lowercase + * letter or a symbol. The symbols for drives > 'z:' occur straight + * after 'Z' in ASCII. + */ + if ((path[0] >= 'a') && (path[0] <= 'z')) + d = path[0] - 'a'; + else + d = path[0] - 'A'; + + if ((d < 0) || (d >= overmax_d)) + { + errno = ENODEV; + return -1; + } + + if (!cache_blksize[d]) + { + if (_is_remote_drive(d + 1)) + { + /* Default remote drives to 4K block size, to improve performance. + * + * Also the size returned by statfs() may not be correct. Testing + * against files shared by Samba 2.0.10 on Linux kernel 2.2.19 + * returned a 32K block size, even though the ext2 filesystem + * holding the share share had a 4K block size. */ + cache_blksize[d] = 4096; + } + else + { + /* No entry => retrieve cluster size */ + if (statfs(path, &sbuf) != 0) + { + /* Failed, pass error through */ + return -1; + } + + cache_blksize[d] = sbuf.f_bsize; + } + } + + return cache_blksize[d]; } /* Invent an inode number for those files which don't have valid DOS Index: src/libc/posix/sys/stat/stat.c =================================================================== RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/stat.c,v retrieving revision 1.10 diff -p -c -3 -r1.10 stat.c *** src/libc/posix/sys/stat/stat.c 2000/08/22 18:45:07 1.10 --- src/libc/posix/sys/stat/stat.c 2001/12/01 15:29:09 *************** stat(const char *path, struct stat *stat *** 31,39 **** #ifdef TEST unsigned short _djstat_flags = 0; ! void main(int argc, char *argv[]) { struct stat stat_buf; --- 31,41 ---- #ifdef TEST + #include + unsigned short _djstat_flags = 0; ! int main(int argc, char *argv[]) { struct stat stat_buf; *************** main(int argc, char *argv[]) *** 42,48 **** if (argc < 2) { fprintf (stderr, "Usage: %s <_djstat_flags> \n", argv[0]); ! exit(0); } if (stat(*argv, &stat_buf) != 0) --- 44,50 ---- if (argc < 2) { fprintf (stderr, "Usage: %s <_djstat_flags> \n", argv[0]); ! return (EXIT_FAILURE); } if (stat(*argv, &stat_buf) != 0) *************** main(int argc, char *argv[]) *** 67,72 **** --- 69,76 ---- (long)stat_buf.st_size, (unsigned long)stat_buf.st_mtime, ctime(&stat_buf.st_mtime)); + fprintf(stderr, "\t\t\tBlock size: %d\n", + stat_buf.st_blksize); _djstat_describe_lossage(stderr); } else *************** main(int argc, char *argv[]) *** 79,85 **** ++argv; } ! exit (0); } #endif --- 83,89 ---- ++argv; } ! return (EXIT_SUCCESS); } #endif Index: src/libc/posix/sys/stat/xstat.h =================================================================== RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/xstat.h,v retrieving revision 1.4 diff -p -c -3 -r1.4 xstat.h *** src/libc/posix/sys/stat/xstat.h 2000/08/05 16:53:46 1.4 --- src/libc/posix/sys/stat/xstat.h 2001/12/01 15:29:14 *************** *** 38,61 **** extern unsigned short _osmajor, _osminor; extern const char * _os_flavor; - /* Bits to flag f?stat() failed to use individual undocumented features. */ - #define _STFAIL_SDA 1 /* Get SDA call failed */ - #define _STFAIL_OSVER 2 /* Unsupported DOS version */ - #define _STFAIL_BADSDA 4 /* Bad pointer to SDA */ - #define _STFAIL_TRUENAME 8 /* _truename() failed */ - #define _STFAIL_HASH 0x10 /* inode defaults to hashing */ - #define _STFAIL_LABEL 0x20 /* Root dir, but no volume label */ - #define _STFAIL_DCOUNT 0x40 /* dirent_count ridiculously large */ - #define _STFAIL_WRITEBIT 0x80 /* fstat() failed to get write access bit */ - #define _STFAIL_DEVNO 0x100 /* fstat() failed to get device number */ - #define _STFAIL_BADSFT 0x200 /* SFT entry found, but can't be trusted */ - #define _STFAIL_SFTIDX 0x400 /* bad SFT index in JFT */ - #define _STFAIL_SFTNF 0x800 /* file entry not found in SFT array */ - - extern unsigned short _djstat_fail_bits; - - extern unsigned short _djstat_flags; - extern time_t _file_time_stamp(unsigned int); extern ino_t _invent_inode(const char *, unsigned, unsigned long); extern unsigned short _get_magic(const char *, int); --- 38,43 ---- *************** extern long __filelength(int *** 68,72 **** --- 50,55 ---- extern int _is_remote_handle(int); extern void _djstat_describe_lossage(FILE *); extern int _getftime(int, unsigned int *); + extern blksize_t _get_cached_blksize (const char *path); #endif /* __XSTAT_H */ Index: src/libc/posix/sys/stat/lstat.txh =================================================================== RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/lstat.txh,v retrieving revision 1.3 diff -p -c -3 -r1.3 lstat.txh *** src/libc/posix/sys/stat/lstat.txh 2001/08/01 10:31:02 1.3 --- src/libc/posix/sys/stat/lstat.txh 2001/12/01 15:29:20 *************** it in @var{sbuf}, which has this structu *** 14,30 **** @smallexample struct stat @{ ! time_t st_atime; /* time of last access */ ! time_t st_ctime; /* time of file's creation */ ! dev_t st_dev; /* The drive number (0 = a:) */ ! gid_t st_gid; /* what getgid() returns */ ! ino_t st_ino; /* starting cluster or unique identifier */ ! mode_t st_mode; /* file mode - S_IF* and S_IRUSR/S_IWUSR */ ! time_t st_mtime; /* time that the file was last written */ ! nlink_t st_nlink; /* 2 + number of subdirs, or 1 for files */ ! off_t st_size; /* size of file in bytes */ ! off_t st_blksize; /* the size of transfer buffer */ ! uid_t st_uid; /* what getuid() returns */ @}; @end smallexample --- 14,31 ---- @smallexample struct stat @{ ! time_t st_atime; /* time of last access */ ! time_t st_ctime; /* time of file's creation */ ! dev_t st_dev; /* The drive number (0 = a:) */ ! gid_t st_gid; /* what getgid() returns */ ! ino_t st_ino; /* starting cluster or unique identifier */ ! mode_t st_mode; /* file mode - S_IF* and S_IRUSR/S_IWUSR */ ! time_t st_mtime; /* time that the file was last written */ ! nlink_t st_nlink; /* 2 + number of subdirs, or 1 for files */ ! off_t st_size; /* size of file in bytes */ ! blksize_t st_blksize; /* block size in bytes*/ ! uid_t st_uid; /* what getuid() returns */ ! dev_t st_rdev; /* The drive number (0 = a:) */ @}; @end smallexample *************** The @code{st_size} member is an signed 3 *** 47,52 **** --- 48,57 ---- overflow on FAT32 volumes for files that are larger than 2GB. Therefore, if your program needs to support large files, you should treat the value of @code{st_size} as an unsigned value. + + For some drives @code{st_blksize} has a default value, to improve + performance. The floppy drives A: and B: default to a block size + of 512 bytes. Network drives default to a block size of 4096 bytes. Some members of @code{struct stat} are very expensive to compute. If your application is a heavy user of @code{lstat} and is too slow, you can Index: src/libc/posix/sys/stat/stat.txh =================================================================== RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/stat.txh,v retrieving revision 1.8 diff -p -c -3 -r1.8 stat.txh *** src/libc/posix/sys/stat/stat.txh 2001/08/01 10:31:02 1.8 --- src/libc/posix/sys/stat/stat.txh 2001/12/01 15:29:27 *************** it in @var{sbuf}, which has this structu *** 14,30 **** @smallexample struct stat @{ ! time_t st_atime; /* time of last access */ ! time_t st_ctime; /* time of file's creation */ ! dev_t st_dev; /* The drive number (0 = a:) */ ! gid_t st_gid; /* what getgid() returns */ ! ino_t st_ino; /* starting cluster or unique identifier */ ! mode_t st_mode; /* file mode - S_IF* and S_IRUSR/S_IWUSR */ ! time_t st_mtime; /* time that the file was last written */ ! nlink_t st_nlink; /* 2 + number of subdirs, or 1 for files */ ! off_t st_size; /* size of file in bytes */ ! off_t st_blksize; /* the size of transfer buffer */ ! uid_t st_uid; /* what getuid() returns */ @}; @end smallexample --- 14,31 ---- @smallexample struct stat @{ ! time_t st_atime; /* time of last access */ ! time_t st_ctime; /* time of file's creation */ ! dev_t st_dev; /* The drive number (0 = a:) */ ! gid_t st_gid; /* what getgid() returns */ ! ino_t st_ino; /* starting cluster or unique identifier */ ! mode_t st_mode; /* file mode - S_IF* and S_IRUSR/S_IWUSR */ ! time_t st_mtime; /* time that the file was last written */ ! nlink_t st_nlink; /* 2 + number of subdirs, or 1 for files */ ! off_t st_size; /* size of file in bytes */ ! blksize_t st_blksize; /* block size in bytes*/ ! uid_t st_uid; /* what getuid() returns */ ! dev_t st_rdev; /* The drive number (0 = a:) */ @}; @end smallexample *************** The @code{st_size} member is an signed 3 *** 47,52 **** --- 48,57 ---- overflow on FAT32 volumes for files that are larger than 2GB. Therefore, if your program needs to support large files, you should treat the value of @code{st_size} as an unsigned value. + + For some drives @code{st_blksize} has a default value, to improve + performance. The floppy drives A: and B: default to a block size + of 512 bytes. Network drives default to a block size of 4096 bytes. Some members of @code{struct stat} are very expensive to compute. If your application is a heavy user of @code{stat} and is too slow, you can Index: src/libc/posix/sys/stat/fstat.txh =================================================================== RCS file: /cvs/djgpp/djgpp/src/libc/posix/sys/stat/fstat.txh,v retrieving revision 1.8 diff -p -c -3 -r1.8 fstat.txh *** src/libc/posix/sys/stat/fstat.txh 2001/08/04 14:00:12 1.8 --- src/libc/posix/sys/stat/fstat.txh 2001/12/01 15:29:33 *************** overflow on FAT32 volumes for files that *** 18,23 **** --- 18,27 ---- Therefore, if your program needs to support large files, you should treat the value of @code{st_size} as an unsigned value. + For some drives @code{st_blksize} has a default value, to improve + performance. The floppy drives A: and B: default to a block size + of 512 bytes. Network drives default to a block size of 4096 bytes. + Some members of @code{struct stat} are very expensive to compute. If your application is a heavy user of @code{fstat} and is too slow, you can disable computation of the members your application doesn't need, as Index: src/docs/kb/develop.txi =================================================================== RCS file: /cvs/djgpp/djgpp/src/docs/kb/develop.txi,v retrieving revision 1.6 diff -p -c -3 -r1.6 develop.txi *** src/docs/kb/develop.txi 2001/11/02 18:48:50 1.6 --- src/docs/kb/develop.txi 2001/12/01 15:29:39 *************** functions, it should include @file{libc/ *** 77,82 **** --- 77,89 ---- @sc{gs} register instead of @sc{fs}, to avoid clobbering @sc{fs} which might be used by the application. + @subsection Filename manipulation + + When manipulating filenames, don't use the ctype functions from + @file{ctype.h}, because they are locale sensitive. For example, + instead of using @code{tolower} (@pxref{tolower, , tolower, libc}), + convert the case with explicit code. + @subsection Assertions @cindex Assertions Index: src/docs/kb/wc204.txi =================================================================== RCS file: /cvs/djgpp/djgpp/src/docs/kb/wc204.txi,v retrieving revision 1.100 diff -p -c -3 -r1.100 wc204.txi *** src/docs/kb/wc204.txi 2001/10/17 05:19:49 1.100 --- src/docs/kb/wc204.txi 2001/12/01 15:29:48 *************** case lowering. This replaces the functi *** 675,677 **** --- 675,691 ---- which is hopelessly buggy on Windows 2000 and XP. New function used in @file{srchpath.c}, @file{readdir.c}, @file{glob.c}, @file{fixpath.c}, @file{lstat.c} and @file{getcwd.c}. + + @findex stat AT r{, and block size} + @findex lstat AT r{, and block size} + @findex fstat AT r{, and block size} + The functions @code{stat}, @code{lstat} and @code{fstat} now fill + the @code{st_blksize} member of @code{struct stat} with the correct block + size for the device where the file is located. + + @tindex blksize_t + @tindex blkcnt_t + @tindex struct stat AT r{, and }blksize_t + The types @code{blksize_t} and @code{blkcnt_t} were added. + @code{blksize_t} is now used for the @code{st_blksize} member of + @code{struct stat}. Index: include/libc/stubs.h =================================================================== RCS file: /cvs/djgpp/djgpp/include/libc/stubs.h,v retrieving revision 1.9 diff -p -c -3 -r1.9 stubs.h *** include/libc/stubs.h 2001/06/19 19:10:15 1.9 --- include/libc/stubs.h 2001/12/01 15:29:53 *************** extern "C" { *** 60,65 **** --- 60,66 ---- #define setmode __setmode #define spawnve __spawnve #define spawnvpe __spawnvpe + #define statfs __statfs #define stricmp __stricmp #define sync __sync