3131#include "util.h"
3232
3333bool in4_addr_is_null (const struct in_addr * a ) {
34- return a -> s_addr == 0 ;
35- }
34+ assert (a );
3635
37- bool in6_addr_is_null (const struct in6_addr * a ) {
38- return
39- a -> s6_addr32 [0 ] == 0 &&
40- a -> s6_addr32 [1 ] == 0 &&
41- a -> s6_addr32 [2 ] == 0 &&
42- a -> s6_addr32 [3 ] == 0 ;
36+ return a -> s_addr == 0 ;
4337}
4438
4539int in_addr_is_null (int family , const union in_addr_union * u ) {
@@ -49,29 +43,41 @@ int in_addr_is_null(int family, const union in_addr_union *u) {
4943 return in4_addr_is_null (& u -> in );
5044
5145 if (family == AF_INET6 )
52- return in6_addr_is_null (& u -> in6 );
46+ return IN6_IS_ADDR_UNSPECIFIED (& u -> in6 );
5347
5448 return - EAFNOSUPPORT ;
5549}
5650
51+ bool in4_addr_is_link_local (const struct in_addr * a ) {
52+ assert (a );
53+
54+ return (be32toh (a -> s_addr ) & UINT32_C (0xFFFF0000 )) == (UINT32_C (169 ) << 24 | UINT32_C (254 ) << 16 );
55+ }
56+
5757int in_addr_is_link_local (int family , const union in_addr_union * u ) {
5858 assert (u );
5959
6060 if (family == AF_INET )
61- return ( be32toh ( u -> in . s_addr ) & UINT32_C ( 0xFFFF0000 )) == ( UINT32_C ( 169 ) << 24 | UINT32_C ( 254 ) << 16 );
61+ return in4_addr_is_link_local ( & u -> in );
6262
6363 if (family == AF_INET6 )
6464 return IN6_IS_ADDR_LINKLOCAL (& u -> in6 );
6565
6666 return - EAFNOSUPPORT ;
6767}
6868
69+ bool in4_addr_is_localhost (const struct in_addr * a ) {
70+ assert (a );
71+
72+ /* All of 127.x.x.x is localhost. */
73+ return (be32toh (a -> s_addr ) & UINT32_C (0xFF000000 )) == UINT32_C (127 ) << 24 ;
74+ }
75+
6976int in_addr_is_localhost (int family , const union in_addr_union * u ) {
7077 assert (u );
7178
7279 if (family == AF_INET )
73- /* All of 127.x.x.x is localhost. */
74- return (be32toh (u -> in .s_addr ) & UINT32_C (0xFF000000 )) == UINT32_C (127 ) << 24 ;
80+ return in4_addr_is_localhost (& u -> in );
7581
7682 if (family == AF_INET6 )
7783 return IN6_IS_ADDR_LOOPBACK (& u -> in6 );
@@ -277,15 +283,14 @@ int in_addr_ifindex_to_string(int family, const union in_addr_union *u, int ifin
277283}
278284
279285int in_addr_from_string (int family , const char * s , union in_addr_union * ret ) {
280-
286+ union in_addr_union buffer ;
281287 assert (s );
282- assert (ret );
283288
284289 if (!IN_SET (family , AF_INET , AF_INET6 ))
285290 return - EAFNOSUPPORT ;
286291
287292 errno = 0 ;
288- if (inet_pton (family , s , ret ) <= 0 )
293+ if (inet_pton (family , s , ret ?: & buffer ) <= 0 )
289294 return errno > 0 ? - errno : - EINVAL ;
290295
291296 return 0 ;
@@ -295,18 +300,18 @@ int in_addr_from_string_auto(const char *s, int *family, union in_addr_union *re
295300 int r ;
296301
297302 assert (s );
298- assert (family );
299- assert (ret );
300303
301304 r = in_addr_from_string (AF_INET , s , ret );
302305 if (r >= 0 ) {
303- * family = AF_INET ;
306+ if (family )
307+ * family = AF_INET ;
304308 return 0 ;
305309 }
306310
307311 r = in_addr_from_string (AF_INET6 , s , ret );
308312 if (r >= 0 ) {
309- * family = AF_INET6 ;
313+ if (family )
314+ * family = AF_INET6 ;
310315 return 0 ;
311316 }
312317
0 commit comments