Skip to content

Commit

Permalink
src: create a getter for kernel version
Browse files Browse the repository at this point in the history
Backport-PR-URL: #32166
PR-URL: #31732
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
juanarbol authored and targos committed Apr 28, 2020
1 parent 5c81b8d commit 394487e
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 27 deletions.
14 changes: 14 additions & 0 deletions doc/api/os.md
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,20 @@ operating system response.

Throws a [`SystemError`][] if a user has no `username` or `homedir`.

## `os.version()`
<!-- YAML
added: REPLACEME
-->

* Returns {string}

Returns a string identifying the kernel version.

On POSIX systems, the operating system release is determined by calling
[uname(3)][]. On Windows, `RtlGetVersion()` is used, and if it is not available,
`GetVersionExW()` will be used. See
https://en.wikipedia.org/wiki/Uname#Examples for more information.

## OS Constants

The following constants are exported by `os.constants`.
Expand Down
16 changes: 12 additions & 4 deletions lib/os.js
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ const {
getHostname: _getHostname,
getInterfaceAddresses: _getInterfaceAddresses,
getLoadAvg,
getOSRelease: _getOSRelease,
getOSType: _getOSType,
getOSInformation: _getOSInformation,
getPriority: _getPriority,
getTotalMem,
getUserInfo,
Expand All @@ -67,17 +66,25 @@ function getCheckedFunction(fn) {
});
}

const [
type,
version,
release
] = _getOSInformation();

const getHomeDirectory = getCheckedFunction(_getHomeDirectory);
const getHostname = getCheckedFunction(_getHostname);
const getInterfaceAddresses = getCheckedFunction(_getInterfaceAddresses);
const getOSRelease = getCheckedFunction(_getOSRelease);
const getOSType = getCheckedFunction(_getOSType);
const getOSRelease = () => release;
const getOSType = () => type;
const getOSVersion = () => version;

getFreeMem[SymbolToPrimitive] = () => getFreeMem();
getHostname[SymbolToPrimitive] = () => getHostname();
getHomeDirectory[SymbolToPrimitive] = () => getHomeDirectory();
getOSRelease[SymbolToPrimitive] = () => getOSRelease();
getOSType[SymbolToPrimitive] = () => getOSType();
getOSVersion[SymbolToPrimitive] = () => getOSVersion();
getTotalMem[SymbolToPrimitive] = () => getTotalMem();
getUptime[SymbolToPrimitive] = () => getUptime();

Expand Down Expand Up @@ -283,6 +290,7 @@ module.exports = {
tmpdir,
totalmem: getTotalMem,
type: getOSType,
version: getOSVersion,
userInfo,
uptime: getUptime,

Expand Down
38 changes: 15 additions & 23 deletions src/node_os.cc
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ static void GetHostname(const FunctionCallbackInfo<Value>& args) {
}


static void GetOSType(const FunctionCallbackInfo<Value>& args) {
static void GetOSInformation(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
uv_utsname_t info;
int err = uv_os_uname(&info);
Expand All @@ -87,26 +87,19 @@ static void GetOSType(const FunctionCallbackInfo<Value>& args) {
return args.GetReturnValue().SetUndefined();
}

args.GetReturnValue().Set(
String::NewFromUtf8(env->isolate(), info.sysname, NewStringType::kNormal)
.ToLocalChecked());
}


static void GetOSRelease(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
uv_utsname_t info;
int err = uv_os_uname(&info);

if (err != 0) {
CHECK_GE(args.Length(), 1);
env->CollectUVExceptionInfo(args[args.Length() - 1], err, "uv_os_uname");
return args.GetReturnValue().SetUndefined();
}

args.GetReturnValue().Set(
String::NewFromUtf8(env->isolate(), info.release, NewStringType::kNormal)
.ToLocalChecked());
// [sysname, version, release]
Local<Value> osInformation[] = {
String::NewFromUtf8(
env->isolate(), info.sysname, NewStringType::kNormal).ToLocalChecked(),
String::NewFromUtf8(
env->isolate(), info.version, NewStringType::kNormal).ToLocalChecked(),
String::NewFromUtf8(
env->isolate(), info.release, NewStringType::kNormal).ToLocalChecked()
};

args.GetReturnValue().Set(Array::New(env->isolate(),
osInformation,
arraysize(osInformation)));
}


Expand Down Expand Up @@ -398,8 +391,7 @@ void Initialize(Local<Object> target,
env->SetMethod(target, "getTotalMem", GetTotalMemory);
env->SetMethod(target, "getFreeMem", GetFreeMemory);
env->SetMethod(target, "getCPUs", GetCPUInfo);
env->SetMethod(target, "getOSType", GetOSType);
env->SetMethod(target, "getOSRelease", GetOSRelease);
env->SetMethod(target, "getOSInformation", GetOSInformation);
env->SetMethod(target, "getInterfaceAddresses", GetInterfaceAddresses);
env->SetMethod(target, "getHomeDirectory", GetHomeDirectory);
env->SetMethod(target, "getUserInfo", GetUserInfo);
Expand Down
4 changes: 4 additions & 0 deletions test/parallel/test-os.js
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,10 @@ const home = os.homedir();
is.string(home);
assert.ok(home.includes(path.sep));

const version = os.version();
assert.strictEqual(typeof version, 'string');
assert(version);

if (common.isWindows && process.env.USERPROFILE) {
assert.strictEqual(home, process.env.USERPROFILE);
delete process.env.USERPROFILE;
Expand Down

0 comments on commit 394487e

Please sign in to comment.