diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/acl.c | 13 | ||||
-rw-r--r-- | main/netsock2.c | 34 |
2 files changed, 47 insertions, 0 deletions
diff --git a/main/acl.c b/main/acl.c index 213d6d8aa..5c3b633d7 100644 --- a/main/acl.c +++ b/main/acl.c @@ -677,6 +677,19 @@ void ast_ha_join(const struct ast_ha *ha, struct ast_str **buf) } } +void ast_ha_join_cidr(const struct ast_ha *ha, struct ast_str **buf) +{ + for (; ha; ha = ha->next) { + const char *addr = ast_sockaddr_stringify_addr(&ha->addr); + ast_str_append(buf, 0, "%s%s/%d", + ha->sense == AST_SENSE_ALLOW ? "!" : "", + addr, ast_sockaddr_cidr_bits(&ha->netmask)); + if (ha->next) { + ast_str_append(buf, 0, ","); + } + } +} + enum ast_acl_sense ast_apply_acl(struct ast_acl_list *acl_list, const struct ast_sockaddr *addr, const char *purpose) { struct ast_acl *acl; diff --git a/main/netsock2.c b/main/netsock2.c index bd682b17d..0e83f27cf 100644 --- a/main/netsock2.c +++ b/main/netsock2.c @@ -129,6 +129,40 @@ char *ast_sockaddr_stringify_fmt(const struct ast_sockaddr *sa, int format) return ast_str_buffer(str); } +int ast_sockaddr_cidr_bits(const struct ast_sockaddr *sa) +{ + struct ast_sockaddr sa_ipv4; + const struct ast_sockaddr *sa_tmp; + int bits = 0; + int bytes; + int i; + int j; + char *addr; + + if (ast_sockaddr_isnull(sa)) { + return 0; + } + + if (ast_sockaddr_ipv4_mapped(sa, &sa_ipv4)) { + sa_tmp = &sa_ipv4; + } else { + sa_tmp = sa; + } + + bytes = sa_tmp->len; + addr = ((struct sockaddr *)&sa_tmp->ss)->sa_data; + + for (i = 0; i < bytes ; ++i) { + for (j = 0; j < 8; ++j) { + if ((addr[i] >> j) & 1) { + bits++; + } + } + } + + return bits; +} + int ast_sockaddr_split_hostport(char *str, char **host, char **port, int flags) { char *s = str; |