diff options
| author | jvoisin | 2022-03-20 18:20:45 +0100 |
|---|---|---|
| committer | jvoisin | 2022-03-20 18:20:45 +0100 |
| commit | 81dd7f2ef07af306fe83d7755cbac4529aa9fc8d (patch) | |
| tree | 32cc44c6231b30db5ac7b15699297863460784aa /src/sp_network_utils.c | |
| parent | 83b01942dfc80474cc05e09aeef4b44307a7120b (diff) | |
| parent | c38df1077a6c1dfbca1baca049214d053e2e7684 (diff) | |
Merge remote-tracking branch 'sektioneins/master'
Diffstat (limited to 'src/sp_network_utils.c')
| -rw-r--r-- | src/sp_network_utils.c | 41 |
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 | |||
| 125 | bool /* 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 | ||
