00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "addr.h"
00019 #include "scanf.h"
00020 #include "str.h"
00021
00022 int addr_from_str(const char *str, uint32_t *ip, uint32_t *mask)
00023 {
00024 int rc = 0;
00025 unsigned long long int cidr;
00026
00027 union {
00028 uint8_t b[4];
00029 uint32_t l;
00030 } u;
00031
00032 const char *p = str_index(str, '/', str_len(str));
00033
00034 if (ip && (!p || p - str > 0)) {
00035 if (_lucid_sscanf(str, "%hhu.%hhu.%hhu.%hhu",
00036 &u.b[0], &u.b[1], &u.b[2], &u.b[3]) == 4) {
00037 *ip = addr_hton(u.l);
00038 rc = 1;
00039 }
00040 }
00041
00042 if (!p || !mask)
00043 return rc;
00044
00045 p++;
00046
00047
00048 if (!str_isempty(p) && str_isdigit(p)) {
00049 str_toumax(p, &cidr, 10, str_len(p));
00050
00051 if (cidr > 0 && cidr <= 32) {
00052 *mask = 0xffffffff & ~((1 << (32 - cidr)) - 1);
00053 rc += 2;
00054 }
00055 }
00056
00057 if (!str_isempty(p)) {
00058 if (_lucid_sscanf(p, "%hhu.%hhu.%hhu.%hhu",
00059 &u.b[0], &u.b[1], &u.b[2], &u.b[3]) == 4) {
00060 *mask = addr_hton(u.l);
00061 rc += 2;
00062 }
00063 }
00064
00065 return rc;
00066 }