summaryrefslogtreecommitdiff
path: root/ext/-test-/file
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-22 10:39:29 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-05-22 10:39:29 +0000
commitfa244db49b16d05c0042e01ef8faa9190acc5922 (patch)
tree438a3d8108037c1c13a10e3ae3921e776b8e28b1 /ext/-test-/file
parent4548331d383d156d3f3133cd6e35482716e50df5 (diff)
add Bug::File::Fs.fsname for tests
get filesystem type name for given path git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46041 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/-test-/file')
-rw-r--r--ext/-test-/file/fs.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/ext/-test-/file/fs.c b/ext/-test-/file/fs.c
new file mode 100644
index 0000000..ed1e64e
--- /dev/null
+++ b/ext/-test-/file/fs.c
@@ -0,0 +1,60 @@
+#include "ruby/ruby.h"
+#include "ruby/io.h"
+
+#ifdef __linux__
+# define HAVE_GETMNTENT
+#endif
+
+#ifdef HAVE_GETMNTENT
+# include <stdio.h>
+# include <mntent.h>
+#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] = "";
+
+ 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:
+ ;
+ }
+ endmntent(fp);
+
+ if (!len) rb_sys_fail("no matching entry");;
+ return rb_str_new_cstr(name);
+#else
+ return Qnil;
+#endif
+}
+
+void
+Init_fs(VALUE module)
+{
+ VALUE fs = rb_define_module_under(module, "Fs");
+ rb_define_module_function(fs, "fsname", get_fsname, 1);
+}