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>;
226 Passwd(std::shared_ptr<uv_passwd_t> pwd): passwd{pwd} {}
233 return ((passwd && passwd->username) ? passwd->username :
"");
240 auto uid() const noexcept {
241 return (passwd ? passwd->uid : decltype(uv_passwd_t::uid){});
248 auto gid() const noexcept {
249 return (passwd ? passwd->gid : decltype(uv_passwd_t::gid){});
256 std::string
shell() const noexcept {
257 return ((passwd && passwd->shell) ? passwd->shell :
"");
265 return ((passwd && passwd->homedir) ? passwd->homedir:
"");
272 operator bool() const noexcept {
273 return static_cast<bool>(passwd);
277 std::shared_ptr<uv_passwd_t> passwd;
310 using CPUTime = decltype(uv_cpu_info_t::cpu_times);
340 static constexpr std::size_t DEFAULT_SIZE = 128;
348 struct IpTraits<IPv4> {
349 using Type = sockaddr_in;
350 using AddrFuncType = int(*)(
const char *, int, Type *);
351 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
352 static constexpr AddrFuncType addrFunc = &uv_ip4_addr;
353 static constexpr NameFuncType nameFunc = &uv_ip4_name;
354 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin_port; }
359 struct IpTraits<IPv6> {
360 using Type = sockaddr_in6;
361 using AddrFuncType = int(*)(
const char *, int, Type *);
362 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
363 static constexpr AddrFuncType addrFunc = &uv_ip6_addr;
364 static constexpr NameFuncType nameFunc = &uv_ip6_name;
365 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin6_port; }
370 Addr address(
const typename details::IpTraits<I>::Type *aptr) noexcept {
372 char name[DEFAULT_SIZE];
374 int err = details::IpTraits<I>::nameFunc(aptr, name, DEFAULT_SIZE);
377 addr.
port = ntohs(details::IpTraits<I>::sinPort(aptr));
378 addr.
ip = std::string{name};
385 template<
typename I,
typename F,
typename H>
386 Addr address(F &&f,
const H *handle) noexcept {
387 sockaddr_storage ssto;
388 int len =
sizeof(ssto);
391 int err = std::forward<F>(f)(handle, reinterpret_cast<sockaddr *>(&ssto), &len);
394 typename IpTraits<I>::Type *aptr =
reinterpret_cast<typename IpTraits<I>::Type *
>(&ssto);
395 addr = address<I>(aptr);
402 template<
typename F,
typename... Args>
403 std::string tryRead(F &&f, Args&&... args) noexcept {
404 std::size_t size = DEFAULT_SIZE;
405 char buf[DEFAULT_SIZE];
407 auto err = std::forward<F>(f)(args..., buf, &size);
409 if(UV_ENOBUFS == err) {
410 std::unique_ptr<char[]> data{
new char[size]};
411 err = std::forward<F>(f)(args..., data.get(), &size);
416 }
else if(0 == err) {
417 str.assign(buf, size);
433 using MallocFuncType =
void*(*)(size_t);
434 using ReallocFuncType =
void*(*)(
void*, size_t);
435 using CallocFuncType =
void*(*)(size_t, size_t);
436 using FreeFuncType = void(*)(
void*);
452 return uv_os_getpid();
465 return uv_os_getppid();
479 return details::tryRead(&uv_os_homedir);
492 return details::tryRead(&uv_os_tmpdir);
501 static std::string
env(
const std::string &name) noexcept {
502 return details::tryRead(&uv_os_getenv, name.c_str());
512 static bool env(
const std::string &name,
const std::string &value) noexcept {
513 return (0 == (value.empty() ? uv_os_unsetenv(name.c_str()) : uv_os_setenv(name.c_str(), value.c_str())));
521 return details::tryRead(&uv_os_gethostname);
537 auto deleter = [](uv_passwd_t *passwd){
538 uv_os_free_passwd(passwd);
542 std::shared_ptr<uv_passwd_t> ptr{
new uv_passwd_t, std::move(deleter)};
543 uv_os_get_passwd(ptr.get());
564 if(uv_os_getpriority(pid, &prio)) {
565 prio = UV_PRIORITY_LOW + 1;
587 return 0 == uv_os_setpriority(pid, prio);
598 return HandleType::ASYNC;
600 return HandleType::CHECK;
602 return HandleType::FS_EVENT;
604 return HandleType::FS_POLL;
606 return HandleType::HANDLE;
608 return HandleType::IDLE;
610 return HandleType::PIPE;
612 return HandleType::POLL;
614 return HandleType::PREPARE;
616 return HandleType::PROCESS;
618 return HandleType::STREAM;
620 return HandleType::TCP;
622 return HandleType::TIMER;
624 return HandleType::TTY;
626 return HandleType::UDP;
628 return HandleType::SIGNAL;
630 return HandleType::FILE;
632 return HandleType::UNKNOWN;
656 return guessHandle(category);
667 static std::vector<CPUInfo>
cpuInfo() noexcept {
668 std::vector<CPUInfo> cpuinfos;
670 uv_cpu_info_t *infos;
673 if(0 == uv_cpu_info(&infos, &count)) {
674 std::for_each(infos, infos+count, [&cpuinfos](
const auto &info) {
675 cpuinfos.push_back({ info.model, info.speed, info.cpu_times });
678 uv_free_cpu_info(infos, count);
693 std::vector<InterfaceAddress> interfaces;
695 uv_interface_address_t *ifaces{
nullptr};
698 if(0 == uv_interface_addresses(&ifaces, &count)) {
699 std::for_each(ifaces, ifaces+count, [&interfaces](
const auto &iface) {
702 interfaceAddress.
name = iface.name;
703 std::copy(iface.phys_addr, (iface.phys_addr+6), interfaceAddress.
physical);
704 interfaceAddress.
internal = iface.is_internal == 0 ? false :
true;
706 if(iface.address.address4.sin_family == AF_INET) {
707 interfaceAddress.
address = details::address<IPv4>(&iface.address.address4);
708 interfaceAddress.
netmask = details::address<IPv4>(&iface.netmask.netmask4);
709 }
else if(iface.address.address4.sin_family == AF_INET6) {
710 interfaceAddress.
address = details::address<IPv6>(&iface.address.address6);
711 interfaceAddress.
netmask = details::address<IPv6>(&iface.netmask.netmask6);
714 interfaces.push_back(std::move(interfaceAddress));
717 uv_free_interface_addresses(ifaces, count);
737 return details::tryRead(&uv_if_indextoname, index);
751 return details::tryRead(&uv_if_indextoiid, index);
777 static bool replaceAllocator(MallocFuncType mallocFunc, ReallocFuncType reallocFunc, CallocFuncType callocFunc, FreeFuncType freeFunc) noexcept {
778 return (0 == uv_replace_allocator(mallocFunc, reallocFunc, callocFunc, freeFunc));
786 std::array<double, 3> avg;
787 uv_loadavg(avg.data());
799 return uv_setup_args(argc, argv);
807 std::size_t size = details::DEFAULT_SIZE;
808 char buf[details::DEFAULT_SIZE];
811 if(0 == uv_get_process_title(buf, size)) {
812 str.assign(buf, size);
824 return (0 == uv_set_process_title(title.c_str()));
832 return uv_get_total_memory();
842 if(0 != uv_uptime(&ret)) {
855 auto err = uv_getrusage(&ru);
856 return err ?
RUsage{} : ru;
877 static std::string
path() noexcept {
878 return details::tryRead(&uv_exepath);
885 static std::string
cwd() noexcept {
886 return details::tryRead(&uv_cwd);
894 static bool chdir(
const std::string &dir) noexcept {
895 return (0 == uv_chdir(dir.data()));
constexpr FileHandle StdERR
auto gid() const noexcept
Gets the gid.
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.
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
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 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.
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.
std::string homedir() const noexcept
Gets the homedir.
static std::string indexToIid(unsigned int index) noexcept
Retrieves a network interface identifier.