[ruby/f22] Apply upstream fix to TestIO#test_seek tests.

Vít Ondruch vondruch at fedoraproject.org
Tue Mar 24 13:27:38 UTC 2015


commit bedc1b6cdd5b47272b20cce9e26102fed1eaeed1
Author: Vít Ondruch <vondruch at redhat.com>
Date:   Tue Mar 24 14:26:56 2015 +0100

    Apply upstream fix to TestIO#test_seek tests.

 ruby-2.2.1-use-statfs.patch | 158 ++++++++++++++++++++++++++++++++++++++++++++
 ruby.spec                   |   8 +--
 2 files changed, 162 insertions(+), 4 deletions(-)
---
diff --git a/ruby-2.2.1-use-statfs.patch b/ruby-2.2.1-use-statfs.patch
new file mode 100644
index 0000000..842eb0e
--- /dev/null
+++ b/ruby-2.2.1-use-statfs.patch
@@ -0,0 +1,158 @@
+From acae106c7c8feab92a52982976b147f1100207a5 Mon Sep 17 00:00:00 2001
+From: nobu <nobu at b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
+Date: Tue, 24 Mar 2015 08:30:15 +0000
+Subject: [PATCH] fs.c: use statfs/statvfs
+
+* ext/-test-/file/fs.c (get_fsname): return filesystem name by
+  statfs/statvfs.  [ruby-core:68624] [Bug #10998]
+
+git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50071 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
+---
+ ChangeLog                  |  5 +++
+ ext/-test-/file/extconf.rb | 14 ++++++++
+ ext/-test-/file/fs.c       | 85 +++++++++++++++++++++++++---------------------
+ 3 files changed, 66 insertions(+), 38 deletions(-)
+
+diff --git a/ChangeLog b/ChangeLog
+index a2f2f97..d7e11af 100644
+--- a/ChangeLog
++++ b/ChangeLog
+@@ -1,3 +1,8 @@
++Tue Mar 24 17:30:12 2015  Nobuyoshi Nakada  <nobu at ruby-lang.org>
++
++	* ext/-test-/file/fs.c (get_fsname): return filesystem name by
++	  statfs/statvfs.  [ruby-core:68624] [Bug #10998]
++
+ Thu Feb 26 15:48:41 2015  NAKAMURA Usaku  <usa at ruby-lang.org>
+ 
+ 	* ext/win32/Win32API.rb (initialize): accept both a string and an array
+diff --git a/ext/-test-/file/extconf.rb b/ext/-test-/file/extconf.rb
+index 4e134dd..be4a2fb 100644
+--- a/ext/-test-/file/extconf.rb
++++ b/ext/-test-/file/extconf.rb
+@@ -1,4 +1,18 @@
+ $INCFLAGS << " -I$(topdir) -I$(top_srcdir)"
++
++headers = %w[sys/param.h sys/mount.h sys/vfs.h].select {|h| have_header(h)}
++if have_type("struct statfs", headers)
++  have_struct_member("struct statfs", "f_fstypename", headers)
++  have_struct_member("struct statfs", "f_type", headers)
++end
++
++headers = %w[sys/statvfs.h]
++if have_type("struct statvfs", headers)
++  have_struct_member("struct statvfs", "f_fstypename", headers)
++  have_struct_member("struct statvfs", "f_basetype", headers)
++  have_struct_member("struct statvfs", "f_type", headers)
++end
++
+ $srcs = Dir[File.join($srcdir, "*.{#{SRC_EXT.join(%q{,})}}")]
+ inits = $srcs.map {|s| File.basename(s, ".*")}
+ inits.delete("init")
+diff --git a/ext/-test-/file/fs.c b/ext/-test-/file/fs.c
+index 4a41bf3..94d96d3 100644
+--- a/ext/-test-/file/fs.c
++++ b/ext/-test-/file/fs.c
+@@ -1,55 +1,64 @@
+ #include "ruby/ruby.h"
+ #include "ruby/io.h"
+ 
+-#ifdef __linux__
+-# define HAVE_GETMNTENT
++#ifdef HAVE_SYS_MOUNT_H
++#include <sys/mount.h>
++#endif
++#ifdef HAVE_SYS_VFS_H
++#include <sys/vfs.h>
+ #endif
+ 
+-#ifdef HAVE_GETMNTENT
+-# include <stdio.h>
+-# include <mntent.h>
++#if defined HAVE_STRUCT_STATFS_F_FSTYPENAME
++typedef struct statfs statfs_t;
++# define STATFS(f, s) statfs((f), (s))
++# define HAVE_STRUCT_STATFS_T_F_FSTYPENAME 1
++#elif defined(HAVE_STRUCT_STATVFS_F_FSTYPENAME) /* NetBSD */
++typedef struct statvfs statfs_t;
++# define STATFS(f, s) statvfs((f), (s))
++# define HAVE_STRUCT_STATFS_T_F_FSTYPENAME 1
++#elif defined(HAVE_STRUCT_STATVFS_F_BASETYPE) /* AIX, HP-UX, Solaris */
++typedef struct statvfs statfs_t;
++# define STATFS(f, s) statvfs((f), (s))
++# define HAVE_STRUCT_STATFS_T_F_FSTYPENAME 1
++# define f_fstypename f_basetype
++#elif defined HAVE_STRUCT_STATFS_F_TYPE
++typedef struct statfs statfs_t;
++# define STATFS(f, s) statfs((f), (s))
++#elif defined HAVE_STRUCT_STATVFS_F_TYPE
++typedef struct statvfs statfs_t;
++# define STATFS(f, s) statvfs((f), (s))
+ #endif
+ 
+ VALUE
+ get_fsname(VALUE self, VALUE str)
+ {
+-#ifdef HAVE_GETMNTENT
+-    const char *path;
+-    struct mntent mntbuf;
+-    static const int buflen = 4096;
+-    char *buf = alloca(buflen);
+-    int len = 0;
+-    FILE *fp;
+-#define FSNAME_LEN 100
+-    char name[FSNAME_LEN] = "";
++#ifdef STATFS
++    statfs_t st;
++# define CSTR(s) rb_str_new_cstr(s)
+ 
+     FilePathValue(str);
+-    path = RSTRING_PTR(str);
+-    fp = setmntent("/etc/mtab", "r");
+-    if (!fp) rb_sys_fail("setmntent(/etb/mtab)");;
+-
+-    while (getmntent_r(fp, &mntbuf, buf, buflen)) {
+-	int i;
+-	char *mnt_dir = mntbuf.mnt_dir;
+-	for (i=0; mnt_dir[i]; i++) {
+-	    if (mnt_dir[i] != path[i]) {
+-		goto next_entry;
+-	    }
+-	}
+-	if (i >= len) {
+-	    len = i;
+-	    strlcpy(name, mntbuf.mnt_type, FSNAME_LEN);
+-	}
+-next_entry:
+-	;
++    str = rb_str_encode_ospath(str);
++    if (STATFS(StringValueCStr(str), &st) == -1) {
++	rb_sys_fail_str(str);
++    }
++# ifdef HAVE_STRUCT_STATFS_T_F_FSTYPENAME
++    if (st.f_fstypename[0])
++	return CSTR(st.f_fstypename);
++# endif
++    switch (st.f_type) {
++      case 0x9123683E: /* BTRFS_SUPER_MAGIC */
++	return CSTR("btrfs");
++      case 0x7461636f: /* OCFS2_SUPER_MAGIC */
++	return CSTR("ocfs");
++      case 0xEF53: /* EXT2_SUPER_MAGIC EXT3_SUPER_MAGIC EXT4_SUPER_MAGIC */
++	return CSTR("ext4");
++      case 0x58465342: /* XFS_SUPER_MAGIC */
++	return CSTR("xfs");
++      case 0x01021994: /* TMPFS_MAGIC */
++	return CSTR("tmpfs");
+     }
+-    endmntent(fp);
+-
+-    if (!len) rb_sys_fail("no matching entry");;
+-    return rb_str_new_cstr(name);
+-#else
+-    return Qnil;
+ #endif
++    return Qnil;
+ }
+ 
+ void
diff --git a/ruby.spec b/ruby.spec
index dfb9532..dcf1f5c 100644
--- a/ruby.spec
+++ b/ruby.spec
@@ -110,6 +110,9 @@ Patch5: ruby-1.9.3-mkmf-verbose.patch
 # in support for ABRT.
 # http://bugs.ruby-lang.org/issues/8566
 Patch6: ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch
+# can_seek_data does not work correctly in chroot for Kernel 3.19+.
+# https://bugs.ruby-lang.org/issues/10998
+Patch7: ruby-2.2.1-use-statfs.patch
 
 Requires: %{name}-libs%{?_isa} = %{version}-%{release}
 Requires: ruby(rubygems) >= %{rubygems_version}
@@ -410,6 +413,7 @@ rm -rf ext/fiddle/libffi*
 %patch4 -p1
 %patch5 -p1
 %patch6 -p1
+%patch7 -p1
 
 # Provide an example of usage of the tapset:
 cp -a %{SOURCE3} .
@@ -599,10 +603,6 @@ touch abrt.rb
 sed -i '/def test_ctx_client_session_cb$/,/^  end$/ s/^/#/' test/openssl/test_ssl_session.rb
 sed -i '/def test_ctx_server_session_cb$/,/^  end$/ s/^/#/' test/openssl/test_ssl_session.rb
 
-# can_seek_data does not work correctly in chroot for Kernel 3.19+.
-# https://bugs.ruby-lang.org/issues/10998
-sed -i '/break unless can_seek_data(f)/ s/^/#/' test/ruby/test_io.rb
-
 make check TESTS="-v $DISABLE_TESTS"
 
 %post libs -p /sbin/ldconfig


More information about the scm-commits mailing list