39 # include <sys/param.h> 40 # include <sys/utsname.h> 44 #ifndef MAXHOSTNAMELEN 45 # define MAXHOSTNAMELEN 256 46 #endif // MAXHOSTNAMELEN 52 using v8::ArrayBuffer;
55 using v8::Float64Array;
57 using v8::FunctionCallbackInfo;
68 static void GetHostname(
const FunctionCallbackInfo<Value>& args) {
69 Environment* env = Environment::GetCurrent(args);
72 if (gethostname(buf,
sizeof(buf))) {
76 int errorno = WSAGetLastError();
78 return env->ThrowErrnoException(errorno,
"gethostname");
80 buf[
sizeof(
buf) - 1] =
'\0';
82 args.GetReturnValue().Set(OneByteString(env->isolate(),
buf));
86 static void GetOSType(
const FunctionCallbackInfo<Value>& args) {
87 Environment* env = Environment::GetCurrent(args);
92 if (uname(&info) < 0) {
93 return env->ThrowErrnoException(errno,
"uname");
100 args.GetReturnValue().Set(OneByteString(env->isolate(), rval));
104 static void GetOSRelease(
const FunctionCallbackInfo<Value>& args) {
105 Environment* env = Environment::GetCurrent(args);
110 if (uname(&info) < 0) {
111 return env->ThrowErrnoException(errno,
"uname");
115 snprintf(release,
sizeof(release),
116 "%s.%s", info.version, info.release);
125 info.dwOSVersionInfoSize =
sizeof(info);
128 #pragma warning(suppress : 4996) 129 if (GetVersionExW(&info) == 0)
135 static_cast<int>(info.dwMajorVersion),
136 static_cast<int>(info.dwMinorVersion),
137 static_cast<int>(info.dwBuildNumber));
141 args.GetReturnValue().Set(OneByteString(env->isolate(), rval));
145 static void GetCPUInfo(
const FunctionCallbackInfo<Value>& args) {
146 Environment* env = Environment::GetCurrent(args);
147 uv_cpu_info_t* cpu_infos;
148 int count, i, field_idx;
150 int err = uv_cpu_info(&cpu_infos, &count);
154 CHECK(args[0]->IsFunction());
155 Local<Function> addfn = args[0].As<Function>();
157 CHECK(args[1]->IsFloat64Array());
158 Local<Float64Array> array = args[1].As<Float64Array>();
159 CHECK_EQ(array->Length(), 6 * NODE_PUSH_VAL_TO_ARRAY_MAX);
160 Local<ArrayBuffer> ab = array->Buffer();
161 double* fields =
static_cast<double*
>(ab->GetContents().Data());
163 CHECK(args[2]->IsArray());
164 Local<Array> cpus = args[2].As<Array>();
166 Local<Value> model_argv[NODE_PUSH_VAL_TO_ARRAY_MAX];
169 for (i = 0, field_idx = 0; i < count; i++) {
170 uv_cpu_info_t* ci = cpu_infos + i;
172 fields[field_idx++] = ci->speed;
173 fields[field_idx++] = ci->cpu_times.user;
174 fields[field_idx++] = ci->cpu_times.nice;
175 fields[field_idx++] = ci->cpu_times.sys;
176 fields[field_idx++] = ci->cpu_times.idle;
177 fields[field_idx++] = ci->cpu_times.irq;
178 model_argv[model_idx++] = OneByteString(env->isolate(), ci->model);
180 if (model_idx >= NODE_PUSH_VAL_TO_ARRAY_MAX) {
181 addfn->Call(env->context(), cpus, model_idx, model_argv).ToLocalChecked();
188 addfn->Call(env->context(), cpus, model_idx, model_argv).ToLocalChecked();
191 uv_free_cpu_info(cpu_infos, count);
192 args.GetReturnValue().Set(cpus);
196 static void GetFreeMemory(
const FunctionCallbackInfo<Value>& args) {
197 double amount = uv_get_free_memory();
200 args.GetReturnValue().Set(amount);
204 static void GetTotalMemory(
const FunctionCallbackInfo<Value>& args) {
205 double amount = uv_get_total_memory();
208 args.GetReturnValue().Set(amount);
212 static void GetUptime(
const FunctionCallbackInfo<Value>& args) {
214 int err = uv_uptime(&uptime);
216 args.GetReturnValue().Set(uptime);
220 static void GetLoadAvg(
const FunctionCallbackInfo<Value>& args) {
221 CHECK(args[0]->IsFloat64Array());
222 Local<Float64Array> array = args[0].As<Float64Array>();
223 CHECK_EQ(array->Length(), 3);
224 Local<ArrayBuffer> ab = array->Buffer();
225 double* loadavg =
static_cast<double*
>(ab->GetContents().Data());
230 static void GetInterfaceAddresses(
const FunctionCallbackInfo<Value>& args) {
231 Environment* env = Environment::GetCurrent(args);
232 uv_interface_address_t* interfaces;
234 char ip[INET6_ADDRSTRLEN];
235 char netmask[INET6_ADDRSTRLEN];
237 Local<Object> ret,
o;
238 Local<String> name, family;
241 int err = uv_interface_addresses(&interfaces, &count);
245 if (err == UV_ENOSYS) {
246 return args.GetReturnValue().Set(ret);
248 return env->ThrowUVException(err,
"uv_interface_addresses");
251 for (i = 0; i < count; i++) {
252 const char*
const raw_name = interfaces[i].name;
258 name = String::NewFromUtf8(env->isolate(), raw_name);
260 name = OneByteString(env->isolate(), raw_name);
263 if (ret->Has(env->context(), name).FromJust()) {
264 ifarr = Local<Array>::Cast(ret->Get(name));
267 ret->Set(name, ifarr);
272 "%02x:%02x:%02x:%02x:%02x:%02x",
273 static_cast<unsigned char>(interfaces[i].phys_addr[0]),
274 static_cast<unsigned char>(interfaces[i].phys_addr[1]),
275 static_cast<unsigned char>(interfaces[i].phys_addr[2]),
276 static_cast<unsigned char>(interfaces[i].phys_addr[3]),
277 static_cast<unsigned char>(interfaces[i].phys_addr[4]),
278 static_cast<unsigned char>(interfaces[i].phys_addr[5]));
280 if (interfaces[i].address.address4.sin_family == AF_INET) {
281 uv_ip4_name(&interfaces[i].address.address4, ip,
sizeof(ip));
282 uv_ip4_name(&interfaces[i].netmask.netmask4, netmask,
sizeof(netmask));
283 family = env->ipv4_string();
284 }
else if (interfaces[i].address.address4.sin_family == AF_INET6) {
285 uv_ip6_name(&interfaces[i].address.address6, ip,
sizeof(ip));
286 uv_ip6_name(&interfaces[i].netmask.netmask6, netmask,
sizeof(netmask));
287 family = env->ipv6_string();
289 strncpy(ip,
"<unknown sa family>", INET6_ADDRSTRLEN);
290 family = env->unknown_string();
294 o->Set(env->address_string(), OneByteString(env->isolate(), ip));
295 o->Set(env->netmask_string(), OneByteString(env->isolate(), netmask));
296 o->Set(env->family_string(), family);
297 o->Set(env->mac_string(), FIXED_ONE_BYTE_STRING(env->isolate(), mac));
299 if (interfaces[i].address.address4.sin_family == AF_INET6) {
300 uint32_t scopeid = interfaces[i].address.address6.sin6_scope_id;
301 o->Set(env->scopeid_string(),
302 Integer::NewFromUnsigned(env->isolate(), scopeid));
305 const bool internal = interfaces[i].is_internal;
306 o->Set(env->internal_string(),
307 internal ? True(env->isolate()) : False(env->isolate()));
309 ifarr->Set(ifarr->Length(),
o);
312 uv_free_interface_addresses(interfaces, count);
313 args.GetReturnValue().Set(ret);
317 static void GetHomeDirectory(
const FunctionCallbackInfo<Value>& args) {
318 Environment* env = Environment::GetCurrent(args);
322 const int err = uv_os_homedir(buf, &len);
325 return env->ThrowUVException(err,
"uv_os_homedir");
328 Local<String> home = String::NewFromUtf8(env->isolate(),
330 String::kNormalString,
332 args.GetReturnValue().Set(home);
336 static void GetUserInfo(
const FunctionCallbackInfo<Value>& args) {
337 Environment* env = Environment::GetCurrent(args);
341 if (args[0]->IsObject()) {
342 Local<Object> options = args[0].As<Object>();
343 MaybeLocal<Value> maybe_encoding = options->Get(env->context(),
344 env->encoding_string());
345 if (maybe_encoding.IsEmpty())
348 Local<Value> encoding_opt = maybe_encoding.ToLocalChecked();
354 const int err = uv_os_get_passwd(&pwd);
357 return env->ThrowUVException(err,
"uv_os_get_passwd");
362 Local<Value> uid =
Number::New(env->isolate(), pwd.uid);
363 Local<Value> gid =
Number::New(env->isolate(), pwd.gid);
372 MaybeLocal<Value> shell;
374 if (pwd.shell == NULL)
375 shell = Null(env->isolate());
379 uv_os_free_passwd(&pwd);
381 if (username.IsEmpty()) {
383 return env->ThrowUVException(UV_EINVAL,
385 "Invalid character encoding for username");
388 if (homedir.IsEmpty()) {
390 return env->ThrowUVException(UV_EINVAL,
392 "Invalid character encoding for homedir");
395 if (shell.IsEmpty()) {
397 return env->ThrowUVException(UV_EINVAL,
399 "Invalid character encoding for shell");
404 entry->Set(env->uid_string(), uid);
405 entry->Set(env->gid_string(), gid);
406 entry->Set(env->username_string(), username.ToLocalChecked());
407 entry->Set(env->homedir_string(), homedir.ToLocalChecked());
408 entry->Set(env->shell_string(), shell.ToLocalChecked());
410 args.GetReturnValue().Set(entry);
416 Local<Context> context) {
417 Environment* env = Environment::GetCurrent(context);
418 env->SetMethod(target,
"getHostname", GetHostname);
419 env->SetMethod(target,
"getLoadAvg", GetLoadAvg);
420 env->SetMethod(target,
"getUptime", GetUptime);
421 env->SetMethod(target,
"getTotalMem", GetTotalMemory);
422 env->SetMethod(target,
"getFreeMem", GetFreeMemory);
423 env->SetMethod(target,
"getCPUs", GetCPUInfo);
424 env->SetMethod(target,
"getOSType", GetOSType);
425 env->SetMethod(target,
"getOSRelease", GetOSRelease);
426 env->SetMethod(target,
"getInterfaceAddresses", GetInterfaceAddresses);
427 env->SetMethod(target,
"getHomeDirectory", GetHomeDirectory);
428 env->SetMethod(target,
"getUserInfo", GetUserInfo);
429 target->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"isBigEndian"),
NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector, node::inspector::Agent::InitInspector)
void Initialize(Local< Object > target, Local< Value > unused, Local< Context > context)
enum encoding ParseEncoding(const char *encoding, enum encoding default_encoding)
MaybeLocal< Object > New(Isolate *isolate, Local< String > string, enum encoding enc)
NODE_DEPRECATED("Use ParseEncoding(isolate, ...)", inline enum encoding ParseEncoding(v8::Local< v8::Value > encoding_v, enum encoding default_encoding=LATIN1) { return ParseEncoding(v8::Isolate::GetCurrent(), encoding_v, default_encoding);}) NODE_EXTERN void FatalException(v8 NODE_DEPRECATED("Use FatalException(isolate, ...)", inline void FatalException(const v8::TryCatch &try_catch) { return FatalException(v8::Isolate::GetCurrent(), try_catch);}) NODE_EXTERN v8 NODE_EXTERN v8::Local< v8::Value > Encode(v8::Isolate *isolate, const uint16_t *buf, size_t len)