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;
291 UName(std::shared_ptr<uv_utsname_t> utsname): utsname{utsname} {}
298 return utsname ? utsname->sysname :
"";
306 return utsname ? utsname->release :
"";
314 return utsname ? utsname->version :
"";
322 return utsname ? utsname->machine :
"";
326 std::shared_ptr<uv_utsname_t> utsname;
359 using CPUTime = decltype(uv_cpu_info_t::cpu_times);
389 static constexpr std::size_t DEFAULT_SIZE = 128;
397 struct IpTraits<IPv4> {
398 using Type = sockaddr_in;
399 using AddrFuncType = int(*)(
const char *, int, Type *);
400 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
401 static constexpr AddrFuncType addrFunc = &uv_ip4_addr;
402 static constexpr NameFuncType nameFunc = &uv_ip4_name;
403 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin_port; }
408 struct IpTraits<IPv6> {
409 using Type = sockaddr_in6;
410 using AddrFuncType = int(*)(
const char *, int, Type *);
411 using NameFuncType = int(*)(
const Type *,
char *, std::size_t);
412 static constexpr AddrFuncType addrFunc = &uv_ip6_addr;
413 static constexpr NameFuncType nameFunc = &uv_ip6_name;
414 static constexpr
auto sinPort(
const Type *addr) {
return addr->sin6_port; }
419 Addr address(
const typename details::IpTraits<I>::Type *aptr) noexcept {
421 char name[DEFAULT_SIZE];
423 int err = details::IpTraits<I>::nameFunc(aptr, name, DEFAULT_SIZE);
426 addr.
port = ntohs(details::IpTraits<I>::sinPort(aptr));
427 addr.
ip = std::string{name};
434 template<
typename I,
typename F,
typename H>
435 Addr address(F &&f,
const H *handle) noexcept {
436 sockaddr_storage ssto;
437 int len =
sizeof(ssto);
440 int err = std::forward<F>(f)(handle, reinterpret_cast<sockaddr *>(&ssto), &len);
443 typename IpTraits<I>::Type *aptr =
reinterpret_cast<typename IpTraits<I>::Type *
>(&ssto);
444 addr = address<I>(aptr);
451 template<
typename F,
typename... Args>
452 std::string tryRead(F &&f, Args&&... args) noexcept {
453 std::size_t size = DEFAULT_SIZE;
454 char buf[DEFAULT_SIZE];
456 auto err = std::forward<F>(f)(args..., buf, &size);
458 if(UV_ENOBUFS == err) {
459 std::unique_ptr<char[]> data{
new char[size]};
460 err = std::forward<F>(f)(args..., data.get(), &size);
465 }
else if(0 == err) {
466 str.assign(buf, size);
482 using MallocFuncType =
void*(*)(size_t);
483 using ReallocFuncType =
void*(*)(
void*, size_t);
484 using CallocFuncType =
void*(*)(size_t, size_t);
485 using FreeFuncType = void(*)(
void*);
501 return uv_os_getpid();
514 return uv_os_getppid();
528 return details::tryRead(&uv_os_homedir);
541 return details::tryRead(&uv_os_tmpdir);
550 static std::string
env(
const std::string &name) noexcept {
551 return details::tryRead(&uv_os_getenv, name.c_str());
561 static bool env(
const std::string &name,
const std::string &value) noexcept {
562 return (0 == (value.empty() ? uv_os_unsetenv(name.c_str()) : uv_os_setenv(name.c_str(), value.c_str())));
570 return details::tryRead(&uv_os_gethostname);
583 auto ptr = std::make_shared<uv_utsname_t>();
584 uv_os_uname(ptr.get());
601 auto deleter = [](uv_passwd_t *passwd){
602 uv_os_free_passwd(passwd);
606 std::shared_ptr<uv_passwd_t> ptr{
new uv_passwd_t, std::move(deleter)};
607 uv_os_get_passwd(ptr.get());
628 if(uv_os_getpriority(pid, &prio)) {
629 prio = UV_PRIORITY_LOW + 1;
651 return 0 == uv_os_setpriority(pid, prio);
662 return HandleType::ASYNC;
664 return HandleType::CHECK;
666 return HandleType::FS_EVENT;
668 return HandleType::FS_POLL;
670 return HandleType::HANDLE;
672 return HandleType::IDLE;
674 return HandleType::PIPE;
676 return HandleType::POLL;
678 return HandleType::PREPARE;
680 return HandleType::PROCESS;
682 return HandleType::STREAM;
684 return HandleType::TCP;
686 return HandleType::TIMER;
688 return HandleType::TTY;
690 return HandleType::UDP;
692 return HandleType::SIGNAL;
694 return HandleType::FILE;
696 return HandleType::UNKNOWN;
720 return guessHandle(category);
731 static std::vector<CPUInfo>
cpuInfo() noexcept {
732 std::vector<CPUInfo> cpuinfos;
734 uv_cpu_info_t *infos;
737 if(0 == uv_cpu_info(&infos, &count)) {
738 std::for_each(infos, infos+count, [&cpuinfos](
const auto &info) {
739 cpuinfos.push_back({ info.model, info.speed, info.cpu_times });
742 uv_free_cpu_info(infos, count);
757 std::vector<InterfaceAddress> interfaces;
759 uv_interface_address_t *ifaces{
nullptr};
762 if(0 == uv_interface_addresses(&ifaces, &count)) {
763 std::for_each(ifaces, ifaces+count, [&interfaces](
const auto &iface) {
766 interfaceAddress.
name = iface.name;
767 std::copy(iface.phys_addr, (iface.phys_addr+6), interfaceAddress.
physical);
768 interfaceAddress.
internal = iface.is_internal == 0 ? false :
true;
770 if(iface.address.address4.sin_family == AF_INET) {
771 interfaceAddress.
address = details::address<IPv4>(&iface.address.address4);
772 interfaceAddress.
netmask = details::address<IPv4>(&iface.netmask.netmask4);
773 }
else if(iface.address.address4.sin_family == AF_INET6) {
774 interfaceAddress.
address = details::address<IPv6>(&iface.address.address6);
775 interfaceAddress.
netmask = details::address<IPv6>(&iface.netmask.netmask6);
778 interfaces.push_back(std::move(interfaceAddress));
781 uv_free_interface_addresses(ifaces, count);
801 return details::tryRead(&uv_if_indextoname, index);
815 return details::tryRead(&uv_if_indextoiid, index);
841 static bool replaceAllocator(MallocFuncType mallocFunc, ReallocFuncType reallocFunc, CallocFuncType callocFunc, FreeFuncType freeFunc) noexcept {
842 return (0 == uv_replace_allocator(mallocFunc, reallocFunc, callocFunc, freeFunc));
850 std::array<double, 3> avg;
851 uv_loadavg(avg.data());
863 return uv_setup_args(argc, argv);
871 std::size_t size = details::DEFAULT_SIZE;
872 char buf[details::DEFAULT_SIZE];
875 if(0 == uv_get_process_title(buf, size)) {
876 str.assign(buf, size);
888 return (0 == uv_set_process_title(title.c_str()));
896 return uv_get_total_memory();
906 if(0 != uv_uptime(&ret)) {
919 auto err = uv_getrusage(&ru);
920 return err ?
RUsage{} : ru;
941 static std::string
path() noexcept {
942 return details::tryRead(&uv_exepath);
949 static std::string
cwd() noexcept {
950 return details::tryRead(&uv_cwd);
958 static bool chdir(
const std::string &dir) noexcept {
959 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.
static UName uname() noexcept
Gets name and information about the current kernel.
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.
std::string sysname() const noexcept
Gets the operating system name (like "Linux").
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.
std::string machine() const noexcept
Gets the hardware identifier.
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.
std::string release() const noexcept
Gets the operating system release (like "2.6.28").
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.
std::string version() const noexcept
Gets the operating system version.
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.