"invalid port/service `%s' specified", port);
}
-struct in_addr *
-dotted_to_addr(const char *dotted)
+enum {
+ IPT_DOTTED_ADDR = 0,
+ IPT_DOTTED_MASK
+};
+
+static struct in_addr *
+__dotted_to_addr(const char *dotted, int type)
{
static struct in_addr addr;
unsigned char *addrp;
p = buf;
for (i = 0; i < 3; i++) {
- if ((q = strchr(p, '.')) == NULL)
- return (struct in_addr *) NULL;
+ if ((q = strchr(p, '.')) == NULL) {
+ if (type == IPT_DOTTED_ADDR) {
+ /* autocomplete, this is a network address */
+ if (string_to_number(p, 0, 255, &onebyte) == -1)
+ return (struct in_addr *) NULL;
+
+ addrp[i] = (unsigned char) onebyte;
+ while (i < 3)
+ addrp[++i] = 0;
+
+ return &addr;
+ } else
+ return (struct in_addr *) NULL;
+ }
*q = '\0';
if (string_to_number(p, 0, 255, &onebyte) == -1)
return &addr;
}
+struct in_addr *
+dotted_to_addr(const char *dotted)
+{
+ return __dotted_to_addr(dotted, IPT_DOTTED_ADDR);
+}
+
+struct in_addr *
+dotted_to_mask(const char *dotted)
+{
+ return __dotted_to_addr(dotted, IPT_DOTTED_MASK);
+}
+
static struct in_addr *
network_to_addr(const char *name)
{
return (char *) NULL;
}
-static void
-pad_cidr(char *cidr)
-{
- char *p, *q;
- unsigned int onebyte;
- int i, j;
- char buf[20];
-
- /* copy dotted string, because we need to modify it */
- strncpy(buf, cidr, sizeof(buf) - 1);
- buf[sizeof(buf) - 1] = '\0';
-
- p = buf;
- for (i = 0; i <= 3; i++) {
- if ((q = strchr(p, '.')) == NULL)
- break;
- *q = '\0';
- if (string_to_number(p, 0, 255, &onebyte) == -1)
- return;
- p = q + 1;
- }
-
- /* pad remaining octets with zeros */
- for (j = i; j < 3; j++) {
- strcat(cidr, ".0");
- }
-}
-
/*
* All functions starting with "parse" should succeed, otherwise
* the program fails.
maskaddr.s_addr = 0xFFFFFFFF;
return &maskaddr;
}
- if ((addrp = dotted_to_addr(mask)) != NULL)
+ if ((addrp = dotted_to_mask(mask)) != NULL)
/* dotted_to_addr already returns a network byte order addr */
return addrp;
if (string_to_number(mask, 0, 32, &bits) == -1)
if ((p = strrchr(buf, '/')) != NULL) {
*p = '\0';
addrp = parse_mask(p + 1);
- if (strrchr(p + 1, '.') == NULL)
- pad_cidr(buf);
} else
addrp = parse_mask(NULL);
inaddrcpy(maskp, addrp);