]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add net_get_hosterror_type()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 12 Jun 2019 08:50:08 +0000 (11:50 +0300)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Wed, 19 Jun 2019 10:14:14 +0000 (10:14 +0000)
src/lib/net.c
src/lib/net.h

index 99d7bdf69d1788418397c4f009b0d674d7ab000b..25645c39bb9b8ef8a6023137587be99efc44d163 100644 (file)
@@ -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 */
index 3b540d0029a3b0387a6571859812a30e41defba7..84d2f45b017d5af68c079db60f0455eb08b08571 100644 (file)
@@ -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;