[#6660] Ruby on Neko ? — Nicolas Cannasse <ncannasse@...>

Hi folks,

14 messages 2005/11/19

[#6672] testing for hardlink with "test(?-, ...)" flawed on Windows — noreply@...

Bugs item #2858, was opened at 2005-11-20 16:35

13 messages 2005/11/20

[#6684] semenatics of if/unless/while statement modifiers — Stefan Kaes <skaes@...>

Hi all,

81 messages 2005/11/21
[#6685] Re: semenatics of if/unless/while statement modifiers — Mauricio Fern疣dez <mfp@...> 2005/11/22

On Tue, Nov 22, 2005 at 08:22:59AM +0900, Stefan Kaes wrote:

[#6686] Re: semenatics of if/unless/while statement modifiers — Stefan Kaes <skaes@...> 2005/11/22

Mauricio Fern疣dez wrote:

[#6687] Re: semenatics of if/unless/while statement modifiers — Eric Hodel <drbrain@...7.net> 2005/11/22

On Nov 21, 2005, at 4:37 PM, Stefan Kaes wrote:

[#6689] Re: semenatics of if/unless/while statement modifiers — Stefan Kaes <skaes@...> 2005/11/22

Eric Hodel wrote:

[#6693] Re: semenatics of if/unless/while statement modifiers — Yukihiro Matsumoto <matz@...> 2005/11/22

Hi,

[#6695] Re: semenatics of if/unless/while statement modifiers — Stefan Kaes <skaes@...> 2005/11/22

Yukihiro Matsumoto wrote:

[#6718] Re: semenatics of if/unless/while statement modifiers — mathew <meta@...> 2005/11/22

[#6722] Re: semenatics of if/unless/while statement modifiers — Stefan Kaes <skaes@...> 2005/11/22

mathew wrote:

[#6707] Re: semenatics of if/unless/while statement modifiers — "David A. Black" <dblack@...> 2005/11/22

Hi --

[#6708] Re: semenatics of if/unless/while statement modifiers — Stefan Kaes <skaes@...> 2005/11/22

David A. Black wrote:

[#6714] Re: semenatics of if/unless/while statement modifiers — "David A. Black" <dblack@...> 2005/11/22

Hi --

[#6717] Re: semenatics of if/unless/while statement modifiers — Stefan Kaes <skaes@...> 2005/11/22

David A. Black wrote:

[#6798] ruby 1.8.4 preview2 — Yukihiro Matsumoto <matz@...>

Hi,

37 messages 2005/11/30

Re: [ ruby-Bugs-2858 ] testing for hardlink with "test(?-, ...)" flawed on Windows

From: nobuyoshi nakada <nobuyoshi.nakada@...>
Date: 2005-11-22 04:03:38 UTC
List: ruby-core #6690
Hi,

At Tue, 22 Nov 2005 07:39:01 +0900,
daz wrote in [ruby-core:06683]:
> If there aren't any hard links on Win9X, all I can
> think of is to compare the same file:

AFAIK, Win9X family don't support NTFS and others, which is
required for hard links and reparse points.  The only way I
thought of is to compare expanded pathes.

> I'm not asking questions, just sending feedback as I'm
> the last person on the planet using 9X ;))

An `endangered species'?


Index: file.c
===================================================================
RCS file: /cvs/ruby/src/ruby/file.c,v
retrieving revision 1.227
diff -U2 -p -u -r1.227 file.c
--- file.c	21 Nov 2005 16:47:06 -0000	1.227
+++ file.c	22 Nov 2005 04:00:21 -0000
@@ -637,4 +637,30 @@ rb_stat(VALUE file, struct stat *st)
 }
 
+#ifdef _WIN32
+static HANDLE
+w32_stat(VALUE *file, BY_HANDLE_FILE_INFORMATION *st)
+{
+    VALUE tmp;
+    HANDLE f, ret = 0;
+
+    tmp = rb_check_convert_type(*file, T_FILE, "IO", "to_io");
+    if (!NIL_P(tmp)) {
+	OpenFile *fptr;
+
+	GetOpenFile(tmp, fptr);
+	f = (HANDLE)rb_w32_get_osfhandle(fptr->fd);
+    }
+    else {
+	FilePathValue(*file);
+	f = CreateFile(StringValueCStr(*file), 0, 0, NULL,
+		       OPEN_EXISTING, 0, NULL);
+	if (f == INVALID_HANDLE_VALUE) return f;
+	ret = f;
+    }
+    if (GetFileInformationByHandle(f, st)) return ret;
+    return INVALID_HANDLE_VALUE;
+}
+#endif
+
 /*
  *  call-seq:
@@ -1363,4 +1389,51 @@ test_sticky(VALUE obj, VALUE fname)
 }
 
+static VALUE
+test_identical(VALUE obj, VALUE fname1, VALUE fname2)
+{
+#ifndef DOSISH
+    struct stat st1, st2;
+
+    if (rb_stat(fname1, &st1) < 0) return Qfalse;
+    if (rb_stat(fname2, &st2) < 0) return Qfalse;
+    if (st1.st_dev != st2.st_dev) return Qfalse;
+    if (st1.st_ino != st2.st_ino) return Qfalse;
+#else
+#ifdef _WIN32
+    BY_HANDLE_FILE_INFORMATION st1, st2;
+    HANDLE f1 = 0, f2 = 0;
+#endif
+
+    rb_secure(2);
+#ifdef _WIN32
+    f1 = w32_stat(&fname1, &st1);
+    if (f1 == INVALID_HANDLE_VALUE) return Qfalse;
+    f2 = w32_stat(&fname2, &st2);
+    if (f1) CloseHandle(f1);
+    if (f2 == INVALID_HANDLE_VALUE) return Qfalse;
+    if (f2) CloseHandle(f2);
+
+    if (st1.dwVolumeSerialNumber == st2.dwVolumeSerialNumber &&
+	st1.nFileIndexHigh == st2.nFileIndexHigh &&
+	st1.nFileIndexLow == st2.nFileIndexLow)
+	return Qtrue;
+    if (!f1 || !f2) return Qfalse;
+    /* only Win9X? */
+#else
+    FilePathValue(file1);
+    file1 = rb_str_new4(file1);
+    FilePathValue(file2);
+    if (access(RSTRING(file1)->ptr, 0)) return Qfalse;
+    if (access(RSTRING(file2)->ptr, 0)) return Qfalse;
+#endif
+    file1 = rb_file_expand_path(file1, Qnil);
+    file2 = rb_file_expand_path(file2, Qnil);
+    if (RSTRING(file1)->len != RSTRING(file2)->len) return Qfalse;
+    if (rb_memcicmp(RSTRING(file1)->ptr, RSTRING(file2)->ptr, RSTRING(file1)->len))
+	return Qfalse;
+#endif
+    return Qtrue;
+}
+
 /*
  * call-seq:
@@ -3220,5 +3293,10 @@ rb_f_test(int argc, VALUE *argv)
     }
 
-    if (strchr("-=<>", cmd)) {
+    if (cmd == '-') {
+	CHECK(2);
+	return test_identical(0, argv[1], argv[2]);
+    }
+
+    if (strchr("=<>", cmd)) {
 	struct stat st1, st2;
 
@@ -3228,9 +3306,4 @@ rb_f_test(int argc, VALUE *argv)
 
 	switch (cmd) {
-	  case '-':
-	    if (st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino)
-		return Qtrue;
-	    return Qfalse;
-
 	  case '=':
 	    if (st1.st_mtime == st2.st_mtime) return Qtrue;
@@ -4199,4 +4272,6 @@ Init_File(void)
     define_filetest_function("sticky?", test_sticky, 1);
 
+    define_filetest_function("identical?", test_identical, 2);
+
     rb_define_singleton_method(rb_cFile, "stat",  rb_file_s_stat, 1);
     rb_define_singleton_method(rb_cFile, "lstat", rb_file_s_lstat, 1);


-- 
Nobu Nakada

In This Thread