# New Ticket Created by Ron Blaschke
# Please include the string: [perl #43438]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=43438 >
Attached patch steal the basic layout from
F<config/gen/platform/generic/stat.c> and makes the
F<t/pmc/io.t> "stat failed" test work.
Changed Files:
config/gen/platform/win32/stat.c
t/pmc/io.t
Tested on:
Visual C++ 8.0
$ runtests t\pmc\io.t
t\pmc\io......ok
All tests successful.
Test Summary Report
-------------------
t\pmc\io.t (Wstat: 0 Tests: 45 Failed: 0)
Tests skipped: 8
Files=1, Tests=45, 3 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU)
Visual C++ 7.1
$ runtests t\pmc\io.t
t\pmc\io......ok
All tests successful.
Test Summary Report
-------------------
t\pmc\io.t (Wstat: 0 Tests: 45 Failed: 0)
Tests skipped: 8
Files=1, Tests=45, 3 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU)
MinGW GCC 3.4.2
$ runtests t\pmc\io.t
t\pmc\io......ok
All tests successful.
Test Summary Report
-------------------
t\pmc\io.t (Wstat: 0 Tests: 45 Failed: 0)
Tests skipped: 8
Files=1, Tests=45, 6 wallclock secs ( 0.00 cusr + 0.00 csys = 0.00 CPU)
Ron
Index: config/gen/platform/win32/stat.c
===================================================================
--- config/gen/platform/win32/stat.c (revision 19421)
+++ config/gen/platform/win32/stat.c (working copy)
@@ -2,173 +2,145 @@
* File stat stuff
*/
+static INTVAL
+stat_common(Interp *interpreter, struct _stat *statbuf,
+ INTVAL thing, int status)
+{
+ INTVAL result;
+
+ if (thing == STAT_EXISTS)
+ return status == 0;
+ if (status == -1) {
+ const char *err = strerror(errno);
+ real_exception(interpreter, NULL, E_IOError,
+ "stat failed: %s", err);
+ }
+
+ switch (thing) {
+ case STAT_FILESIZE:
+ result = statbuf->st_size;
+ break;
+
+ case STAT_ISDIR:
+ result = S_ISDIR(statbuf->st_mode);
+ break;
+
+ case STAT_ISDEV:
+ result = S_ISCHR(statbuf->st_mode) || S_ISBLK(statbuf->st_mode);
+ break;
+
+ case STAT_CREATETIME:
+ result = -1;
+ break;
+
+ case STAT_ACCESSTIME:
+ result = statbuf->st_atime;
+ break;
+
+ case STAT_MODIFYTIME:
+ result = statbuf->st_mtime;
+ break;
+
+ case STAT_CHANGETIME:
+ result = statbuf->st_ctime;
+ break;
+
+ case STAT_BACKUPTIME:
+ result = -1;
+ break;
+
+ case STAT_UID:
+ result = statbuf->st_uid;
+ break;
+
+ case STAT_GID:
+ result = statbuf->st_gid;
+ break;
+
+ case STAT_PLATFORM_DEV:
+ result = statbuf->st_dev;
+ break;
+
+ case STAT_PLATFORM_INODE:
+ result = statbuf->st_ino;
+ break;
+
+ case STAT_PLATFORM_MODE:
+ result = statbuf->st_mode;
+ break;
+
+ case STAT_PLATFORM_NLINKS:
+ result = statbuf->st_nlink;
+ break;
+
+ case STAT_PLATFORM_DEVTYPE:
+ result = statbuf->st_rdev;
+ break;
+
+ case STAT_PLATFORM_BLOCKSIZE:
+ internal_exception(1, "STAT_PLATFORM_BLOCKSIZE not supported");
+ break;
+
+ case STAT_PLATFORM_BLOCKS:
+ internal_exception(1, "STAT_PLATFORM_BLOCKS not supported");
+ break;
+
+ default:
+ result = -1;
+ }
+
+ return result;
+}
+
PMC *
Parrot_stat_file(Parrot_Interp interpreter, STRING *filename)
{
- return NULL;
+ return NULL;
}
PMC *
Parrot_stat_info_pmc(Parrot_Interp interpreter, STRING *filename, INTVAL thing)
{
- return NULL;
+ return NULL;
}
INTVAL
Parrot_stat_info_intval(Parrot_Interp interpreter, STRING *file, INTVAL thing)
{
- struct stat statbuf;
- char *filename;
- INTVAL result = -1;
- int status;
+ struct _stat statbuf;
+ char *filename;
+ int status;
- /* Get the name of the file as something we can use */
- filename = string_to_cstring(interpreter, file);
+ /* Get the name of the file as something we can use */
+ filename = string_to_cstring(interpreter, file);
- /* Everything needs the result of stat, so just go do it */
- status = stat(filename, &statbuf);
-
- switch (thing) {
- case STAT_EXISTS:
- result = (status == 0);
- break;
- case STAT_FILESIZE:
- result = statbuf.st_size;
- break;
- case STAT_ISDIR:
- result = S_ISDIR(statbuf.st_mode);
- break;
- case STAT_ISDEV:
- result = S_ISCHR(statbuf.st_mode) || S_ISBLK(statbuf.st_mode);
- break;
- case STAT_CREATETIME:
- result = -1;
- break;
- case STAT_ACCESSTIME:
- result = statbuf.st_atime;
- break;
- case STAT_MODIFYTIME:
- result = statbuf.st_mtime;
- break;
- case STAT_CHANGETIME:
- result = statbuf.st_ctime;
- break;
- case STAT_BACKUPTIME:
- result = -1;
- break;
- case STAT_UID:
- result = statbuf.st_uid;
- break;
- case STAT_GID:
- result = statbuf.st_gid;
- break;
- case STAT_PLATFORM_DEV:
- result = statbuf.st_dev;
- break;
- case STAT_PLATFORM_INODE:
- result = statbuf.st_ino;
- break;
- case STAT_PLATFORM_MODE:
- result = statbuf.st_mode;
- break;
- case STAT_PLATFORM_NLINKS:
- result = statbuf.st_nlink;
- break;
- case STAT_PLATFORM_DEVTYPE:
- result = statbuf.st_rdev;
- break;
- case STAT_PLATFORM_BLOCKSIZE:
- internal_exception(1, "STAT_PLATFORM_BLOCKSIZE not supported");
- break;
- case STAT_PLATFORM_BLOCKS:
- internal_exception(1, "STAT_PLATFORM_BLOCKS not supported");
- break;
- }
-
- string_cstring_free(filename);
- return result;
+ /* Everything needs the result of stat, so just go do it */
+ status = _stat(filename, &statbuf);
+ string_cstring_free(filename);
+ return stat_common(interpreter, &statbuf, thing, status);
}
INTVAL
Parrot_fstat_info_intval(Parrot_Interp interpreter, INTVAL file, INTVAL thing)
{
- struct stat statbuf;
- INTVAL result = -1;
- int status;
+ struct _stat statbuf;
+ int status;
- /* Everything needs the result of stat, so just go do it */
- status = fstat(file, &statbuf);
-
- switch (thing) {
- case STAT_EXISTS:
- result = (status == 0);
- break;
- case STAT_FILESIZE:
- result = statbuf.st_size;
- break;
- case STAT_ISDIR:
- result = S_ISDIR(statbuf.st_mode);
- break;
- case STAT_ISDEV:
- result = S_ISCHR(statbuf.st_mode) || S_ISBLK(statbuf.st_mode);
- break;
- case STAT_CREATETIME:
- result = -1;
- break;
- case STAT_ACCESSTIME:
- result = statbuf.st_atime;
- break;
- case STAT_MODIFYTIME:
- result = statbuf.st_mtime;
- break;
- case STAT_CHANGETIME:
- result = statbuf.st_ctime;
- break;
- case STAT_BACKUPTIME:
- result = -1;
- break;
- case STAT_UID:
- result = statbuf.st_uid;
- break;
- case STAT_GID:
- result = statbuf.st_gid;
- break;
- case STAT_PLATFORM_DEV:
- result = statbuf.st_dev;
- break;
- case STAT_PLATFORM_INODE:
- result = statbuf.st_ino;
- break;
- case STAT_PLATFORM_MODE:
- result = statbuf.st_mode;
- break;
- case STAT_PLATFORM_NLINKS:
- result = statbuf.st_nlink;
- break;
- case STAT_PLATFORM_DEVTYPE:
- result = statbuf.st_rdev;
- break;
- case STAT_PLATFORM_BLOCKSIZE:
- internal_exception(1, "STAT_PLATFORM_BLOCKSIZE not supported");
- break;
- case STAT_PLATFORM_BLOCKS:
- internal_exception(1, "STAT_PLATFORM_BLOCKS not supported");
- break;
- }
-
- return result;
+ /* Everything needs the result of stat, so just go do it */
+ status = _fstat(file, &statbuf);
+ return stat_common(interpreter, &statbuf, thing, status);
}
FLOATVAL
Parrot_stat_info_floatval(Parrot_Interp interpreter, STRING *filename, INTVAL
thing)
{
- return -1;
+ return -1;
}
STRING *
Parrot_stat_info_string(Parrot_Interp interpreter, STRING *filename, INTVAL
thing)
{
- return NULL;
+ return NULL;
}
/*
Index: t/pmc/io.t
===================================================================
--- t/pmc/io.t (revision 19421)
+++ t/pmc/io.t (working copy)
@@ -900,10 +900,7 @@
OUTPUT
unlink("temp.file");
-SKIP: {
- skip 'broken on windows', 1 if $^O eq 'MSWin32';
-
- pir_error_output_like( <<'CODE', <<"OUTPUT", "stat failed" );
+pir_error_output_like( <<'CODE', <<"OUTPUT", "stat failed" );
.sub main :main
.local pmc pio
.local int len
@@ -916,7 +913,6 @@
CODE
/stat failed:/
OUTPUT
-}
# Local Variables:
# mode: cperl