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 +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 ++ ++ * 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 + + * 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 ++#endif ++#ifdef HAVE_SYS_VFS_H ++#include + #endif + +-#ifdef HAVE_GETMNTENT +-# include +-# include ++#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 d2765d9..b72f53d 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