22 enum class UVHandleType: std::underlying_type_t<uv_handle_type> {
23 UNKNOWN = UV_UNKNOWN_HANDLE,
26 FS_EVENT = UV_FS_EVENT,
45 struct UVTypeWrapper {
48 constexpr UVTypeWrapper(): value{} {}
49 constexpr UVTypeWrapper(Type val): value{val} {}
51 constexpr
operator Type() const noexcept {
return value; }
53 bool operator==(UVTypeWrapper other)
const noexcept {
54 return value == other.value;
63 bool operator==(UVTypeWrapper<T> lhs, UVTypeWrapper<T> rhs) {
83 using InnerType = std::underlying_type_t<E>;
85 constexpr InnerType toInnerType(E flag)
const noexcept {
return static_cast<InnerType
>(flag); }
88 using Type = InnerType;
103 constexpr
Flags(E flag) noexcept: flags{toInnerType(flag)} {}
110 constexpr
Flags(Type f): flags{f} {}
117 constexpr
Flags(
const Flags &f) noexcept: flags{f.flags} { }
118 constexpr
Flags(
Flags &&f) noexcept: flags{std::move(f.flags)} { }
120 ~
Flags() noexcept { static_assert(std::is_enum_v<E>); }
122 constexpr
Flags & operator=(
const Flags &f) noexcept {
127 constexpr
Flags & operator=(
Flags &&f) noexcept {
128 flags = std::move(f.flags);
164 explicit constexpr
operator bool() const noexcept {
return !(flags == InnerType{}); }
170 constexpr
operator Type() const noexcept {
return flags; }
186 using HandleType = details::UVHandleType;
192 using PidType = details::UVTypeWrapper<uv_pid_t>;
218 Passwd(std::shared_ptr<uv_passwd_t> pwd): passwd{pwd} {}
225 return ((passwd && passwd->username) ? passwd->username :
"");
232 auto uid() const noexcept {
233 return (passwd ? passwd->uid : decltype(uv_passwd_t::uid){});
240 auto gid() const noexcept {
241 return (passwd ? passwd->gid : decltype(uv_passwd_t::gid){});
248 std::string
shell() const noexcept {
249 return ((passwd && passwd->shell) ? passwd->shell :
"");
257 return ((passwd && passwd->homedir) ? passwd->homedir:
"");
264 operator bool() const noexcept {
265 return static_cast<bool>(passwd);
269 std::shared_ptr<uv_passwd_t> passwd;
283 UtsName(std::shared_ptr<uv_utsname_t> utsname): utsname{utsname} {}
290 return utsname ? utsname->sysname :
"";
298 return utsname ? utsname->release :
"";
306 return utsname ? utsname->version :
"";
314 return utsname ? utsname->machine :
"";
318 std::shared_ptr<uv_utsname_t> utsname;
351 using CPUTime = decltype(uv_cpu_info_t::cpu_times);
381 static constexpr std::size_t DEFAULT_SIZE = 128;
389 struct IpTraits<IPv4> {
390 using Type = sockaddr_in;
391 using AddrFuncType = int(*)(
const char *, int, Type *);
392 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
393 static constexpr AddrFuncType addrFunc = &uv_ip4_addr;
394 static constexpr NameFuncType nameFunc = &uv_ip4_name;
395 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin_port; }
400 struct IpTraits<IPv6> {
401 using Type = sockaddr_in6;
402 using AddrFuncType = int(*)(
const char *, int, Type *);
403 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
404 static constexpr AddrFuncType addrFunc = &uv_ip6_addr;
405 static constexpr NameFuncType nameFunc = &uv_ip6_name;
406 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin6_port; }
411 Addr address(
const typename details::IpTraits<I>::Type *aptr) noexcept {
413 char name[DEFAULT_SIZE];
415 int err = details::IpTraits<I>::nameFunc(aptr, name, DEFAULT_SIZE);
418 addr.
port = ntohs(details::IpTraits<I>::sinPort(aptr));
419 addr.
ip = std::string{name};
426 template<
typename I,
typename F,
typename H>
427 Addr address(F &&f,
const H *handle) noexcept {
428 sockaddr_storage ssto;
429 int len =
sizeof(ssto);
432 int err = std::forward<F>(f)(handle, reinterpret_cast<sockaddr *>(&ssto), &len);
435 typename IpTraits<I>::Type *aptr =
reinterpret_cast<typename IpTraits<I>::Type *
>(&ssto);
436 addr = address<I>(aptr);
443 template<
typename F,
typename... Args>
444 std::string tryRead(F &&f, Args&&... args) noexcept {
445 std::size_t size = DEFAULT_SIZE;
446 char buf[DEFAULT_SIZE];
448 auto err = std::forward<F>(f)(args..., buf, &size);
450 if(UV_ENOBUFS == err) {
451 std::unique_ptr<char[]> data{
new char[size]};
452 err = std::forward<F>(f)(args..., data.get(), &size);
457 }
else if(0 == err) {
458 str.assign(buf, size);
474 using MallocFuncType =
void*(*)(size_t);
475 using ReallocFuncType =
void*(*)(
void*, size_t);
476 using CallocFuncType =
void*(*)(size_t, size_t);
477 using FreeFuncType = void(*)(
void*);
493 return uv_os_getpid();
506 return uv_os_getppid();
520 return details::tryRead(&uv_os_homedir);
533 return details::tryRead(&uv_os_tmpdir);
542 static std::string
env(
const std::string &name) noexcept {
543 return details::tryRead(&uv_os_getenv, name.c_str());
553 static bool env(
const std::string &name,
const std::string &value) noexcept {
554 return (0 == (value.empty() ? uv_os_unsetenv(name.c_str()) : uv_os_setenv(name.c_str(), value.c_str())));
562 return details::tryRead(&uv_os_gethostname);
575 auto ptr = std::make_shared<uv_utsname_t>();
576 uv_os_uname(ptr.get());
593 auto deleter = [](uv_passwd_t *passwd){
594 uv_os_free_passwd(passwd);
598 std::shared_ptr<uv_passwd_t> ptr{
new uv_passwd_t, std::move(deleter)};
599 uv_os_get_passwd(ptr.get());
620 if(uv_os_getpriority(pid, &prio)) {
621 prio = UV_PRIORITY_LOW + 1;
643 return 0 == uv_os_setpriority(pid, prio);
654 return HandleType::ASYNC;
656 return HandleType::CHECK;
658 return HandleType::FS_EVENT;
660 return HandleType::FS_POLL;
662 return HandleType::HANDLE;
664 return HandleType::IDLE;
666 return HandleType::PIPE;
668 return HandleType::POLL;
670 return HandleType::PREPARE;
672 return HandleType::PROCESS;
674 return HandleType::STREAM;
676 return HandleType::TCP;
678 return HandleType::TIMER;
680 return HandleType::TTY;
682 return HandleType::UDP;
684 return HandleType::SIGNAL;
686 return HandleType::FILE;
688 return HandleType::UNKNOWN;
712 return guessHandle(category);
723 static std::vector<CPUInfo>
cpuInfo() noexcept {
724 std::vector<CPUInfo> cpuinfos;
726 uv_cpu_info_t *infos;
729 if(0 == uv_cpu_info(&infos, &count)) {
730 std::for_each(infos, infos+count, [&cpuinfos](
const auto &info) {
731 cpuinfos.push_back({ info.model, info.speed, info.cpu_times });
734 uv_free_cpu_info(infos, count);
749 std::vector<InterfaceAddress> interfaces;
751 uv_interface_address_t *ifaces{
nullptr};
754 if(0 == uv_interface_addresses(&ifaces, &count)) {
755 std::for_each(ifaces, ifaces+count, [&interfaces](
const auto &iface) {
758 interfaceAddress.
name = iface.name;
759 std::copy(iface.phys_addr, (iface.phys_addr+6), interfaceAddress.
physical);
760 interfaceAddress.
internal = iface.is_internal == 0 ? false :
true;
762 if(iface.address.address4.sin_family == AF_INET) {
763 interfaceAddress.
address = details::address<IPv4>(&iface.address.address4);
764 interfaceAddress.
netmask = details::address<IPv4>(&iface.netmask.netmask4);
765 }
else if(iface.address.address4.sin_family == AF_INET6) {
766 interfaceAddress.
address = details::address<IPv6>(&iface.address.address6);
767 interfaceAddress.
netmask = details::address<IPv6>(&iface.netmask.netmask6);
770 interfaces.push_back(std::move(interfaceAddress));
773 uv_free_interface_addresses(ifaces, count);
793 return details::tryRead(&uv_if_indextoname, index);
807 return details::tryRead(&uv_if_indextoiid, index);
833 static bool replaceAllocator(MallocFuncType mallocFunc, ReallocFuncType reallocFunc, CallocFuncType callocFunc, FreeFuncType freeFunc) noexcept {
834 return (0 == uv_replace_allocator(mallocFunc, reallocFunc, callocFunc, freeFunc));
842 std::array<double, 3> avg;
843 uv_loadavg(avg.data());
855 return uv_setup_args(argc, argv);
863 std::size_t size = details::DEFAULT_SIZE;
864 char buf[details::DEFAULT_SIZE];
867 if(0 == uv_get_process_title(buf, size)) {
868 str.assign(buf, size);
880 return (0 == uv_set_process_title(title.c_str()));
888 return uv_get_total_memory();
903 return uv_get_constrained_memory();
913 if(0 != uv_uptime(&ret)) {
926 auto err = uv_getrusage(&ru);
927 return err ?
RUsage{} : ru;
948 static std::string
path() noexcept {
949 return details::tryRead(&uv_exepath);
956 static std::string
cwd() noexcept {
957 return details::tryRead(&uv_cwd);
965 static bool chdir(
const std::string &dir) noexcept {
966 return (0 == uv_chdir(dir.data()));
976 uv_gettimeofday(&ret);
constexpr FileHandle StdERR
auto gid() const noexcept
Gets the gid.
std::string version() const noexcept
Gets the operating system version.
static Passwd passwd() noexcept
Gets a subset of the password file entry.
static HandleType guessHandle(FileHandle file) noexcept
Gets the type of the stream to be used with the given descriptor.
static std::string hostname() noexcept
Returns the hostname.
static std::string env(const std::string &name) noexcept
Retrieves an environment variable.
static std::vector< InterfaceAddress > interfaceAddresses() noexcept
Gets a set of descriptors of all the available interfaces.
std::string release() const noexcept
Gets the operating system release (like "2.6.28").
static double uptime() noexcept
Gets the current system uptime.
details::UVTypeWrapper< uv_file > FileHandle
static std::string tmpdir() noexcept
Gets the temp directory.
static std::string homedir() noexcept
Gets the current user's home directory.
static PidType pid() noexcept
Returns the current process id.
Windows size representation.
details::UVTypeWrapper< uv_os_fd_t > OSFileDescriptor
std::string machine() const noexcept
Gets the hardware identifier.
static int osPriority(PidType pid)
Retrieves the scheduling priority of a process.
constexpr FileHandle StdIN
static char ** setupArgs(int argc, char **argv)
Store the program arguments.
std::string username() const noexcept
Gets the username.
constexpr FileHandle StdOUT
Utility class to handle flags.
details::UVTypeWrapper< uv_pid_t > PidType
constexpr Flags operator &(const Flags &f) const noexcept
And operator.
constexpr Flags(E flag) noexcept
Constructs a Flags object from a value of the enum E.
constexpr Flags operator|(const Flags &f) const noexcept
Or operator.
static bool osPriority(PidType pid, int prio)
Sets the scheduling priority of a process.
static uint64_t hrtime() noexcept
Gets the current high-resolution real time.
static TimeVal64 timeOfDay()
Cross-platform implementation of gettimeofday
static UtsName uname() noexcept
Gets name and information about the current kernel.
static bool replaceAllocator(MallocFuncType mallocFunc, ReallocFuncType reallocFunc, CallocFuncType callocFunc, FreeFuncType freeFunc) noexcept
Override the use of some standard library’s functions.
details::UVTypeWrapper< uv_handle_type > HandleCategory
static bool env(const std::string &name, const std::string &value) noexcept
Creates, updates or deletes an environment variable.
static RUsage rusage() noexcept
Gets the resource usage measures for the current process.
static uint64_t totalMemory() noexcept
Gets memory information (in bytes).
auto uid() const noexcept
Gets the uid.
std::string shell() const noexcept
Gets the shell.
static std::string indexToName(unsigned int index) noexcept
IPv6-capable implementation of if_indextoname.
static std::string cwd() noexcept
Gets the current working directory.
static std::string path() noexcept
Gets the executable path.
details::UVTypeWrapper< uv_os_sock_t > OSSocketHandle
static PidType parent() noexcept
Returns the parent process id.
constexpr Flags()
Constructs an uninitialized Flags object.
static HandleType guessHandle(HandleCategory category) noexcept
Gets the type of the handle given a category.
constexpr Flags(Type f)
Constructs a Flags object from an instance of the underlying type of the enum E.
constexpr Flags operator|(E flag) const noexcept
Or operator.
std::string sysname() const noexcept
Gets the operating system name (like "Linux").
static std::vector< CPUInfo > cpuInfo() noexcept
Gets information about the CPUs on the system.
static bool chdir(const std::string &dir) noexcept
Changes the current working directory.
constexpr Flags operator &(E flag) const noexcept
And operator.
static std::array< double, 3 > loadAverage() noexcept
Gets the load average.
static constexpr Flags< E > from()
Utility factory method to pack a set of values all at once.
static bool processTitle(std::string title)
Sets the current process title.
static std::string processTitle()
Gets the title of the current process.
static uint64_t constrainedMemory() noexcept
Gets the amount of memory available to the process (in bytes).
std::string homedir() const noexcept
Gets the homedir.
static std::string indexToIid(unsigned int index) noexcept
Retrieves a network interface identifier.