Skip to content

Commit a4798d4

Browse files
committed
util: introduce in_addr_default_prefix_from_string() and friends
It is similar to in_addr_prefix_from_string() but it determines the prefix length from address if it is not specified.
1 parent 67944f5 commit a4798d4

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

src/basic/in-addr-util.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,9 @@ int in_addr_parse_prefixlen(int family, const char *p, unsigned char *ret) {
495495
return 0;
496496
}
497497

498-
int in_addr_prefix_from_string(
498+
int in_addr_prefix_from_string_internal(
499499
const char *p,
500+
bool use_default_prefixlen,
500501
int family,
501502
union in_addr_union *ret_prefix,
502503
unsigned char *ret_prefixlen) {
@@ -530,6 +531,10 @@ int in_addr_prefix_from_string(
530531
r = in_addr_parse_prefixlen(family, e+1, &k);
531532
if (r < 0)
532533
return r;
534+
} else if (family == AF_INET && use_default_prefixlen) {
535+
r = in4_addr_default_prefixlen(&buffer.in, &k);
536+
if (r < 0)
537+
return r;
533538
} else
534539
k = FAMILY_ADDRESS_SIZE(family) * 8;
535540

@@ -541,8 +546,9 @@ int in_addr_prefix_from_string(
541546
return 0;
542547
}
543548

544-
int in_addr_prefix_from_string_auto(
549+
int in_addr_prefix_from_string_auto_internal(
545550
const char *p,
551+
bool use_default_prefixlen,
546552
int *ret_family,
547553
union in_addr_union *ret_prefix,
548554
unsigned char *ret_prefixlen) {
@@ -573,6 +579,10 @@ int in_addr_prefix_from_string_auto(
573579
r = in_addr_parse_prefixlen(family, e+1, &k);
574580
if (r < 0)
575581
return r;
582+
} else if (family == AF_INET && use_default_prefixlen) {
583+
r = in4_addr_default_prefixlen(&buffer.in, &k);
584+
if (r < 0)
585+
return r;
576586
} else
577587
k = FAMILY_ADDRESS_SIZE(family) * 8;
578588

src/basic/in-addr-util.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,20 @@ int in4_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mas
4545
int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen);
4646
int in_addr_prefix_covers(int family, const union in_addr_union *prefix, unsigned char prefixlen, const union in_addr_union *address);
4747
int in_addr_parse_prefixlen(int family, const char *p, unsigned char *ret);
48-
int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen);
49-
int in_addr_prefix_from_string_auto(const char *p, int *ret_family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen);
48+
int in_addr_prefix_from_string_internal(const char *p, bool use_default_prefixlen, int family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen);
49+
int in_addr_prefix_from_string_auto_internal(const char *p, bool use_default_prefixlen, int *ret_family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen);
50+
static inline int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen) {
51+
return in_addr_prefix_from_string_internal(p, false, family, ret_prefix, ret_prefixlen);
52+
}
53+
static inline int in_addr_prefix_from_string_auto(const char *p, int *ret_family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen) {
54+
return in_addr_prefix_from_string_auto_internal(p, false, ret_family, ret_prefix, ret_prefixlen);
55+
}
56+
static inline int in_addr_default_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen) {
57+
return in_addr_prefix_from_string_internal(p, true, family, ret_prefix, ret_prefixlen);
58+
}
59+
static inline int in_addr_default_prefix_from_string_auto(const char *p, int *ret_family, union in_addr_union *ret_prefix, unsigned char *ret_prefixlen) {
60+
return in_addr_prefix_from_string_auto_internal(p, true, ret_family, ret_prefix, ret_prefixlen);
61+
}
5062

5163
static inline size_t FAMILY_ADDRESS_SIZE(int family) {
5264
assert(IN_SET(family, AF_INET, AF_INET6));

0 commit comments

Comments
 (0)