Go to the documentation of this file.
26 #ifdef GRPC_HAVE_UNIX_SOCKET
31 #include "absl/strings/str_cat.h"
32 #include "absl/strings/strip.h"
44 #ifdef GRPC_HAVE_UNIX_SOCKET
48 if (uri.
scheme() !=
"unix") {
65 if (uri.
scheme() !=
"unix-abstract") {
84 memset(resolved_addr, 0,
sizeof(*resolved_addr));
85 struct sockaddr_un* un =
86 reinterpret_cast<struct sockaddr_un*
>(resolved_addr->
addr);
87 const size_t maxlen =
sizeof(un->sun_path) - 1;
88 if (
path.size() > maxlen) {
90 "Path name should not have more than ", maxlen,
" characters"));
92 un->sun_family = AF_UNIX;
93 path.copy(un->sun_path,
path.size());
94 un->sun_path[
path.size()] =
'\0';
95 resolved_addr->
len =
static_cast<socklen_t
>(
sizeof(*un));
101 memset(resolved_addr, 0,
sizeof(*resolved_addr));
102 struct sockaddr_un* un =
103 reinterpret_cast<struct sockaddr_un*
>(resolved_addr->
addr);
104 const size_t maxlen =
sizeof(un->sun_path) - 1;
105 if (
path.size() > maxlen) {
107 "Path name should not have more than ", maxlen,
" characters"));
109 un->sun_family = AF_UNIX;
110 un->sun_path[0] =
'\0';
111 path.copy(un->sun_path + 1,
path.size());
113 static_cast<socklen_t
>(
sizeof(un->sun_family) +
path.size() + 1);
148 bool success =
false;
161 addr->len =
static_cast<socklen_t
>(
sizeof(grpc_sockaddr_in));
162 grpc_sockaddr_in*
in =
reinterpret_cast<grpc_sockaddr_in*
>(
addr->addr);
163 in->sin_family = GRPC_AF_INET;
176 if (sscanf(
port.c_str(),
"%d", &port_num) != 1 || port_num < 0 ||
189 if (uri.
scheme() !=
"ipv4") {
195 resolved_addr,
true );
200 bool success =
false;
213 addr->len =
static_cast<socklen_t
>(
sizeof(grpc_sockaddr_in6));
214 grpc_sockaddr_in6* in6 =
reinterpret_cast<grpc_sockaddr_in6*
>(
addr->addr);
215 in6->sin6_family = GRPC_AF_INET6;
218 static_cast<char*
>(
gpr_memrchr(host.c_str(),
'%', host.size()));
219 if (host_end !=
nullptr) {
221 char host_without_scope[GRPC_INET6_ADDRSTRLEN + 1];
222 size_t host_without_scope_len =
223 static_cast<size_t>(host_end - host.c_str());
225 if (host_without_scope_len > GRPC_INET6_ADDRSTRLEN) {
229 "invalid ipv6 address length %zu. Length cannot be greater than "
230 "GRPC_INET6_ADDRSTRLEN i.e %d)",
231 host_without_scope_len, GRPC_INET6_ADDRSTRLEN);
235 strncpy(host_without_scope, host.c_str(), host_without_scope_len);
236 host_without_scope[host_without_scope_len] =
'\0';
237 if (
grpc_inet_pton(GRPC_AF_INET6, host_without_scope, &in6->sin6_addr) ==
245 host.size() - host_without_scope_len - 1,
246 &sin6_scope_id) == 0) {
249 "Invalid interface name: '%s'. "
250 "Non-numeric and failed if_nametoindex.",
256 in6->sin6_scope_id = sin6_scope_id;
258 if (
grpc_inet_pton(GRPC_AF_INET6, host.c_str(), &in6->sin6_addr) == 0) {
271 if (sscanf(
port.c_str(),
"%d", &port_num) != 1 || port_num < 0 ||
284 if (uri.
scheme() !=
"ipv6") {
290 resolved_addr,
true );
295 if (uri.
scheme() ==
"unix") {
298 if (uri.
scheme() ==
"unix-abstract") {
301 if (uri.
scheme() ==
"ipv4") {
304 if (uri.
scheme() ==
"ipv6") {
312 if (strcmp(
port,
"http") == 0) {
314 }
else if (strcmp(
port,
"https") == 0) {
317 return htons(
static_cast<unsigned short>(atoi(
port)));
323 grpc_sockaddr_in6*
addr6 =
reinterpret_cast<grpc_sockaddr_in6*
>(
out->addr);
324 grpc_sockaddr_in*
addr4 =
reinterpret_cast<grpc_sockaddr_in*
>(
out->addr);
327 out->len =
sizeof(grpc_sockaddr_in6);
329 addr4->sin_family = GRPC_AF_INET;
330 out->len =
sizeof(grpc_sockaddr_in);
bool grpc_parse_unix_abstract(const grpc_core::URI &, grpc_resolved_address *)
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
return memset(p, 0, total)
bool grpc_parse_ipv6(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
bool SplitHostPort(absl::string_view name, absl::string_view *host, absl::string_view *port)
ABSL_MUST_USE_RESULT absl::string_view StripPrefix(absl::string_view str, absl::string_view prefix)
int grpc_inet_pton(int af, const char *src, void *dst)
const std::string & path() const
bool grpc_parse_uri(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
grpc_error_handle UnixAbstractSockaddrPopulate(absl::string_view, grpc_resolved_address *)
uint32_t grpc_if_nametoindex(char *name)
def c_str(s, encoding='ascii')
grpc_error_handle grpc_string_to_sockaddr(grpc_resolved_address *out, const char *addr, int port)
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
void * gpr_memrchr(const void *s, int c, size_t n)
static struct sockaddr_in6 addr6
grpc_error_handle UnixSockaddrPopulate(absl::string_view, grpc_resolved_address *)
bool grpc_parse_ipv6_hostport(absl::string_view hostport, grpc_resolved_address *addr, bool log_errors)
uint16_t grpc_strhtons(const char *port)
unsigned short sin6_family
bool grpc_parse_unix(const grpc_core::URI &, grpc_resolved_address *)
uint16_t grpc_htons(uint16_t hostshort)
static struct sockaddr_in addr4
const std::string & scheme() const
std::string grpc_error_std_string(grpc_error_handle error)
int gpr_parse_bytes_to_uint32(const char *buf, size_t len, uint32_t *result)
#define GRPC_ERROR_CREATE_FROM_CPP_STRING(desc)
#define GRPC_ERROR_UNREF(err)
struct ares_in6_addr sin6_addr
bool grpc_parse_ipv4_hostport(absl::string_view hostport, grpc_resolved_address *addr, bool log_errors)
bool grpc_parse_ipv4(const grpc_core::URI &uri, grpc_resolved_address *resolved_addr)
char addr[GRPC_MAX_SOCKADDR_SIZE]
#define GRPC_ERROR_IS_NONE(err)
grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:49