* ext/etc/etc.c: Etc.uname method implemented.
* ext/etc/extconf.rb: Check uname() function. [ruby-core:62139] [Feature #9770] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45983 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
63fee73500
commit
63a23dc678
@ -1,3 +1,11 @@
|
|||||||
|
Sun May 18 09:58:17 2014 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* ext/etc/etc.c: Etc.uname method implemented.
|
||||||
|
|
||||||
|
* ext/etc/extconf.rb: Check uname() function.
|
||||||
|
|
||||||
|
[ruby-core:62139] [Feature #9770]
|
||||||
|
|
||||||
Sun May 18 09:16:33 2014 Tanaka Akira <akr@fsij.org>
|
Sun May 18 09:16:33 2014 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* configure.in: Check nextafter() availability.
|
* configure.in: Check nextafter() availability.
|
||||||
|
4
NEWS
4
NEWS
@ -83,6 +83,10 @@ with all sufficient information, see the ChangeLog file.
|
|||||||
|
|
||||||
=== Stdlib updates (outstanding ones only)
|
=== Stdlib updates (outstanding ones only)
|
||||||
|
|
||||||
|
* Etc
|
||||||
|
* New methods:
|
||||||
|
* Etc.uname
|
||||||
|
|
||||||
* Find, Pathname
|
* Find, Pathname
|
||||||
* Extended methods:
|
* Extended methods:
|
||||||
* find method accepts "ignore_error" keyword argument.
|
* find method accepts "ignore_error" keyword argument.
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYS_UTSNAME_H
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
static VALUE sPasswd;
|
static VALUE sPasswd;
|
||||||
#ifdef HAVE_GETGRENT
|
#ifdef HAVE_GETGRENT
|
||||||
static VALUE sGroup;
|
static VALUE sGroup;
|
||||||
@ -636,6 +640,50 @@ etc_systmpdir(void)
|
|||||||
return tmpdir;
|
return tmpdir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_UNAME
|
||||||
|
/*
|
||||||
|
* Returns the system information obtained by uname system call.
|
||||||
|
*
|
||||||
|
* The return value is a hash which has 5 keys at least:
|
||||||
|
* :sysname, :nodename, :release, :version, :machine
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
*
|
||||||
|
* require 'etc'
|
||||||
|
* require 'pp'
|
||||||
|
*
|
||||||
|
* pp Etc.uname
|
||||||
|
* #=> {:sysname=>"Linux",
|
||||||
|
* # :nodename=>"boron",
|
||||||
|
* # :release=>"2.6.18-6-xen-686",
|
||||||
|
* # :version=>"#1 SMP Thu Nov 5 19:54:42 UTC 2009",
|
||||||
|
* # :machine=>"i686"}
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static VALUE
|
||||||
|
etc_uname(VALUE obj)
|
||||||
|
{
|
||||||
|
struct utsname u;
|
||||||
|
int ret;
|
||||||
|
VALUE result;
|
||||||
|
|
||||||
|
ret = uname(&u);
|
||||||
|
if (ret == -1)
|
||||||
|
rb_sys_fail("uname");
|
||||||
|
|
||||||
|
result = rb_hash_new();
|
||||||
|
rb_hash_aset(result, ID2SYM(rb_intern("sysname")), rb_str_new_cstr(u.sysname));
|
||||||
|
rb_hash_aset(result, ID2SYM(rb_intern("nodename")), rb_str_new_cstr(u.nodename));
|
||||||
|
rb_hash_aset(result, ID2SYM(rb_intern("release")), rb_str_new_cstr(u.release));
|
||||||
|
rb_hash_aset(result, ID2SYM(rb_intern("version")), rb_str_new_cstr(u.version));
|
||||||
|
rb_hash_aset(result, ID2SYM(rb_intern("machine")), rb_str_new_cstr(u.machine));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define etc_uname rb_f_notimplement
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The Etc module provides access to information typically stored in
|
* The Etc module provides access to information typically stored in
|
||||||
* files in the /etc directory on Unix systems.
|
* files in the /etc directory on Unix systems.
|
||||||
@ -685,6 +733,7 @@ Init_etc(void)
|
|||||||
rb_define_module_function(mEtc, "getgrent", etc_getgrent, 0);
|
rb_define_module_function(mEtc, "getgrent", etc_getgrent, 0);
|
||||||
rb_define_module_function(mEtc, "sysconfdir", etc_sysconfdir, 0);
|
rb_define_module_function(mEtc, "sysconfdir", etc_sysconfdir, 0);
|
||||||
rb_define_module_function(mEtc, "systmpdir", etc_systmpdir, 0);
|
rb_define_module_function(mEtc, "systmpdir", etc_systmpdir, 0);
|
||||||
|
rb_define_module_function(mEtc, "uname", etc_uname, 0);
|
||||||
|
|
||||||
sPasswd = rb_struct_define_under(mEtc, "Passwd",
|
sPasswd = rb_struct_define_under(mEtc, "Passwd",
|
||||||
"name",
|
"name",
|
||||||
|
@ -1,6 +1,13 @@
|
|||||||
require 'mkmf'
|
require 'mkmf'
|
||||||
|
|
||||||
|
headers = []
|
||||||
|
%w[sys/utsname.h].each {|h|
|
||||||
|
if have_header(h, headers)
|
||||||
|
headers << h
|
||||||
|
end
|
||||||
|
}
|
||||||
have_library("sun", "getpwnam") # NIS (== YP) interface for IRIX 4
|
have_library("sun", "getpwnam") # NIS (== YP) interface for IRIX 4
|
||||||
|
have_func("uname((struct utsname *)NULL)", headers)
|
||||||
have_func("getlogin")
|
have_func("getlogin")
|
||||||
have_func("getpwent")
|
have_func("getpwent")
|
||||||
have_func("getgrent")
|
have_func("getgrent")
|
||||||
|
@ -112,4 +112,17 @@ class TestEtc < Test::Unit::TestCase
|
|||||||
Etc.endgrent
|
Etc.endgrent
|
||||||
assert_equal(a, b)
|
assert_equal(a, b)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_uname
|
||||||
|
begin
|
||||||
|
uname = Etc.uname
|
||||||
|
rescue NotImplementedError
|
||||||
|
return
|
||||||
|
end
|
||||||
|
assert_kind_of(Hash, uname)
|
||||||
|
[:sysname, :nodename, :release, :version, :machine].each {|sym|
|
||||||
|
assert_operator(uname, :has_key?, sym)
|
||||||
|
assert_kind_of(String, uname[sym])
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user