17 #define CONSTEXPR_SPECIFIER 19 #define CONSTEXPR_SPECIFIER constexpr 29 enum class UVHandleType: std::underlying_type_t<uv_handle_type> {
30 UNKNOWN = UV_UNKNOWN_HANDLE,
33 FS_EVENT = UV_FS_EVENT,
52 struct UVTypeWrapper {
55 constexpr UVTypeWrapper(): value{} {}
56 constexpr UVTypeWrapper(Type val): value{val} {}
58 constexpr
operator Type() const noexcept {
return value; }
60 bool operator==(UVTypeWrapper other)
const noexcept {
61 return value == other.value;
70 bool operator==(UVTypeWrapper<T> lhs, UVTypeWrapper<T> rhs) {
90 using InnerType = std::underlying_type_t<E>;
92 constexpr InnerType toInnerType(E flag)
const noexcept {
return static_cast<InnerType
>(flag); }
95 using Type = InnerType;
104 int _[] = { 0, (flags = flags | V, 0)... };
105 return void(_), flags;
112 constexpr
Flags(E flag) noexcept: flags{toInnerType(flag)} {}
119 constexpr
Flags(Type f): flags{f} {}
126 constexpr
Flags(
const Flags &f) noexcept: flags{f.flags} { }
127 constexpr
Flags(
Flags &&f) noexcept: flags{std::move(f.flags)} { }
129 ~
Flags() noexcept { static_assert(std::is_enum<E>::value,
"!"); }
131 CONSTEXPR_SPECIFIER
Flags & operator=(
const Flags &f) noexcept {
136 CONSTEXPR_SPECIFIER
Flags & operator=(
Flags &&f) noexcept {
137 flags = std::move(f.flags);
173 explicit constexpr
operator bool() const noexcept {
return !(flags == InnerType{}); }
179 constexpr
operator Type() const noexcept {
return flags; }
195 using HandleType = details::UVHandleType;
201 using PidType = details::UVTypeWrapper<uv_pid_t>;
225 Passwd(std::shared_ptr<uv_passwd_t> pwd): passwd{pwd} {}
232 return ((passwd && passwd->username) ? passwd->username :
"");
239 auto uid() const noexcept {
240 return (passwd ? passwd->uid : decltype(uv_passwd_t::uid){});
247 auto gid() const noexcept {
248 return (passwd ? passwd->gid : decltype(uv_passwd_t::gid){});
255 std::string
shell() const noexcept {
256 return ((passwd && passwd->shell) ? passwd->shell :
"");
264 return ((passwd && passwd->homedir) ? passwd->homedir:
"");
271 operator bool() const noexcept {
272 return static_cast<bool>(passwd);
276 std::shared_ptr<uv_passwd_t> passwd;
309 using CPUTime = decltype(uv_cpu_info_t::cpu_times);
339 static constexpr std::size_t DEFAULT_SIZE = 128;
347 struct IpTraits<IPv4> {
348 using Type = sockaddr_in;
349 using AddrFuncType = int(*)(
const char *, int, Type *);
350 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
351 static constexpr AddrFuncType addrFunc = &uv_ip4_addr;
352 static constexpr NameFuncType nameFunc = &uv_ip4_name;
353 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin_port; }
358 struct IpTraits<IPv6> {
359 using Type = sockaddr_in6;
360 using AddrFuncType = int(*)(
const char *, int, Type *);
361 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
362 static constexpr AddrFuncType addrFunc = &uv_ip6_addr;
363 static constexpr NameFuncType nameFunc = &uv_ip6_name;
364 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin6_port; }
369 Addr address(
const typename details::IpTraits<I>::Type *aptr) noexcept {
371 char name[DEFAULT_SIZE];
373 int err = details::IpTraits<I>::nameFunc(aptr, name, DEFAULT_SIZE);
376 addr.
port = ntohs(details::IpTraits<I>::sinPort(aptr));
377 addr.
ip = std::string{name};
384 template<
typename I,
typename F,
typename H>
385 Addr address(F &&f,
const H *handle) noexcept {
386 sockaddr_storage ssto;
387 int len =
sizeof(ssto);
390 int err = std::forward<F>(f)(handle, reinterpret_cast<sockaddr *>(&ssto), &len);
393 typename IpTraits<I>::Type *aptr =
reinterpret_cast<typename IpTraits<I>::Type *
>(&ssto);
394 addr = address<I>(aptr);
401 template<
typename F,
typename... Args>
402 std::string tryRead(F &&f, Args&&... args) noexcept {
403 std::size_t size = DEFAULT_SIZE;
404 char buf[DEFAULT_SIZE];
406 auto err = std::forward<F>(f)(args..., buf, &size);
408 if(UV_ENOBUFS == err) {
409 std::unique_ptr<char[]> data{
new char[size]};
410 err = std::forward<F>(f)(args..., data.get(), &size);
415 }
else if(0 == err) {
416 str.assign(buf, size);
432 using MallocFuncType =
void*(*)(size_t);
433 using ReallocFuncType =
void*(*)(
void*, size_t);
434 using CallocFuncType =
void*(*)(size_t, size_t);
435 using FreeFuncType = void(*)(
void*);
451 return uv_os_getppid();
465 return details::tryRead(&uv_os_homedir);
478 return details::tryRead(&uv_os_tmpdir);
487 static std::string
env(
const std::string &name) noexcept {
488 return details::tryRead(&uv_os_getenv, name.c_str());
498 static bool env(
const std::string &name,
const std::string &value) noexcept {
499 return (0 == (value.empty() ? uv_os_unsetenv(name.c_str()) : uv_os_setenv(name.c_str(), value.c_str())));
507 return details::tryRead(&uv_os_gethostname);
523 auto deleter = [](uv_passwd_t *passwd){
524 uv_os_free_passwd(passwd);
528 std::shared_ptr<uv_passwd_t> ptr{
new uv_passwd_t, std::move(deleter)};
529 uv_os_get_passwd(ptr.get());
542 return HandleType::ASYNC;
544 return HandleType::CHECK;
546 return HandleType::FS_EVENT;
548 return HandleType::FS_POLL;
550 return HandleType::HANDLE;
552 return HandleType::IDLE;
554 return HandleType::PIPE;
556 return HandleType::POLL;
558 return HandleType::PREPARE;
560 return HandleType::PROCESS;
562 return HandleType::STREAM;
564 return HandleType::TCP;
566 return HandleType::TIMER;
568 return HandleType::TTY;
570 return HandleType::UDP;
572 return HandleType::SIGNAL;
574 return HandleType::FILE;
576 return HandleType::UNKNOWN;
600 return guessHandle(category);
611 static std::vector<CPUInfo>
cpuInfo() noexcept {
612 std::vector<CPUInfo> cpuinfos;
614 uv_cpu_info_t *infos;
617 if(0 == uv_cpu_info(&infos, &count)) {
618 std::for_each(infos, infos+count, [&cpuinfos](
const auto &info) {
619 cpuinfos.push_back({ info.model, info.speed, info.cpu_times });
622 uv_free_cpu_info(infos, count);
637 std::vector<InterfaceAddress> interfaces;
639 uv_interface_address_t *ifaces{
nullptr};
642 if(0 == uv_interface_addresses(&ifaces, &count)) {
643 std::for_each(ifaces, ifaces+count, [&interfaces](
const auto &iface) {
646 interfaceAddress.
name = iface.name;
647 std::copy(iface.phys_addr, (iface.phys_addr+6), interfaceAddress.
physical);
648 interfaceAddress.
internal = iface.is_internal == 0 ? false :
true;
650 if(iface.address.address4.sin_family == AF_INET) {
651 interfaceAddress.
address = details::address<IPv4>(&iface.address.address4);
652 interfaceAddress.
netmask = details::address<IPv4>(&iface.netmask.netmask4);
653 }
else if(iface.address.address4.sin_family == AF_INET6) {
654 interfaceAddress.
address = details::address<IPv6>(&iface.address.address6);
655 interfaceAddress.
netmask = details::address<IPv6>(&iface.netmask.netmask6);
658 interfaces.push_back(std::move(interfaceAddress));
661 uv_free_interface_addresses(ifaces, count);
681 return details::tryRead(&uv_if_indextoname, index);
695 return details::tryRead(&uv_if_indextoiid, index);
720 static bool replaceAllocator(MallocFuncType mallocFunc, ReallocFuncType reallocFunc, CallocFuncType callocFunc, FreeFuncType freeFunc) noexcept {
721 return (0 == uv_replace_allocator(mallocFunc, reallocFunc, callocFunc, freeFunc));
729 std::array<double, 3> avg;
730 uv_loadavg(avg.data());
742 return uv_setup_args(argc, argv);
750 std::size_t size = details::DEFAULT_SIZE;
751 char buf[details::DEFAULT_SIZE];
754 if(0 == uv_get_process_title(buf, size)) {
755 str.assign(buf, size);
767 return (0 == uv_set_process_title(title.c_str()));
775 return uv_get_total_memory();
785 if(0 != uv_uptime(&ret)) {
798 auto err = uv_getrusage(&ru);
799 return err ?
RUsage{} : ru;
820 static std::string
path() noexcept {
821 return details::tryRead(&uv_exepath);
828 static std::string
cwd() noexcept {
829 return details::tryRead(&uv_cwd);
837 static bool chdir(
const std::string &dir) noexcept {
838 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 parent process id.
Windows size representation.
details::UVTypeWrapper< uv_os_fd_t > OSFileDescriptor
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 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
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.