1 diff -Naur sysvinit-2.86/src/last.c sysvinit-2.86-ipv6/src/last.c
2 --- sysvinit-2.86/src/last.c 2004-07-30 14:16:26.000000000 +0200
3 +++ sysvinit-2.86-ipv6/src/last.c 2006-07-19 16:14:24.000000000 +0200
7 unsigned int topnibble;
8 + unsigned int azero = 0, sitelocal = 0;
11 flags = useip ? NI_NUMERICHOST : 0;
14 * IPv4 or IPv6 ? We use 2 heuristics:
15 - * 1. Current IPv6 range uses 2000-3fff. Outside of
16 - * that is illegal and must be IPv4.
17 + * 1. Current IPv6 range uses 2000-3fff or fec0-feff.
18 + * Outside of that is illegal and must be IPv4.
19 * 2. If last 3 bytes are 0, must be IPv4
20 * 3. If IPv6 in IPv4, handle as IPv4
23 if (a[0] == 0 && a[1] == 0 && a[2] == htonl (0xffff))
25 topnibble = ntohl((unsigned int)a[0]) >> 28;
26 - if (topnibble < 2 || topnibble > 3 || mapped ||
28 + azero = ntohl((unsigned int)a[0]) >> 16;
29 + sitelocal = (azero >= 0xfec0 && azero <= 0xfeff) ? 1 : 0;
31 + if (((topnibble < 2 || topnibble > 3) && (!sitelocal)) || mapped ||
32 (a[1] == 0 && a[2] == 0 && a[3] == 0)) {
34 sin.sin_family = AF_INET;