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>
26 int safe_cat(char **pstr, int *plen, int pos, const char *str2)
28 int len2 = strlen(str2);
30 //printf("safe_cat '%s' max %d pos %d '%s' len %d\n", *pstr, *plen, pos, str2, len2);
31 while (*plen < pos + len2 + 1) {
34 void *_realloc = NULL;
35 if ((_realloc = realloc(*pstr, (size_t)*plen)) == NULL) {
36 printf("Out of memory\n");
39 *pstr = (char *)_realloc;
41 //printf("safe_cat '%s' max %d pos %d '%s' len %d\n", *pstr, *plen, pos, str2, len2);
44 strncpy((*pstr)+pos, str2, len2);
45 (*pstr)[pos+len2] = '\0';
50 char *resolve_addrs(const char *orig_str)
53 char *tok, *saveptr = NULL;
55 char *buf = strdup(orig_str);
56 const char *delim = ",; ";
59 new_str = (char *)malloc(len);
67 tok = strtok_r(buf, delim, &saveptr);
71 struct addrinfo *res, *ores;
72 char *firstcolon, *lastcolon, *bracecolon;
76 firstcolon = strchr(tok, ':');
77 lastcolon = strrchr(tok, ':');
78 bracecolon = strstr(tok, "]:");
81 if (firstcolon && firstcolon == lastcolon) {
82 /* host:port or a.b.c.d:port */
84 port_str = firstcolon + 1;
85 } else if (bracecolon) {
87 port_str = bracecolon + 1;
91 if (port_str && !*port_str)
95 tok[strlen(tok)-1] == ']') {
96 tok[strlen(tok)-1] = 0;
101 //printf("name '%s' port '%s'\n", tok, port_str);
103 memset(&hint, 0, sizeof(hint));
104 hint.ai_family = AF_UNSPEC;
105 hint.ai_socktype = SOCK_STREAM;
106 hint.ai_protocol = IPPROTO_TCP;
108 r = getaddrinfo(tok, port_str, &hint, &res);
110 printf("server name not found: %s (%s)\n", tok,
117 /* build resolved addr list */
120 char host[40], port[40];
121 getnameinfo(res->ai_addr, res->ai_addrlen,
124 NI_NUMERICSERV | NI_NUMERICHOST);
125 /*printf(" host %s port %s flags %d family %d socktype %d proto %d sanonname %s\n",
127 res->ai_flags, res->ai_family, res->ai_socktype, res->ai_protocol,
128 res->ai_canonname);*/
129 if (res->ai_family == AF_INET6)
130 brackets = 1; /* always surround ipv6 addrs with brackets */
132 pos = safe_cat(&new_str, &len, pos, "[");
133 pos = safe_cat(&new_str, &len, pos, host);
135 pos = safe_cat(&new_str, &len, pos, "]");
137 pos = safe_cat(&new_str, &len, pos, ":");
138 pos = safe_cat(&new_str, &len, pos, port);
142 pos = safe_cat(&new_str, &len, pos, ",");
146 tok = strtok_r(NULL, delim, &saveptr);
148 pos = safe_cat(&new_str, &len, pos, ",");
152 //printf("new_str is '%s'\n", new_str);