diff options
| author | xengineering <me@xengineering.eu> | 2022-12-04 12:41:39 +0100 | 
|---|---|---|
| committer | xengineering <me@xengineering.eu> | 2022-12-04 12:41:39 +0100 | 
| commit | 0de21ec65f3c28f2acc947c00c3cb26dc9ea4ecd (patch) | |
| tree | 1d8490f38520908f55f38edbc050920f9eebb15e | |
| parent | d3a952c04f16723a5dc86fccc5919082dcd1c90e (diff) | |
| download | limox-0de21ec65f3c28f2acc947c00c3cb26dc9ea4ecd.tar limox-0de21ec65f3c28f2acc947c00c3cb26dc9ea4ecd.tar.zst limox-0de21ec65f3c28f2acc947c00c3cb26dc9ea4ecd.zip | |
Implement DNS with a temporary solution
The DNS resolution implemented with this commit uses getaddrinfo() from
the standard library to get an IPv4 address for the domainpart of the
user-given Jabber ID (JID).
This is by far not the process described in [RFC 6120][1]. This XMPP
core standard prefers SRV entry lookups. Taking A records like in this
implementation is referenced as "fallback process".
Furthermore this implementation just takes the first A record it finds
which could also be improved. It could for example be that IPv4 is
blocked in the referenced network and a AAAA IPv6 record is given and
functional. In this case this implementation would needlessly fail to connect.
[1]: https://www.rfc-editor.org/rfc/rfc6120
| -rw-r--r-- | xmpp.c | 19 | 
1 files changed, 15 insertions, 4 deletions
| @@ -22,6 +22,7 @@  #include <string.h>  #include <sys/types.h>  #include <sys/socket.h> +#include <arpa/inet.h>  #include <netdb.h> @@ -62,11 +63,17 @@ char *get_domainpart(char *jid)   * This handles DNS resolution. It returns the first valid addrinfo which is   * returned by getaddrinfo. Mind that the addrinfo could use IPv6 instead of   * IPv4. + * + * FIXME this just takes the first received IPv4 address (by far not compliant + *       to RFC 6120!) + * FIXME This function contains a memory leak! Free the linked list servinfo!   */  struct addrinfo *get_addrinfo(char *domain)  {  	struct addrinfo hints;  	struct addrinfo *servinfo; +	void *addr; +	char ipstr[INET6_ADDRSTRLEN];  	memset(&hints, 0, sizeof hints);  	hints.ai_family = AF_UNSPEC;  	hints.ai_socktype = SOCK_STREAM; @@ -77,14 +84,18 @@ struct addrinfo *get_addrinfo(char *domain)  	struct addrinfo *p;  	for(p=servinfo; p!=NULL; p=p->ai_next) {  		if (p->ai_family == AF_INET) { -			printf("an IPv4!\n");  // TODO - +			struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; +			addr = &(ipv4->sin_addr); +			inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); +			printf("Got compatible IPv4 address %s from DNS.\n", ipstr); +			return p;  		} else if (p->ai_family == AF_INET6) { -			printf("an IPv6!\n");  // TODO +			printf("Ignored IPv6 DNS entry which is not supported.\n");  		} else { -			printf("Unknown addrinfo address type.\n"); +			printf("Ignored unknown addrinfo address type.\n");  		}  	} +	printf("No suitable IP address found via DNS!\n");  	return NULL;  } | 
