From 341ce31507ef62dad7092b8dfbc87868e403e6d8 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 3 Feb 2006 20:46:27 +0000 Subject: [PATCH] fix file-size for Windows UNC or //?/ paths svn: r2111 --- src/mzscheme/src/file.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/mzscheme/src/file.c b/src/mzscheme/src/file.c index 6b60082dbf..bb7b81220d 100644 --- a/src/mzscheme/src/file.c +++ b/src/mzscheme/src/file.c @@ -1657,11 +1657,12 @@ static time_t convert_date(const FILETIME *ft) # define MZ_UNC_WRITE 0x2 # define MZ_UNC_EXEC 0x4 -static int UNC_stat(char *dirname, int len, int *flags, int *isdir, Scheme_Object **date) +static int UNC_stat(char *dirname, int len, int *flags, int *isdir, Scheme_Object **date, + mzlonglong *filesize) /* dirname must be absolute */ { int strip_end, strip_char; - struct MSC_IZE(stat) buf; + struct MSC_IZE(_stat64) buf; int v; if (isdir) @@ -1712,6 +1713,9 @@ static int UNC_stat(char *dirname, int len, int *flags, int *isdir, Scheme_Objec if (isdir) { *isdir = (GET_FF_ATTRIBS(fd) & FF_A_DIR); } + if (filesize) { + *filesize = ((mzlonglong)fd.nFileSizeHigh << 32) | fd.nFileSizeLow; + } return 1; } } else if ((len > 1) && (dirname[len - 1] == '\\' || dirname[len - 1] == '/') @@ -1725,7 +1729,7 @@ static int UNC_stat(char *dirname, int len, int *flags, int *isdir, Scheme_Objec strip_end = strip_char = 0; while (1) { - v = !MSC_W_IZE(stat)(MSC_WIDE_PATH(dirname), &buf); + v = !MSC_W_IZE(stat64)(MSC_WIDE_PATH(dirname), &buf); if (v || (errno != EINTR)) break; } @@ -1744,6 +1748,8 @@ static int UNC_stat(char *dirname, int len, int *flags, int *isdir, Scheme_Objec if (buf.st_mode & MSC_IZE(S_IWRITE)) *flags |= MZ_UNC_WRITE; } + if (filesize) + *filesize = buf.st_size; } if (strip_end) @@ -1772,7 +1778,7 @@ int scheme_file_exists(char *filename) { int isdir; - return (UNC_stat(filename, strlen(filename), NULL, &isdir, NULL) + return (UNC_stat(filename, strlen(filename), NULL, &isdir, NULL, NULL) && !isdir); } # else @@ -1796,7 +1802,7 @@ int scheme_directory_exists(char *dirname) # ifdef DOS_FILE_SYSTEM int isdir; - return (UNC_stat(dirname, strlen(dirname), NULL, &isdir, NULL) + return (UNC_stat(dirname, strlen(dirname), NULL, &isdir, NULL, NULL) && isdir); # else struct MSC_IZE(stat) buf; @@ -4035,7 +4041,7 @@ static Scheme_Object *file_modify_seconds(int argc, Scheme_Object **argv) int len = strlen(file); Scheme_Object *secs; - if (UNC_stat(file, len, NULL, NULL, &secs)) + if (UNC_stat(file, len, NULL, NULL, &secs, NULL)) return secs; } else # endif @@ -4232,7 +4238,7 @@ static Scheme_Object *file_or_dir_permissions(int argc, Scheme_Object *argv[]) int len = strlen(filename); int flags; - if (UNC_stat(filename, len, &flags, NULL, NULL)) { + if (UNC_stat(filename, len, &flags, NULL, NULL, NULL)) { if (flags & MZ_UNC_READ) l = scheme_make_pair(read_symbol, l); if (flags & MZ_UNC_WRITE) @@ -4266,6 +4272,15 @@ static Scheme_Object *file_size(int argc, Scheme_Object *argv[]) "file-size", NULL, SCHEME_GUARD_FILE_READ); + +#ifdef DOS_FILE_SYSTEM + { + mzlonglong filesize; + if (UNC_stat(filename, strlen(filename), NULL, NULL, NULL, &filesize)) { + return scheme_make_integer_value_from_long_long(filesize); + } + } +#else { struct MSC_IZE(stat) buf; @@ -4284,7 +4299,9 @@ static Scheme_Object *file_size(int argc, Scheme_Object *argv[]) return scheme_make_integer_value_from_unsigned(len); -failed: + failed: +#endif + scheme_raise_exn(MZEXN_FAIL_FILESYSTEM, "file-size: file not found: \"%q\"", filename_for_error(argv[0]));