summaryrefslogtreecommitdiff
path: root/src/sp_network_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sp_network_utils.c')
-rw-r--r--src/sp_network_utils.c41
1 files changed, 37 insertions, 4 deletions
diff --git a/src/sp_network_utils.c b/src/sp_network_utils.c
index 31e8426..943c418 100644
--- a/src/sp_network_utils.c
+++ b/src/sp_network_utils.c
@@ -85,16 +85,17 @@ int get_ip_and_cidr(char *ip, sp_cidr *cidr) {
85 char *mask = strchr(ip, '/'); 85 char *mask = strchr(ip, '/');
86 86
87 if (NULL == mask) { 87 if (NULL == mask) {
88 sp_log_err( 88 sp_log_err("config", "'%s' isn't a valid network mask, it seems that you forgot a '/'.", ip);
89 "config",
90 "'%s' isn't a valid network mask, it seems that you forgot a '/'.", ip);
91 return -1; 89 return -1;
92 } 90 }
93 91
94 if (sscanf(mask + 1, "%hhu", &(cidr->mask)) != 1) { 92 int masklen = strlen(mask+1);
93 int imask = atoi(mask+1);
94 if (masklen < 1 || masklen > 3 || !isdigit(*(mask+1)) || (masklen >= 2 && !isdigit(*(mask+2))) || (masklen == 3 && !isdigit(*(mask+3))) || imask < 0 || imask > 128) {
95 sp_log_err("config", "'%s' isn't a valid network mask.", mask + 1); 95 sp_log_err("config", "'%s' isn't a valid network mask.", mask + 1);
96 return -1; 96 return -1;
97 } 97 }
98 cidr->mask = (uint8_t)imask;
98 99
99 ip[mask - ip] = '\0'; // NULL the '/' char 100 ip[mask - ip] = '\0'; // NULL the '/' char
100 101
@@ -113,5 +114,37 @@ int get_ip_and_cidr(char *ip, sp_cidr *cidr) {
113 } 114 }
114 115
115 ip[mask - ip] = '/'; 116 ip[mask - ip] = '/';
117 if (cidr->ip_version < 0) {
118 sp_log_err("config", "Weird ip (%s) family", ip);
119 return -1;
120 }
121
116 return 0; 122 return 0;
117} 123}
124
125bool /* success */ get_ip_str(char *dst, size_t dst_len, sp_cidr *cidr) {
126 size_t ipstr_len = 0;
127 void *ip = NULL;
128 switch (cidr->ip_version) {
129 case AF_INET:
130 ipstr_len = INET_ADDRSTRLEN;
131 ip = &cidr->ip.ipv4;
132 break;
133 case AF_INET6:
134 ipstr_len = INET6_ADDRSTRLEN;
135 ip = &cidr->ip.ipv6;
136 break;
137 default:
138 return false;
139 }
140
141 if (dst_len < ipstr_len + 1 + 3 + 1) {
142 return false;
143 }
144 if (!inet_ntop(cidr->ip_version, ip, dst, ipstr_len)) {
145 return false;
146 }
147 ipstr_len = strlen(dst);
148 snprintf(dst + ipstr_len, dst_len - ipstr_len, "/%d", cidr->mask);
149 return true;
150} \ No newline at end of file