- for(int i = 0; i < 2; i++) {
- if(hostname[i]) {
- char *tmphostport;
- xasprintf(&tmphostport, "%s %s", hostname[i], port);
- append_config_file(mesh, mesh->self->name, "Address", tmphostport);
- free(tmphostport);
+ remove_duplicate_hostnames(hostname, port, 4);
+
+ if(!(flags & MESHLINK_INVITE_NUMERIC)) {
+ for(int i = 0; i < 4; i++) {
+ if(!hostname[i]) {
+ continue;
+ }
+
+ // Convert what we have to a sockaddr
+ struct addrinfo *ai_in, *ai_out;
+ struct addrinfo hint = {
+ .ai_family = AF_UNSPEC,
+ .ai_flags = AI_NUMERICSERV,
+ .ai_socktype = SOCK_STREAM,
+ };
+ int err = getaddrinfo(hostname[i], port[i], &hint, &ai_in);
+
+ if(err || !ai_in) {
+ continue;
+ }
+
+ // Convert it to a hostname
+ char resolved_host[NI_MAXHOST];
+ char resolved_port[NI_MAXSERV];
+ err = getnameinfo(ai_in->ai_addr, ai_in->ai_addrlen, resolved_host, sizeof resolved_host, resolved_port, sizeof resolved_port, NI_NUMERICSERV);
+
+ if(err) {
+ freeaddrinfo(ai_in);
+ continue;
+ }
+
+ // Convert the hostname back to a sockaddr
+ hint.ai_family = ai_in->ai_family;
+ err = getaddrinfo(resolved_host, resolved_port, &hint, &ai_out);
+
+ if(err || !ai_out) {
+ freeaddrinfo(ai_in);
+ continue;
+ }
+
+ // Check if it's still the same sockaddr
+ if(ai_in->ai_addrlen != ai_out->ai_addrlen || memcmp(ai_in->ai_addr, ai_out->ai_addr, ai_in->ai_addrlen)) {
+ freeaddrinfo(ai_in);
+ freeaddrinfo(ai_out);
+ continue;
+ }
+
+ // Yes: replace the hostname with the resolved one
+ free(hostname[i]);
+ hostname[i] = xstrdup(resolved_host);
+
+ freeaddrinfo(ai_in);
+ freeaddrinfo(ai_out);