Skip to content

Commit

Permalink
src: create a getter for kernel version
Browse files Browse the repository at this point in the history
PR-URL: #31732
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
juanarbol authored and addaleax committed Mar 9, 2020
1 parent 0a539dd commit c1e6725
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 30 deletions.
14 changes: 14 additions & 0 deletions doc/api/os.md
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, `pRtlGetVersion` 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
20 changes: 14 additions & 6 deletions lib/os.js
Expand Up @@ -45,9 +45,8 @@ const {
getHostname: _getHostname,
getInterfaceAddresses: _getInterfaceAddresses,
getLoadAvg,
getOSRelease: _getOSRelease,
getOSType: _getOSType,
getPriority: _getPriority,
getOSInformation: _getOSInformation,
getTotalMem,
getUserInfo,
getUptime,
Expand All @@ -66,17 +65,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();
getOSVersion[SymbolToPrimitive] = () => getOSVersion();
getOSType[SymbolToPrimitive] = () => getOSType();
getOSRelease[SymbolToPrimitive] = () => getOSRelease();
getHomeDirectory[SymbolToPrimitive] = () => getHomeDirectory();
getTotalMem[SymbolToPrimitive] = () => getTotalMem();
getUptime[SymbolToPrimitive] = () => getUptime();

Expand Down Expand Up @@ -281,6 +288,7 @@ module.exports = {
type: getOSType,
userInfo,
uptime: getUptime,
version: getOSVersion
};

ObjectDefineProperties(module.exports, {
Expand Down
35 changes: 11 additions & 24 deletions src/node_os.cc
Expand Up @@ -75,8 +75,7 @@ static void GetHostname(const FunctionCallbackInfo<Value>& args) {
.ToLocalChecked());
}


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,29 +86,18 @@ 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();
}
// [sysname, version, release]
Local<Value> osInformation[] = {
String::NewFromUtf8(env->isolate(), info.sysname).ToLocalChecked(),
String::NewFromUtf8(env->isolate(), info.version).ToLocalChecked(),
String::NewFromUtf8(env->isolate(), info.release).ToLocalChecked()
};

args.GetReturnValue().Set(
String::NewFromUtf8(env->isolate(), info.release, NewStringType::kNormal)
.ToLocalChecked());
args.GetReturnValue().Set(Array::New(env->isolate(),
osInformation,
arraysize(osInformation)));
}


static void GetCPUInfo(const FunctionCallbackInfo<Value>& args) {
Environment* env = Environment::GetCurrent(args);
Isolate* isolate = env->isolate();
Expand Down Expand Up @@ -398,13 +386,12 @@ 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, "getInterfaceAddresses", GetInterfaceAddresses);
env->SetMethod(target, "getHomeDirectory", GetHomeDirectory);
env->SetMethod(target, "getUserInfo", GetUserInfo);
env->SetMethod(target, "setPriority", SetPriority);
env->SetMethod(target, "getPriority", GetPriority);
env->SetMethod(target, "getOSInformation", GetOSInformation);
target->Set(env->context(),
FIXED_ONE_BYTE_STRING(env->isolate(), "isBigEndian"),
Boolean::New(env->isolate(), IsBigEndian())).Check();
Expand Down
4 changes: 4 additions & 0 deletions test/parallel/test-os.js
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 c1e6725

Please sign in to comment.