18 #define CONSTEXPR_SPECIFIER 20 #define CONSTEXPR_SPECIFIER constexpr 30 enum class UVHandleType: std::underlying_type_t<uv_handle_type> {
31 UNKNOWN = UV_UNKNOWN_HANDLE,
34 FS_EVENT = UV_FS_EVENT,
53 struct UVTypeWrapper {
56 constexpr UVTypeWrapper(): value{} {}
57 constexpr UVTypeWrapper(Type val): value{val} {}
59 constexpr
operator Type() const noexcept {
return value; }
61 bool operator==(UVTypeWrapper other)
const noexcept {
62 return value == other.value;
71 bool operator==(UVTypeWrapper<T> lhs, UVTypeWrapper<T> rhs) {
91 using InnerType = std::underlying_type_t<E>;
93 constexpr InnerType toInnerType(E flag)
const noexcept {
return static_cast<InnerType
>(flag); }
96 using Type = InnerType;
105 int _[] = { 0, (flags = flags | V, 0)... };
106 return void(_), flags;
113 constexpr
Flags(E flag) noexcept: flags{toInnerType(flag)} {}
120 constexpr
Flags(Type f): flags{f} {}
127 constexpr
Flags(
const Flags &f) noexcept: flags{f.flags} { }
128 constexpr
Flags(
Flags &&f) noexcept: flags{std::move(f.flags)} { }
130 ~
Flags() noexcept { static_assert(std::is_enum<E>::value,
"!"); }
132 CONSTEXPR_SPECIFIER
Flags & operator=(
const Flags &f) noexcept {
137 CONSTEXPR_SPECIFIER
Flags & operator=(
Flags &&f) noexcept {
138 flags = std::move(f.flags);
174 explicit constexpr
operator bool() const noexcept {
return !(flags == InnerType{}); }
180 constexpr
operator Type() const noexcept {
return flags; }
196 using HandleType = details::UVHandleType;
202 using PidType = details::UVTypeWrapper<uv_pid_t>;
227 Passwd(std::shared_ptr<uv_passwd_t> pwd): passwd{pwd} {}
234 return ((passwd && passwd->username) ? passwd->username :
"");
241 auto uid() const noexcept {
242 return (passwd ? passwd->uid : decltype(uv_passwd_t::uid){});
249 auto gid() const noexcept {
250 return (passwd ? passwd->gid : decltype(uv_passwd_t::gid){});
257 std::string
shell() const noexcept {
258 return ((passwd && passwd->shell) ? passwd->shell :
"");
266 return ((passwd && passwd->homedir) ? passwd->homedir:
"");
273 operator bool() const noexcept {
274 return static_cast<bool>(passwd);
278 std::shared_ptr<uv_passwd_t> passwd;
292 UtsName(std::shared_ptr<uv_utsname_t> utsname): utsname{utsname} {}
299 return utsname ? utsname->sysname :
"";
307 return utsname ? utsname->release :
"";
315 return utsname ? utsname->version :
"";
323 return utsname ? utsname->machine :
"";
327 std::shared_ptr<uv_utsname_t> utsname;
360 using CPUTime = decltype(uv_cpu_info_t::cpu_times);
390 static constexpr std::size_t DEFAULT_SIZE = 128;
398 struct IpTraits<IPv4> {
399 using Type = sockaddr_in;
400 using AddrFuncType = int(*)(
const char *, int, Type *);
401 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
402 static constexpr AddrFuncType addrFunc = &uv_ip4_addr;
403 static constexpr NameFuncType nameFunc = &uv_ip4_name;
404 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin_port; }
409 struct IpTraits<IPv6> {
410 using Type = sockaddr_in6;
411 using AddrFuncType = int(*)(
const char *, int, Type *);
412 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
413 static constexpr AddrFuncType addrFunc = &uv_ip6_addr;
414 static constexpr NameFuncType nameFunc = &uv_ip6_name;
415 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin6_port; }
420 Addr address(
const typename details::IpTraits<I>::Type *aptr) noexcept {
422 char name[DEFAULT_SIZE];
424 int err = details::IpTraits<I>::nameFunc(aptr, name, DEFAULT_SIZE);
427 addr.
port = ntohs(details::IpTraits<I>::sinPort(aptr));
428 addr.
ip = std::string{name};
435 template<
typename I,
typename F,
typename H>
436 Addr address(F &&f,
const H *handle) noexcept {
437 sockaddr_storage ssto;
438 int len =
sizeof(ssto);
441 int err = std::forward<F>(f)(handle, reinterpret_cast<sockaddr *>(&ssto), &len);
444 typename IpTraits<I>::Type *aptr =
reinterpret_cast<typename IpTraits<I>::Type *
>(&ssto);
445 addr = address<I>(aptr);
452 template<
typename F,
typename... Args>
453 std::string tryRead(F &&f, Args&&... args) noexcept {
454 std::size_t size = DEFAULT_SIZE;
455 char buf[DEFAULT_SIZE];
457 auto err = std::forward<F>(f)(args..., buf, &size);
459 if(UV_ENOBUFS == err) {
460 std::unique_ptr<char[]> data{
new char[size]};
461 err = std::forward<F>(f)(args..., data.get(), &size);
466 }
else if(0 == err) {
467 str.assign(buf, size);
483 using MallocFuncType =
void*(*)(size_t);
484 using ReallocFuncType =
void*(*)(
void*, size_t);
485 using CallocFuncType =
void*(*)(size_t, size_t);
486 using FreeFuncType = void(*)(
void*);
502 return uv_os_getpid();
515 return uv_os_getppid();
529 return details::tryRead(&uv_os_homedir);
542 return details::tryRead(&uv_os_tmpdir);
551 static std::string
env(
const std::string &name) noexcept {
552 return details::tryRead(&uv_os_getenv, name.c_str());
562 static bool env(
const std::string &name,
const std::string &value) noexcept {
563 return (0 == (value.empty() ? uv_os_unsetenv(name.c_str()) : uv_os_setenv(name.c_str(), value.c_str())));
571 return details::tryRead(&uv_os_gethostname);
584 auto ptr = std::make_shared<uv_utsname_t>();
585 uv_os_uname(ptr.get());
602 auto deleter = [](uv_passwd_t *passwd){
603 uv_os_free_passwd(passwd);
607 std::shared_ptr<uv_passwd_t> ptr{
new uv_passwd_t, std::move(deleter)};
608 uv_os_get_passwd(ptr.get());
629 if(uv_os_getpriority(pid, &prio)) {
630 prio = UV_PRIORITY_LOW + 1;
652 return 0 == uv_os_setpriority(pid, prio);
663 return HandleType::ASYNC;
665 return HandleType::CHECK;
667 return HandleType::FS_EVENT;
669 return HandleType::FS_POLL;
671 return HandleType::HANDLE;
673 return HandleType::IDLE;
675 return HandleType::PIPE;
677 return HandleType::POLL;
679 return HandleType::PREPARE;
681 return HandleType::PROCESS;
683 return HandleType::STREAM;
685 return HandleType::TCP;
687 return HandleType::TIMER;
689 return HandleType::TTY;
691 return HandleType::UDP;
693 return HandleType::SIGNAL;
695 return HandleType::FILE;
697 return HandleType::UNKNOWN;
721 return guessHandle(category);
732 static std::vector<CPUInfo>
cpuInfo() noexcept {
733 std::vector<CPUInfo> cpuinfos;
735 uv_cpu_info_t *infos;
738 if(0 == uv_cpu_info(&infos, &count)) {
739 std::for_each(infos, infos+count, [&cpuinfos](
const auto &info) {
740 cpuinfos.push_back({ info.model, info.speed, info.cpu_times });
743 uv_free_cpu_info(infos, count);
758 std::vector<InterfaceAddress> interfaces;
760 uv_interface_address_t *ifaces{
nullptr};
763 if(0 == uv_interface_addresses(&ifaces, &count)) {
764 std::for_each(ifaces, ifaces+count, [&interfaces](
const auto &iface) {
767 interfaceAddress.
name = iface.name;
768 std::copy(iface.phys_addr, (iface.phys_addr+6), interfaceAddress.
physical);
769 interfaceAddress.
internal = iface.is_internal == 0 ? false :
true;
771 if(iface.address.address4.sin_family == AF_INET) {
772 interfaceAddress.
address = details::address<IPv4>(&iface.address.address4);
773 interfaceAddress.
netmask = details::address<IPv4>(&iface.netmask.netmask4);
774 }
else if(iface.address.address4.sin_family == AF_INET6) {
775 interfaceAddress.
address = details::address<IPv6>(&iface.address.address6);
776 interfaceAddress.
netmask = details::address<IPv6>(&iface.netmask.netmask6);
779 interfaces.push_back(std::move(interfaceAddress));
782 uv_free_interface_addresses(ifaces, count);
802 return details::tryRead(&uv_if_indextoname, index);
816 return details::tryRead(&uv_if_indextoiid, index);
842 static bool replaceAllocator(MallocFuncType mallocFunc, ReallocFuncType reallocFunc, CallocFuncType callocFunc, FreeFuncType freeFunc) noexcept {
843 return (0 == uv_replace_allocator(mallocFunc, reallocFunc, callocFunc, freeFunc));
851 std::array<double, 3> avg;
852 uv_loadavg(avg.data());
864 return uv_setup_args(argc, argv);
872 std::size_t size = details::DEFAULT_SIZE;
873 char buf[details::DEFAULT_SIZE];
876 if(0 == uv_get_process_title(buf, size)) {
877 str.assign(buf, size);
889 return (0 == uv_set_process_title(title.c_str()));
897 return uv_get_total_memory();
912 return uv_get_constrained_memory();
922 if(0 != uv_uptime(&ret)) {
935 auto err = uv_getrusage(&ru);
936 return err ?
RUsage{} : ru;
957 static std::string
path() noexcept {
958 return details::tryRead(&uv_exepath);
965 static std::string
cwd() noexcept {
966 return details::tryRead(&uv_cwd);
974 static bool chdir(
const std::string &dir) noexcept {
975 return (0 == uv_chdir(dir.data()));
985 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.
static CONSTEXPR_SPECIFIER Flags< E > from()
Utility factory method to pack a set of values all at once.
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 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.