#include "node.h"
#include "v8.h"
#include "env.h"
#include "env-inl.h"
#include "string_bytes.h"
#include
#include
#ifdef __MINGW32__
# include
#endif // __MINGW32__
#ifdef __POSIX__
# include // PATH_MAX on Solaris.
# include // MAXHOSTNAMELEN on Solaris.
# include // gethostname, sysconf
# include // MAXHOSTNAMELEN on Linux and the BSDs.
# include
#endif // __MINGW32__
// Add Windows fallback.
#ifndef MAXHOSTNAMELEN
# define MAXHOSTNAMELEN 256
#endif // MAXHOSTNAMELEN
namespace node {
namespace os {
using v8::Array;
using v8::Boolean;
using v8::Context;
using v8::FunctionCallbackInfo;
using v8::Integer;
using v8::Local;
using v8::Null;
using v8::Number;
using v8::Object;
using v8::String;
using v8::Value;
static void GetHostname(const FunctionCallbackInfo& args) {
Environment* env = Environment::GetCurrent(args);
char buf[MAXHOSTNAMELEN + 1];
if (gethostname(buf, sizeof(buf))) {
#ifdef __POSIX__
int errorno = errno;
#else // __MINGW32__
int errorno = WSAGetLastError();
#endif // __POSIX__
return env->ThrowErrnoException(errorno, "gethostname");
}
buf[sizeof(buf) - 1] = '\0';
args.GetReturnValue().Set(OneByteString(env->isolate(), buf));
}
static void GetOSType(const FunctionCallbackInfo& args) {
Environment* env = Environment::GetCurrent(args);
const char* rval;
#ifdef __POSIX__
struct utsname info;
if (uname(&info) < 0) {
return env->ThrowErrnoException(errno, "uname");
}
rval = info.sysname;
#else // __MINGW32__
rval ="Windows_NT";
#endif // __POSIX__
args.GetReturnValue().Set(OneByteString(env->isolate(), rval));
}
static void GetOSRelease(const FunctionCallbackInfo& args) {
Environment* env = Environment::GetCurrent(args);
const char* rval;
#ifdef __POSIX__
struct utsname info;
if (uname(&info) < 0) {
return env->ThrowErrnoException(errno, "uname");
}
rval = info.release;
#else // Windows
char release[256];
OSVERSIONINFOW info;
info.dwOSVersionInfoSize = sizeof(info);
// Don't complain that GetVersionEx is deprecated; there is no alternative.
#pragma warning(suppress : 4996)
if (GetVersionExW(&info) == 0)
return;
snprintf(release,
sizeof(release),
"%d.%d.%d",
static_cast(info.dwMajorVersion),
static_cast(info.dwMinorVersion),
static_cast(info.dwBuildNumber));
rval = release;
#endif // __POSIX__
args.GetReturnValue().Set(OneByteString(env->isolate(), rval));
}
static void GetCPUInfo(const FunctionCallbackInfo& args) {
Environment* env = Environment::GetCurrent(args);
uv_cpu_info_t* cpu_infos;
int count, i;
int err = uv_cpu_info(&cpu_infos, &count);
if (err)
return;
Local cpus = Array::New(env->isolate());
for (i = 0; i < count; i++) {
uv_cpu_info_t* ci = cpu_infos + i;
Local