- struct addrinfo hint, *ai;
- sockaddr_t result;
- int err;
-cp
- memset(&hint, 0, sizeof(hint));
-
- hint.ai_family = AF_UNSPEC;
- hint.ai_flags = AI_NUMERICHOST;
- hint.ai_socktype = SOCK_STREAM;
-
- if((err = getaddrinfo(address, port, &hint, &ai) || !ai))
- {
- syslog(LOG_ERR, _("Error looking up %s port %s: %s\n"), address, port, gai_strerror(err));
- cp_trace();
- raise(SIGFPE);
- exit(0);
- }
-
- result = *(sockaddr_t *)ai->ai_addr;
- freeaddrinfo(ai);
-cp
- return result;
+ struct addrinfo hint, *ai;
+ sockaddr_t result;
+ int err;
+
+ cp();
+
+ memset(&hint, 0, sizeof(hint));
+
+ hint.ai_family = AF_UNSPEC;
+ hint.ai_flags = AI_NUMERICHOST;
+ hint.ai_socktype = SOCK_STREAM;
+
+ err = getaddrinfo(address, port, &hint, &ai);
+
+ if(err || !ai) {
+ syslog(LOG_ERR, _("Error looking up %s port %s: %s\n"), address, port,
+ gai_strerror(err));
+ cp_trace();
+ raise(SIGFPE);
+ exit(0);
+ }
+
+ result = *(sockaddr_t *) ai->ai_addr;
+ freeaddrinfo(ai);
+
+ return result;
+}
+
+void sockaddr2str(sockaddr_t * sa, char **addrstr, char **portstr)
+{
+ char address[NI_MAXHOST];
+ char port[NI_MAXSERV];
+ char *scopeid;
+ int err;
+
+ cp();
+
+ err = getnameinfo(&sa->sa, SALEN(sa->sa), address, sizeof(address), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV);
+
+ if(err) {
+ syslog(LOG_ERR, _("Error while translating addresses: %s"),
+ gai_strerror(err));
+ cp_trace();
+ raise(SIGFPE);
+ exit(0);
+ }
+
+ scopeid = strchr(address, '%');
+
+ if(scopeid)
+ *scopeid = '\0'; /* Descope. */
+
+ *addrstr = xstrdup(address);
+ *portstr = xstrdup(port);