From: Timo Sirainen Date: Wed, 12 Jun 2019 08:50:08 +0000 (+0300) Subject: lib: Add net_get_hosterror_type() X-Git-Tag: 2.3.9~439 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c85f1bc3ce612c736c9d2c468cc08306db1b5851;p=thirdparty%2Fdovecot%2Fcore.git lib: Add net_get_hosterror_type() --- diff --git a/src/lib/net.c b/src/lib/net.c index 99d7bdf69d..25645c39bb 100644 --- a/src/lib/net.c +++ b/src/lib/net.c @@ -1062,6 +1062,33 @@ const char *net_gethosterror(int error) return gai_strerror(error); } +enum net_hosterror_type net_get_hosterror_type(int error) +{ + const struct { + int error; + enum net_hosterror_type type; + } error_map[] = { + { EAI_ADDRFAMILY, NET_HOSTERROR_TYPE_NOT_FOUND }, + { EAI_AGAIN, NET_HOSTERROR_TYPE_NAMESERVER }, + { EAI_BADFLAGS, NET_HOSTERROR_TYPE_INTERNAL_ERROR }, + { EAI_FAIL, NET_HOSTERROR_TYPE_NAMESERVER }, + { EAI_FAMILY, NET_HOSTERROR_TYPE_INTERNAL_ERROR }, + { EAI_MEMORY, NET_HOSTERROR_TYPE_INTERNAL_ERROR }, + { EAI_NODATA, NET_HOSTERROR_TYPE_NOT_FOUND }, + { EAI_NONAME, NET_HOSTERROR_TYPE_NOT_FOUND }, + { EAI_SERVICE, NET_HOSTERROR_TYPE_INTERNAL_ERROR }, + { EAI_SOCKTYPE, NET_HOSTERROR_TYPE_INTERNAL_ERROR }, + { EAI_SYSTEM, NET_HOSTERROR_TYPE_INTERNAL_ERROR }, + }; + for (unsigned int i = 0; i < N_ELEMENTS(error_map); i++) { + if (error_map[i].error == error) + return error_map[i].type; + } + + /* shouldn't happen? assume internal error */ + return NET_HOSTERROR_TYPE_INTERNAL_ERROR; +} + int net_hosterror_notfound(int error) { #ifdef EAI_NODATA /* NODATA is depricated */ diff --git a/src/lib/net.h b/src/lib/net.h index 3b540d0029..84d2f45b01 100644 --- a/src/lib/net.h +++ b/src/lib/net.h @@ -48,6 +48,15 @@ enum net_listen_flags { NET_LISTEN_FLAG_REUSEPORT = 0x01 }; +enum net_hosterror_type { + /* Internal error - should be logged as an error */ + NET_HOSTERROR_TYPE_INTERNAL_ERROR, + /* Host not found or no valid IP addresses found */ + NET_HOSTERROR_TYPE_NOT_FOUND, + /* Nameserver returned an error */ + NET_HOSTERROR_TYPE_NAMESERVER, +}; + /* INADDR_ANY for IPv4 or IPv6. The IPv6 any address may include IPv4 depending on the system (Linux yes, BSD no). */ extern const struct ip_addr net_ip4_any; @@ -122,6 +131,8 @@ int net_gethostbyname(const char *addr, struct ip_addr **ips, int net_gethostbyaddr(const struct ip_addr *ip, const char **name_r); /* get error of net_gethostname() */ const char *net_gethosterror(int error) ATTR_CONST; +/* Return type of the error returned by net_gethostname() */ +enum net_hosterror_type net_get_hosterror_type(int error); /* return TRUE if host lookup failed because it didn't exist (ie. not some error with name server) */ int net_hosterror_notfound(int error) ATTR_CONST;