WPILibC++ 2027.0.0-alpha-2
Loading...
Searching...
No Matches
util.h
Go to the documentation of this file.
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#ifndef WPINET_UV_UTIL_H_
6#define WPINET_UV_UTIL_H_
7
8#include <uv.h>
9
10#include <cstring>
11#include <string_view>
12
13#ifdef _WIN32
14#pragma comment(lib, "Ws2_32.lib")
15#endif
16
17namespace wpi::uv {
18
19namespace detail {
20template <typename T>
21concept StringAssignable = requires(T a, const char* p) {
22 { a.assign(p, p) }; // NOLINT(readability/braces)
23};
24} // namespace detail
25
26/**
27 * Convert a binary structure containing an IPv4 address to a string.
28 * @param addr Binary structure
29 * @param ip Output string (any type that has `assign(char*, char*)`)
30 * @param port Output port number
31 * @return Error (same as `uv_ip4_name()`).
32 */
33template <detail::StringAssignable T>
34int AddrToName(const sockaddr_in& addr, T* ip, unsigned int* port) {
35 char name[128];
36 int err = uv_ip4_name(&addr, name, 128);
37 if (err == 0) {
38 ip->assign(name, name + std::strlen(name));
39 *port = ntohs(addr.sin_port);
40 } else {
41 ip->assign(name, name);
42 }
43 return err;
44}
45
46/**
47 * Convert a binary structure containing an IPv6 address to a string.
48 * @param addr Binary structure
49 * @param ip Output string (any type that has `assign(char*, char*)`)
50 * @param port Output port number
51 * @return Error (same as `uv_ip6_name()`).
52 */
53template <detail::StringAssignable T>
54int AddrToName(const sockaddr_in6& addr, T* ip, unsigned int* port) {
55 char name[128];
56 int err = uv_ip6_name(&addr, name, 128);
57 if (err == 0) {
58 ip->assign(name, name + std::strlen(name));
59 *port = ntohs(addr.sin6_port);
60 } else {
61 ip->assign(name, name);
62 }
63 return err;
64}
65
66/**
67 * Convert a binary structure containing an IPv4 or IPv6 address to a string.
68 * @param addr Binary structure
69 * @param ip Output string (any type that has `assign(char*, char*)`)
70 * @param port Output port number
71 * @return Error (same as `uv_ip6_name()`).
72 */
73template <detail::StringAssignable T>
74int AddrToName(const sockaddr_storage& addr, T* ip, unsigned int* port) {
75 if (addr.ss_family == AF_INET) {
76 return AddrToName(reinterpret_cast<const sockaddr_in&>(addr), ip, port);
77 }
78 if (addr.ss_family == AF_INET6) {
79 return AddrToName(reinterpret_cast<const sockaddr_in6&>(addr), ip, port);
80 }
81 char name[1] = {'\0'};
82 ip->assign(name, name);
83 return -1;
84}
85
86/**
87 * Convert a binary IPv4 address to a string.
88 * @param addr Binary address
89 * @param ip Output string (any type that has `assign(char*, char*)`)
90 * @return Error (same as `uv_inet_ntop()`).
91 */
92template <detail::StringAssignable T>
93int AddrToName(const in_addr& addr, T* ip) {
94 char name[128];
95 int err = uv_inet_ntop(AF_INET, &addr, name, 128);
96 if (err == 0) {
97 ip->assign(name, name + std::strlen(name));
98 } else {
99 ip->assign(name, name);
100 }
101 return err;
102}
103
104/**
105 * Convert a binary IPv6 address to a string.
106 * @param addr Binary address
107 * @param ip Output string (any type that has `assign(char*, char*)`)
108 * @return Error (same as `uv_inet_ntop()`).
109 */
110template <detail::StringAssignable T>
111int AddrToName(const in6_addr& addr, T* ip) {
112 char name[128];
113 int err = uv_inet_ntop(AF_INET6, &addr, name, 128);
114 if (err == 0) {
115 ip->assign(name, name + std::strlen(name));
116 } else {
117 ip->assign(name, name);
118 }
119 return err;
120}
121
122/**
123 * Convert a string containing an IPv4 address to a binary structure.
124 * @param ip IPv4 address string
125 * @param port Port number
126 * @param addr Output binary structure
127 * @return Error (same as `uv_ip4_addr()`).
128 */
129int NameToAddr(std::string_view ip, unsigned int port, sockaddr_in* addr);
130
131/**
132 * Convert a string containing an IPv6 address to a binary structure.
133 * @param ip IPv6 address string
134 * @param port Port number
135 * @param addr Output binary structure
136 * @return Error (same as `uv_ip6_addr()`).
137 */
138int NameToAddr(std::string_view ip, unsigned int port, sockaddr_in6* addr);
139
140/**
141 * Convert a string containing an IPv4 address to binary format.
142 * @param ip IPv4 address string
143 * @param addr Output binary
144 * @return Error (same as `uv_inet_pton()`).
145 */
146int NameToAddr(std::string_view ip, in_addr* addr);
147
148/**
149 * Convert a string containing an IPv6 address to binary format.
150 * @param ip IPv6 address string
151 * @param addr Output binary
152 * @return Error (same as `uv_inet_pton()`).
153 */
154int NameToAddr(std::string_view ip, in6_addr* addr);
155
156} // namespace wpi::uv
157
158#endif // WPINET_UV_UTIL_H_
detail namespace with internal helper functions
Definition input_adapters.h:32
Definition Loop.h:22
int NameToAddr(std::string_view ip, unsigned int port, sockaddr_in *addr)
Convert a string containing an IPv4 address to a binary structure.
int AddrToName(const sockaddr_in &addr, T *ip, unsigned int *port)
Convert a binary structure containing an IPv4 address to a string.
Definition util.h:34
UV_EXTERN int uv_ip4_name(const struct sockaddr_in *src, char *dst, size_t size)
UV_EXTERN int uv_inet_ntop(int af, const void *src, char *dst, size_t size)
UV_EXTERN int uv_ip6_name(const struct sockaddr_in6 *src, char *dst, size_t size)