WPILibC++ 2027.0.0-alpha-4
Loading...
Searching...
No Matches
util.hpp
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#pragma once
6
7#include <cstring>
8#include <string_view>
9
10#include <uv.h>
11
12#ifdef _WIN32
13#pragma comment(lib, "Ws2_32.lib")
14#endif
15
16namespace wpi::net::uv {
17
18namespace detail {
19template <typename T>
20concept StringAssignable = requires(T a, const char* p) {
21 { a.assign(p, p) }; // NOLINT(readability/braces)
22};
23} // namespace detail
24
25/**
26 * Convert a binary structure containing an IPv4 address to a string.
27 * @param addr Binary structure
28 * @param ip Output string (any type that has `assign(char*, char*)`)
29 * @param port Output port number
30 * @return Error (same as `uv_ip4_name()`).
31 */
32template <detail::StringAssignable T>
33int AddrToName(const sockaddr_in& addr, T* ip, unsigned int* port) {
34 char name[128];
35 int err = uv_ip4_name(&addr, name, 128);
36 if (err == 0) {
37 ip->assign(name, name + std::strlen(name));
38 *port = ntohs(addr.sin_port);
39 } else {
40 ip->assign(name, name);
41 }
42 return err;
43}
44
45/**
46 * Convert a binary structure containing an IPv6 address to a string.
47 * @param addr Binary structure
48 * @param ip Output string (any type that has `assign(char*, char*)`)
49 * @param port Output port number
50 * @return Error (same as `uv_ip6_name()`).
51 */
52template <detail::StringAssignable T>
53int AddrToName(const sockaddr_in6& addr, T* ip, unsigned int* port) {
54 char name[128];
55 int err = uv_ip6_name(&addr, name, 128);
56 if (err == 0) {
57 ip->assign(name, name + std::strlen(name));
58 *port = ntohs(addr.sin6_port);
59 } else {
60 ip->assign(name, name);
61 }
62 return err;
63}
64
65/**
66 * Convert a binary structure containing an IPv4 or IPv6 address to a string.
67 * @param addr Binary structure
68 * @param ip Output string (any type that has `assign(char*, char*)`)
69 * @param port Output port number
70 * @return Error (same as `uv_ip6_name()`).
71 */
72template <detail::StringAssignable T>
73int AddrToName(const sockaddr_storage& addr, T* ip, unsigned int* port) {
74 if (addr.ss_family == AF_INET) {
75 return AddrToName(reinterpret_cast<const sockaddr_in&>(addr), ip, port);
76 }
77 if (addr.ss_family == AF_INET6) {
78 return AddrToName(reinterpret_cast<const sockaddr_in6&>(addr), ip, port);
79 }
80 char name[1] = {'\0'};
81 ip->assign(name, name);
82 return -1;
83}
84
85/**
86 * Convert a binary IPv4 address to a string.
87 * @param addr Binary address
88 * @param ip Output string (any type that has `assign(char*, char*)`)
89 * @return Error (same as `uv_inet_ntop()`).
90 */
91template <detail::StringAssignable T>
92int AddrToName(const in_addr& addr, T* ip) {
93 char name[128];
94 int err = uv_inet_ntop(AF_INET, &addr, name, 128);
95 if (err == 0) {
96 ip->assign(name, name + std::strlen(name));
97 } else {
98 ip->assign(name, name);
99 }
100 return err;
101}
102
103/**
104 * Convert a binary IPv6 address to a string.
105 * @param addr Binary address
106 * @param ip Output string (any type that has `assign(char*, char*)`)
107 * @return Error (same as `uv_inet_ntop()`).
108 */
109template <detail::StringAssignable T>
110int AddrToName(const in6_addr& addr, T* ip) {
111 char name[128];
112 int err = uv_inet_ntop(AF_INET6, &addr, name, 128);
113 if (err == 0) {
114 ip->assign(name, name + std::strlen(name));
115 } else {
116 ip->assign(name, name);
117 }
118 return err;
119}
120
121/**
122 * Convert a string containing an IPv4 address to a binary structure.
123 * @param ip IPv4 address string
124 * @param port Port number
125 * @param addr Output binary structure
126 * @return Error (same as `uv_ip4_addr()`).
127 */
128int NameToAddr(std::string_view ip, unsigned int port, sockaddr_in* addr);
129
130/**
131 * Convert a string containing an IPv6 address to a binary structure.
132 * @param ip IPv6 address string
133 * @param port Port number
134 * @param addr Output binary structure
135 * @return Error (same as `uv_ip6_addr()`).
136 */
137int NameToAddr(std::string_view ip, unsigned int port, sockaddr_in6* addr);
138
139/**
140 * Convert a string containing an IPv4 address to binary format.
141 * @param ip IPv4 address string
142 * @param addr Output binary
143 * @return Error (same as `uv_inet_pton()`).
144 */
145int NameToAddr(std::string_view ip, in_addr* addr);
146
147/**
148 * Convert a string containing an IPv6 address to binary format.
149 * @param ip IPv6 address string
150 * @param addr Output binary
151 * @return Error (same as `uv_inet_pton()`).
152 */
153int NameToAddr(std::string_view ip, in6_addr* addr);
154
155} // namespace wpi::net::uv
@ name
Definition base.h:690
T * p
Definition format.h:758
Converts a string literal into a format string that will be parsed at compile time and converted into...
Definition printf.h:50
Definition Errors.hpp:112
Definition Prepare.hpp:14
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.hpp:33
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)