[前][次][番号順一覧][スレッド一覧]

ruby-changes:9923

From: yugui <ko1@a...>
Date: Mon, 12 Jan 2009 22:33:39 +0900 (JST)
Subject: [ruby-changes:9923] Ruby:r21464 (ruby_1_9_1): merges r21447 from trunk into ruby_1_9_1.

yugui	2009-01-12 22:33:08 +0900 (Mon, 12 Jan 2009)

  New Revision: 21464

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21464

  Log:
    merges r21447 from trunk into ruby_1_9_1.
    * win32/win32.c (open_dir_handle): extracted from rb_w32_opendir.
    * win32/win32.c (winnt_stat): gets rid of strange behavior of
      GetFileAttributes().  [ruby-core:21269]

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/test/ruby/test_file_exhaustive.rb
    branches/ruby_1_9_1/win32/win32.c

Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 21463)
+++ ruby_1_9_1/ChangeLog	(revision 21464)
@@ -1,3 +1,10 @@
+Mon Jan 12 16:45:28 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* win32/win32.c (open_dir_handle): extracted from rb_w32_opendir.
+
+	* win32/win32.c (winnt_stat): gets rid of strange behavior of
+	  GetFileAttributes().  [ruby-core:21269]
+
 Mon Jan 12 11:59:19 2009  Koichi Sasada  <ko1@a...>
 
 	* gc.c (ruby_xmalloc, ruby_xrealloc, ruby_xfree):
Index: ruby_1_9_1/win32/win32.c
===================================================================
--- ruby_1_9_1/win32/win32.c	(revision 21463)
+++ ruby_1_9_1/win32/win32.c	(revision 21464)
@@ -1412,13 +1412,44 @@
 #define BitOfIsRep(n) ((n) * 2 + 1)
 #define DIRENT_PER_CHAR (CHAR_BIT / 2)
 
+static HANDLE
+open_dir_handle(const char *filename, WIN32_FIND_DATA *fd)
+{
+    HANDLE fh;
+    static const char wildcard[] = "/*";
+    long len = strlen(filename);
+    char *scanname = malloc(len + sizeof(wildcard));
+
+    //
+    // Create the search pattern
+    //
+    if (!scanname) {
+	return INVALID_HANDLE_VALUE;
+    }
+    memcpy(scanname, filename, len + 1);
+
+    if (index("/\\:", *CharPrev(scanname, scanname + len)) == NULL)
+	memcpy(scanname + len, wildcard, sizeof(wildcard));
+    else
+	memcpy(scanname + len, wildcard + 1, sizeof(wildcard) - 1);
+
+    //
+    // do the FindFirstFile call
+    //
+    fh = FindFirstFile(scanname, fd);
+    free(scanname);
+    if (fh == INVALID_HANDLE_VALUE) {
+	errno = map_errno(GetLastError());
+    }
+    return fh;
+}
+
 DIR *
 rb_w32_opendir(const char *filename)
 {
     DIR               *p;
     long               len;
     long               idx;
-    char	      *scanname;
     char	      *tmp;
     struct stati64     sbuf;
     WIN32_FIND_DATA fd;
@@ -1436,6 +1467,11 @@
 	return NULL;
     }
 
+    fh = open_dir_handle(filename, &fd);
+    if (fh == INVALID_HANDLE_VALUE) {
+	return NULL;
+    }
+
     //
     // Get us a DIR structure
     //
@@ -1443,32 +1479,6 @@
     if (p == NULL)
 	return NULL;
 
-    //
-    // Create the search pattern
-    //
-    len = strlen(filename) + 2 + 1;
-    if (!(scanname = malloc(len))) {
-	free(p);
-	return NULL;
-    }
-    strlcpy(scanname, filename, len);
-
-    if (index("/\\:", *CharPrev(scanname, scanname + strlen(scanname))) == NULL)
-	strlcat(scanname, "/*", len);
-    else
-	strlcat(scanname, "*", len);
-
-    //
-    // do the FindFirstFile call
-    //
-    fh = FindFirstFile(scanname, &fd);
-    free(scanname);
-    if (fh == INVALID_HANDLE_VALUE) {
-	errno = map_errno(GetLastError());
-	free(p);
-	return NULL;
-    }
-
     idx = 0;
 
     //
@@ -3467,6 +3477,17 @@
 }
 
 static int
+check_valid_dir(const char *path)
+{
+    WIN32_FIND_DATA fd;
+    HANDLE fh = open_dir_handle(path, &fd);
+    if (fh == INVALID_HANDLE_VALUE)
+	return -1;
+    FindClose(fh);
+    return 0;
+}
+
+static int
 winnt_stat(const char *path, struct stati64 *st)
 {
     HANDLE h;
@@ -3496,6 +3517,9 @@
 	    errno = map_errno(GetLastError());
 	    return -1;
 	}
+	if (attr & FILE_ATTRIBUTE_DIRECTORY) {
+	    if (check_valid_dir(path)) return -1;
+	}
 	st->st_mode  = fileattr_to_unixmode(attr, path);
     }
 
@@ -3505,6 +3529,21 @@
     return 0;
 }
 
+#ifdef WIN95
+static int
+win95_stat(const char *path, struct stati64 *st)
+{
+    int ret = stati64(path, st);
+    if (ret) return ret;
+    if (st->st_mode & S_IFDIR) {
+	return check_valid_dir(path);
+    }
+    return 0;
+}
+#else
+#define win95_stat(path, st) -1
+#endif
+
 int
 rb_w32_stat(const char *path, struct stat *st)
 {
@@ -3552,7 +3591,7 @@
     else if (*end == '\\' || (buf1 + 1 == end && *end == ':'))
 	strlcat(buf1, ".", size);
 
-    ret = IsWinNT() ? winnt_stat(buf1, st) : stati64(buf1, st);
+    ret = IsWinNT() ? winnt_stat(buf1, st) : win95_stat(buf1, st);
     if (ret == 0) {
 	st->st_mode &= ~(S_IWGRP | S_IWOTH);
     }
Index: ruby_1_9_1/test/ruby/test_file_exhaustive.rb
===================================================================
--- ruby_1_9_1/test/ruby/test_file_exhaustive.rb	(revision 21463)
+++ ruby_1_9_1/test/ruby/test_file_exhaustive.rb	(revision 21464)
@@ -97,6 +97,7 @@
 
   def test_directory_p
     assert(File.directory?(@dir))
+    assert(!(File.directory?(@dir+"/...")))
     assert(!(File.directory?(@file)))
     assert(!(File.directory?(@nofile)))
   end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]