diff options
Diffstat (limited to '3rdparty/luv/src/misc.c')
-rw-r--r-- | 3rdparty/luv/src/misc.c | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/3rdparty/luv/src/misc.c b/3rdparty/luv/src/misc.c new file mode 100644 index 00000000000..64c9e3d5822 --- /dev/null +++ b/3rdparty/luv/src/misc.c @@ -0,0 +1,316 @@ +/* + * Copyright 2014 The Luvit Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "luv.h" +#ifdef _WIN32 +#include <process.h> +#endif + +static int luv_guess_handle(lua_State* L) { + uv_file file = luaL_checkinteger(L, 1); + switch (uv_guess_handle(file)) { +#define XX(uc, lc) case UV_##uc: lua_pushstring(L, #lc); break; + UV_HANDLE_TYPE_MAP(XX) +#undef XX + case UV_FILE: lua_pushstring(L, "file"); break; + default: return 0; + } + return 1; +} + +static int luv_version(lua_State* L) { + lua_pushinteger(L, uv_version()); + return 1; +} + +static int luv_version_string(lua_State* L) { + lua_pushstring(L, uv_version_string()); + return 1; +} + +static int luv_get_process_title(lua_State* L) { + char title[MAX_TITLE_LENGTH]; + int ret = uv_get_process_title(title, MAX_TITLE_LENGTH); + if (ret < 0) return luv_error(L, ret); + lua_pushstring(L, title); + return 1; +} + +static int luv_set_process_title(lua_State* L) { + const char* title = luaL_checkstring(L, 1); + int ret = uv_set_process_title(title); + if (ret < 0) return luv_error(L, ret); + lua_pushinteger(L, ret); + return 1; +} + +static int luv_resident_set_memory(lua_State* L) { + size_t rss; + int ret = uv_resident_set_memory(&rss); + if (ret < 0) return luv_error(L, ret); + lua_pushinteger(L, rss); + return 1; +} + +static int luv_uptime(lua_State* L) { + double uptime; + int ret = uv_uptime(&uptime); + if (ret < 0) return luv_error(L, ret); + lua_pushnumber(L, uptime); + return 1; +} + +static void luv_push_timeval_table(lua_State* L, const uv_timeval_t* t) { + lua_createtable(L, 0, 2); + lua_pushinteger(L, t->tv_sec); + lua_setfield(L, -2, "sec"); + lua_pushinteger(L, t->tv_usec); + lua_setfield(L, -2, "usec"); +} + +static int luv_getrusage(lua_State* L) { + uv_rusage_t rusage; + int ret = uv_getrusage(&rusage); + if (ret < 0) return luv_error(L, ret); + lua_createtable(L, 0, 16); + // user CPU time used + luv_push_timeval_table(L, &rusage.ru_utime); + lua_setfield(L, -2, "utime"); + // system CPU time used + luv_push_timeval_table(L, &rusage.ru_stime); + lua_setfield(L, -2, "stime"); + // maximum resident set size + lua_pushinteger(L, rusage.ru_maxrss); + lua_setfield(L, -2, "maxrss"); + // integral shared memory size + lua_pushinteger(L, rusage.ru_ixrss); + lua_setfield(L, -2, "ixrss"); + // integral unshared data size + lua_pushinteger(L, rusage.ru_idrss); + lua_setfield(L, -2, "idrss"); + // integral unshared stack size + lua_pushinteger(L, rusage.ru_isrss); + lua_setfield(L, -2, "isrss"); + // page reclaims (soft page faults) + lua_pushinteger(L, rusage.ru_minflt); + lua_setfield(L, -2, "minflt"); + // page faults (hard page faults) + lua_pushinteger(L, rusage.ru_majflt); + lua_setfield(L, -2, "majflt"); + // swaps + lua_pushinteger(L, rusage.ru_nswap); + lua_setfield(L, -2, "nswap"); + // block input operations + lua_pushinteger(L, rusage.ru_inblock); + lua_setfield(L, -2, "inblock"); + // block output operations + lua_pushinteger(L, rusage.ru_oublock); + lua_setfield(L, -2, "oublock"); + // IPC messages sent + lua_pushinteger(L, rusage.ru_msgsnd); + lua_setfield(L, -2, "msgsnd"); + // IPC messages received + lua_pushinteger(L, rusage.ru_msgrcv); + lua_setfield(L, -2, "msgrcv"); + // signals received + lua_pushinteger(L, rusage.ru_nsignals); + lua_setfield(L, -2, "nsignals"); + // voluntary context switches + lua_pushinteger(L, rusage.ru_nvcsw); + lua_setfield(L, -2, "nvcsw"); + // involuntary context switches + lua_pushinteger(L, rusage.ru_nivcsw); + lua_setfield(L, -2, "nivcsw"); + return 1; +} + +static int luv_cpu_info(lua_State* L) { + uv_cpu_info_t* cpu_infos; + int count, i; + int ret = uv_cpu_info(&cpu_infos, &count); + if (ret < 0) return luv_error(L, ret); + lua_newtable(L); + + for (i = 0; i < count; i++) { + lua_newtable(L); + lua_pushstring(L, cpu_infos[i].model); + lua_setfield(L, -2, "model"); + lua_pushnumber(L, cpu_infos[i].speed); + lua_setfield(L, -2, "speed"); + lua_newtable(L); + lua_pushnumber(L, cpu_infos[i].cpu_times.user); + lua_setfield(L, -2, "user"); + lua_pushnumber(L, cpu_infos[i].cpu_times.nice); + lua_setfield(L, -2, "nice"); + lua_pushnumber(L, cpu_infos[i].cpu_times.sys); + lua_setfield(L, -2, "sys"); + lua_pushnumber(L, cpu_infos[i].cpu_times.idle); + lua_setfield(L, -2, "idle"); + lua_pushnumber(L, cpu_infos[i].cpu_times.irq); + lua_setfield(L, -2, "irq"); + lua_setfield(L, -2, "times"); + lua_rawseti(L, -2, i + 1); + } + + uv_free_cpu_info(cpu_infos, count); + return 1; +} + +static int luv_interface_addresses(lua_State* L) { + uv_interface_address_t* interfaces; + int count, i; + char ip[INET6_ADDRSTRLEN]; + char netmask[INET6_ADDRSTRLEN]; + + uv_interface_addresses(&interfaces, &count); + + lua_newtable(L); + + for (i = 0; i < count; i++) { + lua_getfield(L, -1, interfaces[i].name); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + lua_newtable(L); + lua_pushvalue(L, -1); + lua_setfield(L, -3, interfaces[i].name); + } + lua_newtable(L); + lua_pushboolean(L, interfaces[i].is_internal); + lua_setfield(L, -2, "internal"); + + lua_pushlstring(L, interfaces[i].phys_addr, sizeof(interfaces[i].phys_addr)); + lua_setfield(L, -2, "mac"); + + if (interfaces[i].address.address4.sin_family == AF_INET) { + uv_ip4_name(&interfaces[i].address.address4, ip, sizeof(ip)); + uv_ip4_name(&interfaces[i].netmask.netmask4, netmask, sizeof(netmask)); + } else if (interfaces[i].address.address4.sin_family == AF_INET6) { + uv_ip6_name(&interfaces[i].address.address6, ip, sizeof(ip)); + uv_ip6_name(&interfaces[i].netmask.netmask6, netmask, sizeof(netmask)); + } else { + strncpy(ip, "<unknown sa family>", INET6_ADDRSTRLEN); + strncpy(netmask, "<unknown sa family>", INET6_ADDRSTRLEN); + } + lua_pushstring(L, ip); + lua_setfield(L, -2, "ip"); + lua_pushstring(L, netmask); + lua_setfield(L, -2, "netmask"); + + lua_pushstring(L, luv_af_num_to_string(interfaces[i].address.address4.sin_family)); + lua_setfield(L, -2, "family"); + lua_rawseti(L, -2, lua_rawlen (L, -2) + 1); + lua_pop(L, 1); + } + uv_free_interface_addresses(interfaces, count); + return 1; +} + +static int luv_loadavg(lua_State* L) { + double avg[3]; + uv_loadavg(avg); + lua_pushnumber(L, avg[0]); + lua_pushnumber(L, avg[1]); + lua_pushnumber(L, avg[2]); + return 3; +} + +static int luv_exepath(lua_State* L) { + size_t size = 2*PATH_MAX; + char exe_path[2*PATH_MAX]; + int ret = uv_exepath(exe_path, &size); + if (ret < 0) return luv_error(L, ret); + lua_pushlstring(L, exe_path, size); + return 1; +} + +static int luv_cwd(lua_State* L) { + size_t size = 2*PATH_MAX; + char path[2*PATH_MAX]; + int ret = uv_cwd(path, &size); + if (ret < 0) return luv_error(L, ret); + lua_pushlstring(L, path, size); + return 1; +} + +static int luv_chdir(lua_State* L) { + int ret = uv_chdir(luaL_checkstring(L, 1)); + if (ret < 0) return luv_error(L, ret); + lua_pushinteger(L, ret); + return 1; +} + +static int luv_os_homedir(lua_State* L) { + size_t size = 2*PATH_MAX; + char homedir[2*PATH_MAX]; + int ret = uv_os_homedir(homedir, &size); + if (ret < 0) return luv_error(L, ret); + lua_pushlstring(L, homedir, size); + return 1; +} + +static int luv_get_total_memory(lua_State* L) { + lua_pushnumber(L, uv_get_total_memory()); + return 1; +} + +static int luv_get_free_memory(lua_State* L) { + lua_pushnumber(L, uv_get_free_memory()); + return 1; +} + +static int luv_hrtime(lua_State* L) { + lua_pushnumber(L, uv_hrtime()); + return 1; +} + +static int luv_getpid(lua_State* L){ + int pid = getpid(); + lua_pushinteger(L, pid); + return 1; +} + +#ifndef _WIN32 +static int luv_getuid(lua_State* L){ + int uid = getuid(); + lua_pushinteger(L, uid); + return 1; +} + +static int luv_getgid(lua_State* L){ + int gid = getgid(); + lua_pushinteger(L, gid); + return 1; +} + +static int luv_setuid(lua_State* L){ + int uid = luaL_checkinteger(L, 1); + int r = setuid(uid); + if (-1 == r) { + luaL_error(L, "Error setting UID"); + } + return 0; +} + +static int luv_setgid(lua_State* L){ + int gid = luaL_checkinteger(L, 1); + int r = setgid(gid); + if (-1 == r) { + luaL_error(L, "Error setting GID"); + } + return 0; +} +#endif |