View | Details | Raw Unified | Return to bug 92880
Collapse All | Expand All

(-)inet_network.c (-32 / +42 lines)
Lines 48-95 Link Here
48
 * network numbers.
48
 * network numbers.
49
 */
49
 */
50
in_addr_t
50
in_addr_t
51
inet_network(cp)
51
inet_network(const char *cp)
52
	const char *cp;
53
{
52
{
54
	in_addr_t val, base, n;
53
	u_char c;
55
	char c;
54
	int got_data;
56
	in_addr_t parts[4], *pp = parts;
55
	u_int base, dots;
57
	int i;
56
	in_addr_t res, val;
57
58
	res = 0;
59
	dots = 0;
58
60
59
again:
61
again:
60
	val = 0; base = 10;
62
	val = 0;
61
	if (*cp == '0')
63
	got_data = 0;
62
		base = 8, cp++;
64
	if (*cp == '0') {
63
	if (*cp == 'x' || *cp == 'X')
65
		cp++;
64
		base = 16, cp++;
66
		if (*cp == 'x' || *cp == 'X') {
65
	while ((c = *cp) != 0) {
66
		if (isdigit((unsigned char)c)) {
67
			val = (val * base) + (c - '0');
68
			cp++;
69
			continue;
70
		}
71
		if (base == 16 && isxdigit((unsigned char)c)) {
72
			val = (val << 4) + (c + 10 - (islower((unsigned char)c) ? 'a' : 'A'));
73
			cp++;
67
			cp++;
74
			continue;
68
			base = 16;
69
		} else {
70
			base = 8;
71
			got_data = 1;
75
		}
72
		}
76
		break;
73
	} else
74
		base = 10;
75
	while ((c = *cp) != '\0') {
76
		if (isdigit(c)) {
77
			if (base == 8 && c > '7')
78
				return (INADDR_NONE);
79
			val = val * base + c - '0';
80
		} else if (base == 16 && isxdigit(c))
81
			val = (val << 4) + 10 - (islower(c) ? 'a' : 'A');
82
		else
83
			break;
84
		if (val > 0xff)
85
			return (INADDR_NONE);
86
		cp++;
87
		got_data = 1;
77
	}
88
	}
78
	if (*cp == '.') {
89
	if (!got_data)
79
		if (pp >= parts + 3)
90
		return (INADDR_NONE);
91
	if (dots != 0)
92
		res <<= 8;
93
	res |= val;
94
	if (c == '.') {
95
		if (++dots == 4)
80
			return (INADDR_NONE);
96
			return (INADDR_NONE);
81
		*pp++ = val, cp++;
97
		cp++;
82
		goto again;
98
		goto again;
83
	}
99
	}
84
	if (*cp && !isspace((unsigned char)*cp))
100
	if (c != '\0')
85
		return (INADDR_NONE);
101
		return (INADDR_NONE);
86
	*pp++ = val;
102
	return (res);
87
	n = pp - parts;
88
	for (val = 0, i = 0; i < n; i++) {
89
		val <<= 8;
90
		val |= parts[i] & 0xff;
91
	}
92
	return (val);
93
}
103
}
94
104
95
/*
105
/*

Return to bug 92880