]>
git.proxmox.com Git - ceph.git/blob - ceph/src/common/addr_parsing.c
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2011 New Dream Network
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
18 #if defined(__FreeBSD__) || defined(_AIX)
19 #include <sys/socket.h>
20 #include <netinet/in.h>
25 #define ROUND_UP_128(x) (-(-(x) & -128))
27 int safe_cat(char **pstr
, int *plen
, int pos
, const char *src
)
29 size_t len2
= strlen(src
);
30 size_t new_size
= pos
+ len2
+ 1;
31 if (*plen
< new_size
) {
32 size_t round_up
= ROUND_UP_128(new_size
);
33 void* p
= realloc(*pstr
, round_up
);
35 printf("Out of memory\n");
41 memcpy(*pstr
+ pos
, src
, len2
+ 1);
45 char *resolve_addrs(const char *orig_str
)
48 char *new_str
= (char *)malloc(len
);
55 char *buf
= strdup(orig_str
);
56 const char *delim
= ",; ";
58 char *tok
= strtok_r(buf
, delim
, &saveptr
);
64 struct addrinfo
*res
, *ores
;
65 char *firstcolon
, *lastcolon
, *bracecolon
;
69 firstcolon
= strchr(tok
, ':');
70 lastcolon
= strrchr(tok
, ':');
71 bracecolon
= strstr(tok
, "]:");
74 if (firstcolon
&& firstcolon
== lastcolon
) {
75 /* host:port or a.b.c.d:port */
77 port_str
= firstcolon
+ 1;
78 } else if (bracecolon
) {
80 port_str
= bracecolon
+ 1;
84 if (port_str
&& !*port_str
)
88 tok
[strlen(tok
)-1] == ']') {
89 tok
[strlen(tok
)-1] = 0;
94 //printf("name '%s' port '%s'\n", tok, port_str);
96 // FIPS zeroization audit 20191115: this memset is fine.
97 memset(&hint
, 0, sizeof(hint
));
98 hint
.ai_family
= AF_UNSPEC
;
99 hint
.ai_socktype
= SOCK_STREAM
;
100 hint
.ai_protocol
= IPPROTO_TCP
;
102 r
= getaddrinfo(tok
, port_str
, &hint
, &res
);
104 printf("server name not found: %s (%s)\n", tok
,
111 /* build resolved addr list */
114 char host
[40], port
[40];
115 getnameinfo(res
->ai_addr
, res
->ai_addrlen
,
118 NI_NUMERICSERV
| NI_NUMERICHOST
);
119 /*printf(" host %s port %s flags %d family %d socktype %d proto %d sanonname %s\n",
121 res->ai_flags, res->ai_family, res->ai_socktype, res->ai_protocol,
122 res->ai_canonname);*/
123 if (res
->ai_family
== AF_INET6
)
124 brackets
= 1; /* always surround ipv6 addrs with brackets */
126 pos
= safe_cat(&new_str
, &len
, pos
, "[");
127 pos
= safe_cat(&new_str
, &len
, pos
, host
);
129 pos
= safe_cat(&new_str
, &len
, pos
, "]");
131 pos
= safe_cat(&new_str
, &len
, pos
, ":");
132 pos
= safe_cat(&new_str
, &len
, pos
, port
);
136 pos
= safe_cat(&new_str
, &len
, pos
, ",");
140 tok
= strtok_r(NULL
, delim
, &saveptr
);
142 pos
= safe_cat(&new_str
, &len
, pos
, ",");
146 //printf("new_str is '%s'\n", new_str);