summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--NEWS4
-rw-r--r--ext/etc/etc.c49
-rw-r--r--ext/etc/extconf.rb7
-rw-r--r--test/etc/test_etc.rb13
5 files changed, 81 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 1d057111f4..40ee58baba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
* configure.in: Check nextafter() availability.
diff --git a/NEWS b/NEWS
index 6a4e703f74..5e84dbc376 100644
--- a/NEWS
+++ b/NEWS
@@ -83,6 +83,10 @@ with all sufficient information, see the ChangeLog file.
=== Stdlib updates (outstanding ones only)
+* Etc
+ * New methods:
+ * Etc.uname
+
* Find, Pathname
* Extended methods:
* find method accepts "ignore_error" keyword argument.
diff --git a/ext/etc/etc.c b/ext/etc/etc.c
index 18d425a8bf..e805f0e9b1 100644
--- a/ext/etc/etc.c
+++ b/ext/etc/etc.c
@@ -23,6 +23,10 @@
#include <grp.h>
#endif
+#ifdef HAVE_SYS_UTSNAME_H
+#include <sys/utsname.h>
+#endif
+
static VALUE sPasswd;
#ifdef HAVE_GETGRENT
static VALUE sGroup;
@@ -636,6 +640,50 @@ etc_systmpdir(void)
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
* 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, "sysconfdir", etc_sysconfdir, 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",
"name",
diff --git a/ext/etc/extconf.rb b/ext/etc/extconf.rb
index c26553e71a..26f0ad1364 100644
--- a/ext/etc/extconf.rb
+++ b/ext/etc/extconf.rb
@@ -1,6 +1,13 @@
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_func("uname((struct utsname *)NULL)", headers)
have_func("getlogin")
have_func("getpwent")
have_func("getgrent")
diff --git a/test/etc/test_etc.rb b/test/etc/test_etc.rb
index c105122af1..56fa4fbfbc 100644
--- a/test/etc/test_etc.rb
+++ b/test/etc/test_etc.rb
@@ -112,4 +112,17 @@ class TestEtc < Test::Unit::TestCase
Etc.endgrent
assert_equal(a, b)
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