Feature #9770
closedEtc.uname
Description
How about Etc.uname method to call the uname(2) system call?
% ./ruby -rpp -retc -e '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"}
Sometimes we need to obtain OS (kernel) version or similar system information.
For example, there are several tests which invokes uname command (and function via Win32API):
test/ruby/test_io.rb: return false if (`/bin/uname -r`.split('.') <=> %w[3 8]) < 0
test/ruby/test_io.rb: return false if (`/bin/uname -r`.split('.') <=> %w[3 5]) < 0
test/ruby/test_io.rb: return false if (`/bin/uname -r`.split('.') <=> %w[3 8]) < 0
test/ruby/test_sleep.rb: 4.98 if /Linux ([\d.]+)/ =~ `uname -sr` && ($1.split('.')<=>%w/2 6 18/)<1
test/socket/test_socket.rb: (`uname -r`[/[0-9.]+/].split('.').map(&:to_i) <=> [2,6,18]) <= 0
test/dbm/test_dbm.rb: uname = Win32API.new('cygwin1', 'uname', 'P', 'I')
Etc.uname provides clean replacement for them.
uname -r
can be changed to Etc.uname[:release].
uname function is defined by POSIX.
So it is pretty portable.
If the function is not available, NotImplementedError is raised.
I chose Etc module because uname() returns system wide information.
The return value is a plain hash because:
- Struct is marshal-incompatible if some OS add fields. (glibc has "domainname", for example. Current implementation doesn't support it, though.)
- No inspect method required to view contents.
Any idea?
Files
Updated by usa (Usaku NAKAMURA) about 11 years ago
Should I implement an emulation for Windows?
Which of an emulation or NotImplementedError do you think as desiable, akr-san?
Updated by akr (Akira Tanaka) about 11 years ago
As far as the current usages are guraded by platform test such as /linux/ =~ RUBY_PLATFORM,
it seems that emulation on Windows is not so important for non-Windows platforms.
If someone want to check Windows version, Etc.uname may be a good method to provide the information.
Updated by djberg96 (Daniel Berger) about 11 years ago
Already available in the sys-uname gem if anyone is interested. On Windows I return much more information using WMI.
Updated by djberg96 (Daniel Berger) about 11 years ago
If you don't want to use WMI, you could get the same type of information using a combination of GetVersionEx and GetSystemInfo.
Updated by akr (Akira Tanaka) almost 11 years ago
sys-uname gem is not usable for tests bundled in ruby.
Updated by akr (Akira Tanaka) almost 11 years ago
matz accepted this issue at https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20140517Japan
Updated by djberg96 (Daniel Berger) almost 11 years ago
I wasn't suggesting that you use the gem, just use it as a guide.
Updated by akr (Akira Tanaka) almost 11 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r45983.
-
ext/etc/etc.c: Etc.uname method implemented.
-
ext/etc/extconf.rb: Check uname() function.
[ruby-core:62139] [Feature #9770]