diff options
author | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-22 10:39:29 +0000 |
---|---|---|
committer | naruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-05-22 10:39:29 +0000 |
commit | fa244db49b16d05c0042e01ef8faa9190acc5922 (patch) | |
tree | 438a3d8108037c1c13a10e3ae3921e776b8e28b1 /ext/-test- | |
parent | 4548331d383d156d3f3133cd6e35482716e50df5 (diff) | |
download | ruby-fa244db49b16d05c0042e01ef8faa9190acc5922.tar.gz |
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-')
-rw-r--r-- | ext/-test-/file/fs.c | 60 |
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 0000000000..ed1e64e1eb --- /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); +} |