[#27711] Re: [ruby-list:41557] Re: Windowsにおける共有フォルダーでのDir.globは一覧を返さない? — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

16 messages 2005/11/15
[#27717] Re: [ruby-list:41557] Re:Windowsにおける共有フォルダーでのDir.globは一覧を返さない? — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/11/16

山本です。

[#27718] Re: [ruby-list:41557] Re:Windowsにおける共有フォルダーでのDir.globは一覧を返さない? — "U.Nakamura" <usa@...> 2005/11/16

こんにちは、なかむら(う)です。

[#27719] Re: [ruby-list:41557] Re:Windowsにおける共有フォルダーでのDir.globは一覧を返さない? — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/11/16

山本です。

[#27720] Re: [ruby-list:41557] Re:Windowsにおける共有フォルダーでのDir.globは一覧を返さない? — "U.Nakamura" <usa@...> 2005/11/16

こんにちは、なかむら(う)です。

[#27721] Re: [ruby-list:41557] Re:Windowsにおける共有フォルダーでのDir.globは一覧を返さない? — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/11/16

山本です。

[#27722] Re: [ruby-list:41557] Re:Windowsにおける共有フォルダーでのDir.globは一覧を返さない? — "U.Nakamura" <usa@...> 2005/11/16

こんにちは、なかむら(う)です。

[#27723] Re: [ruby-list:41557] Re:Windowsにおける共有フォルダーでのDir.globは一覧を返さない? — 小西 弘将 <konishih@...6.so-net.ne.jp> 2005/11/16

 小西 弘将です。

[#27735] FNM_CASEFOLD on case-sensitive system — nobuyoshi nakada <nobuyoshi.nakada@...>

なかだです。

15 messages 2005/11/18
[#27737] Re: FNM_CASEFOLD on case-sensitive system — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/11/18

山本です。

[#27758] File.dirname("///foo/bar/baz/qux") on cygwin — Tanaka Akira <akr@...17n.org>

次に cygwin における

26 messages 2005/11/19
[#27768] Re: File.dirname("///foo/bar/baz/qux") on cygwin — "U.Nakamura" <usa@...> 2005/11/21

こんにちは、なかむら(う)です。

[#27769] Re: File.dirname("///foo/bar/baz/qux") on cygwin — Tanaka Akira <akr@...17n.org> 2005/11/21

In article <20051121093604.3A67.USA@garbagecollect.jp>,

[#27770] Re: File.dirname("///foo/bar/baz/qux") on cygwin — "U.Nakamura" <usa@...> 2005/11/21

こんにちは、なかむら(う)です。

[#27771] Re: File.dirname("///foo/bar/baz/qux") on cygwin — WATANABE Hirofumi <eban@...> 2005/11/21

わたなべです。

[#27772] Re: File.dirname("///foo/bar/baz/qux") on cygwin — Tanaka Akira <akr@...17n.org> 2005/11/21

In article <1191-Mon21Nov2005112905+0900-eban@os.rim.or.jp>,

[#27773] Re: File.dirname("///foo/bar/baz/qux") on cygwin — "U.Nakamura" <usa@...> 2005/11/21

こんにちは、なかむら(う)です。

[#27774] Re: File.dirname("///foo/bar/baz/qux") on cygwin — Tanaka Akira <akr@...17n.org> 2005/11/21

In article <20051121120453.3A70.USA@garbagecollect.jp>,

[#27776] Re: File.dirname("///foo/bar/baz/qux") on cygwin — Tanaka Akira <akr@...17n.org> 2005/11/21

In article <87ek5a665s.fsf@m17n.org>,

[#27777] Re: File.dirname("///foo/bar/baz/qux") on cygwin — "U.Nakamura" <usa@...> 2005/11/21

こんにちは、なかむら(う)です。

[#27778] Re: File.dirname("///foo/bar/baz/qux") on cygwin — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/11/21

なかだです。

[#27779] Re: File.dirname("///foo/bar/baz/qux") on cygwin — "U.Nakamura" <usa@...> 2005/11/21

こんにちは、なかむら(う)です。

[#27781] Re: File.dirname("///foo/bar/baz/qux") on cygwin — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/11/21

なかだです。

[#27782] Re: File.dirname("///foo/bar/baz/qux") on cygwin — "U.Nakamura" <usa@...> 2005/11/21

こんにちは、なかむら(う)です。

[#27783] Re: File.dirname("///foo/bar/baz/qux") on cygwin — nobuyoshi nakada <nobuyoshi.nakada@...> 2005/11/21

なかだです。

[#27766] 1.8.4 preview2? — "URABE Shyouhei aka.mput" <root@...>

卜部です。間が空きましたが

17 messages 2005/11/20
[#27798] Re: 1.8.4 preview2? — Yukihiro Matsumoto <matz@...> 2005/11/21

まつもと ゆきひろです

[#27818] Re: [ ruby-Bugs-2872 ] TCPServer should not use SO_REUSEADDR in Cygwin port — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

山本です。

15 messages 2005/11/25
[#27819] Re: [ ruby-Bugs-2872 ] TCPServer should not use SO_REUSEADDR in Cygwin port — Yukihiro Matsumoto <matz@...> 2005/11/25

まつもと ゆきひろです

[#27821] Re: [ ruby-Bugs-2872 ] TCPServer should not use SO_REUSEADDR in Cygwin port — "U.Nakamura" <usa@...> 2005/11/25

こんにちは、なかむら(う)です。

[#27823] Re: [ ruby-Bugs-2872 ] TCPServer should not use SO_REUSEADDR in Cygwin port — "U.Nakamura" <usa@...> 2005/11/25

こんにちは、なかむら(う)です。

[#27839] ruby 1.8 dumps core — Tanaka Akira <akr@...17n.org>

最近、boron でやっている chkbuild で ruby-1.8 が test-all 中

32 messages 2005/11/28
[#27862] Re: ruby 1.8 dumps core — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/11/28

山本です。

[#27911] Re: ruby 1.8 dumps core — Tanaka Akira <akr@...17n.org> 2005/12/01

In article <20051130210645.7228E2B0.ocean@m2.ccsnet.ne.jp>,

[#28046] Re: ruby 1.8 dumps core — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/12/19

山本です。

[#28048] Re: ruby 1.8 dumps core — Tanaka Akira <akr@...17n.org> 2005/12/19

In article <20051219120911.F876DDD0.ocean@m2.ccsnet.ne.jp>,

[#28050] Re: ruby 1.8 dumps core — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/12/19

山本です。

[#28057] Re: ruby 1.8 dumps core — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp> 2005/12/19

山本です。

[#27871] Numeric と Complex — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

37 messages 2005/11/29
[#27872] Re: Numeric と Complex — keiju@... (石塚圭樹) 2005/11/29

けいじゅ@いしつかです.

[#27873] Re: Numeric と Complex — Yukihiro Matsumoto <matz@...> 2005/11/29

まつもと ゆきひろです

[#27875] Re: Numeric と Complex — keiju@... (石塚圭樹) 2005/11/29

けいじゅ@いしつかです.

[ruby-dev:27728] Re: [ruby-list:41557] Re:Windowsにおける共有フォルダーでのDir.globは一覧を返さない?

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2005-11-17 07:41:31 UTC
List: ruby-dev #27728
山本です。

>>とりあえずこんな感じでしょうか。
>
>とはいっても、Win9x 上でテストしたわけではないので・・・
>どなたか確認してくださるとうれしいです。
>
>Win2000でテストした結果ですが、win9x_stat でも
>
>  Dir.chdir("//server/hoge")
>
>  Dir.glob("*")
>
>が動くことは確認しました。

従来どおりというのは、「FindFirstFile を使う従来の方法」という意味ではなく、
現在の Ruby の実装という意味ではないかとようやく思い至りました。

その場合はは下のようになると思います。ただ、こうしてしまうと
struct stat の置き換えが困難になるのではないかという心配はあります。
(Win9x と WinNT の区別は #ifdef でしているのではないため)

Index: win32.c
===================================================================
RCS file: /src/ruby/win32/win32.c,v
retrieving revision 1.178
diff -u -w -b -p -r1.178 win32.c
--- win32.c	5 Nov 2005 04:43:46 -0000	1.178
+++ win32.c	17 Nov 2005 06:35:49 -0000
@@ -39,10 +39,11 @@
 #endif
 #define isdirsep(x) ((x) == '/' || (x) == '\\')
 
-#undef stat
 #undef fclose
 #undef close
 #undef setsockopt
+#undef fstat
+#undef stat
 
 #ifdef _M_IX86
 # define WIN95 1
@@ -3164,13 +3165,150 @@ isUNCRoot(const char *path)
     return 0;
 }
 
-#ifdef __BORLANDC__
-#undef fstat
-int
-rb_w32_fstat(int fd, struct stat *st)
+static time_t
+filetime_to_unixtime(const FILETIME *ft)
+{
+    FILETIME loc;
+    SYSTEMTIME st;
+    struct tm tm;
+    time_t t;
+
+    if (!FileTimeToLocalFileTime(ft, &loc)) {
+	return 0;
+    }
+    if (!FileTimeToSystemTime(&loc, &st)) {
+	return 0;
+    }
+    memset(&tm, 0, sizeof(tm));
+    tm.tm_year = st.wYear - 1900;
+    tm.tm_mon = st.wMonth - 1;
+    tm.tm_mday = st.wDay;
+    tm.tm_hour = st.wHour;
+    tm.tm_min = st.wMinute;
+    tm.tm_sec = st.wSecond;
+    t = mktime(&tm);
+    return t == -1 ? 0 : t;
+}
+
+static unsigned
+fileattr_to_unixmode(DWORD attr)
+{
+    unsigned mode = 0;
+
+    if (attr & FILE_ATTRIBUTE_READONLY) {
+	mode |= S_IREAD;
+    }
+    else {
+	mode |= S_IREAD | S_IWRITE | S_IWUSR;
+    }
+
+    if (attr & FILE_ATTRIBUTE_DIRECTORY) {
+	mode |= S_IFDIR | S_IEXEC;
+    }
+    else {
+	mode |= S_IFREG;
+    }
+
+    mode |= (mode & 0700) >> 3;
+    mode |= (mode & 0700) >> 6;
+
+    return mode;
+}
+
+#if !defined(S_IFIFO) && defined(_S_IFIFO)
+#define S_IFIFO _S_IFIFO
+#endif
+
+static int
+os_stat(HANDLE h, struct stat *st)
 {
     BY_HANDLE_FILE_INFORMATION info;
+
+    memset(st, 0, sizeof(struct stat));
+    st->st_nlink = 1;
+
+    switch (GetFileType(h)) {
+      case FILE_TYPE_DISK:
+        if (!GetFileInformationByHandle(h, &info)) {
+	    errno = map_errno(GetLastError());
+	    return -1;
+	}
+	st->st_nlink = info.nNumberOfLinks;
+	st->st_dev = st->st_rdev = info.dwVolumeSerialNumber;
+	st->st_mode  = fileattr_to_unixmode(info.dwFileAttributes);
+	st->st_atime = filetime_to_unixtime(&info.ftLastAccessTime);
+	st->st_mtime = filetime_to_unixtime(&info.ftLastWriteTime);
+	st->st_ctime = filetime_to_unixtime(&info.ftCreationTime);
+	st->st_size = info.nFileSizeLow; /* TODO: 64bit support */
+	break;
+      case FILE_TYPE_CHAR:
+	st->st_mode = S_IFCHR;
+	break;
+      case FILE_TYPE_PIPE:
+	st->st_mode = S_IFIFO;
+	break;
+    }
+    return 0;
+}
+
+static int
+winnt_fstat(int fd, struct stat *st)
+{
+    long h = _get_osfhandle(fd);
+
+    if (h < 0) {
+	errno = EBADF;
+	return -1;
+    }
+    return os_stat((HANDLE)h, st);
+}
+
+static int
+winnt_stat(const char *path, struct stat *st)
+{
+    HANDLE h;
+    int ret;
+
+    h = CreateFile(
+	path,
+	0,
+	0,
+	NULL,
+	OPEN_EXISTING,
+	FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_READONLY,
+	NULL
+    );
+    if (h == INVALID_HANDLE_VALUE) {
+	errno = map_errno(GetLastError());
+	return -1;
+    }
+    ret = os_stat(h, st);
+    CloseHandle(h);
+
+    if (ret == 0 && (st->st_mode & S_IFREG)) {
+	const char *end = path + strlen(path);
+	while (path < end) {
+	    end = CharPrev(path, end);
+	    if (*end == '.') {
+		if ((strcmpi(end, ".bat") == 0) ||
+		    (strcmpi(end, ".cmd") == 0) ||
+		    (strcmpi(end, ".com") == 0) ||
+		    (strcmpi(end, ".exe") == 0)) {
+		    st->st_mode |= S_IEXEC;
+		}
+		break;
+	    }
+	}
+     }
+     return ret;
+}
+
+static int
+win9x_fstat(int fd, struct stat *st)
+{
     int ret = fstat(fd, st);
+#ifdef __BORLANDC__
+    BY_HANDLE_FILE_INFORMATION info;
 
     if (ret) return ret;
     st->st_mode &= ~(S_IWGRP | S_IWOTH);
@@ -3178,9 +3316,25 @@ rb_w32_fstat(int fd, struct stat *st)
 	!(info.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) {
 	st->st_mode |= S_IWUSR;
     }
+#endif
     return ret;
 }
-#endif
+
+static int
+win9x_stat(const char *path, struct stat *st)
+{
+    int ret = stat(path, st);
+    if (ret == 0) {
+	st->st_mode &= ~(S_IWGRP | S_IWOTH);
+    }
+    return ret;
+}
+
+int
+rb_w32_fstat(int fd, struct stat *st)
+{
+    return (IsWinNT() ? winnt_fstat : win9x_fstat)(fd, st);
+}
 
 int
 rb_w32_stat(const char *path, struct stat *st)
@@ -3217,11 +3371,7 @@ rb_w32_stat(const char *path, struct sta
     } else if (*end == '\\' || (buf1 + 1 == end && *end == ':'))
 	strcat(buf1, ".");
 
-    ret = stat(buf1, st);
-    if (ret == 0) {
-	st->st_mode &= ~(S_IWGRP | S_IWOTH);
-    }
-    return ret;
+    return (IsWinNT() ? winnt_stat : win9x_stat)(buf1, st);
 }
 
 static long
Index: win32.h
===================================================================
RCS file: /src/ruby/win32/win32.h,v
retrieving revision 1.74
diff -u -w -b -p -r1.74 win32.h
--- win32.h	5 Nov 2005 04:43:46 -0000	1.74
+++ win32.h	17 Nov 2005 04:48:06 -0000
@@ -105,8 +105,6 @@ extern "C++" {
 #define write(h, b, l)		_write(h, b, l)
 #define _open			_sopen
 #define sopen			_sopen
-#undef fstat
-#define fstat(fd,st)		rb_w32_fstat(fd,st)
 #undef fopen
 #define fopen(p, m)		rb_w32_fopen(p, m)
 #undef fdopen
@@ -117,6 +115,8 @@ extern "C++" {
 
 #undef stat
 #define stat(path,st)		rb_w32_stat(path,st)
+#undef fstat
+#define fstat(fd,st)		rb_w32_fstat(fd,st)
 #undef execv
 #define execv(path,argv)	rb_w32_aspawn(P_OVERLAY,path,argv)
 #if !defined(__BORLANDC__) && !defined(_WIN32_WCE)
@@ -203,9 +203,9 @@ extern int rb_w32_mkdir(const char *, in
 extern int rb_w32_rmdir(const char *);
 extern int rb_w32_unlink(const char *);
 extern int rb_w32_stat(const char *, struct stat *);
+extern int rb_w32_fstat(int, struct stat *);
 
 #ifdef __BORLANDC__
-extern int rb_w32_fstat(int, struct stat *);
 extern FILE *rb_w32_fopen(const char *, const char *);
 extern FILE *rb_w32_fdopen(int, const char *);
 extern FILE *rb_w32_fsopen(const char *, const char *, int);



In This Thread