ip6_sprintf patch

Bjoern A. Zeeb bzeeb-lists at lists.zabbadoz.net
Tue Dec 12 04:25:29 PST 2006


Hi,

I have a patch sitting around for quite some time that I'd like to
commit if noone has any objections. It tries to print the addresses
in a more common/readable format eliminating leading zeros like
in :0001 -> :1.

You can also fetch it from here:
http://sources.zabbadoz.net/freebsd/ipv6/patches/20060611-01.diff

! 
! http://perforce.freebsd.org/chv.cgi?CH=98978
! 
==== //depot/user/bz/fast_ipsec/src/sys/netinet6/in6.c#4 - /local/building/freebsd/p4/v6_fast_ipsec/src/sys/netinet6/in6.c ====
--- /tmp/tmp.47236.0	Sun Jun 11 11:48:05 2006
+++ /local/building/freebsd/p4/v6_fast_ipsec/src/sys/netinet6/in6.c	Sun Jun 11 11:47:16 2006
@@ -1852,7 +1852,7 @@
  	char *cp;
  	const u_int16_t *a = (const u_int16_t *)addr;
  	const u_int8_t *d;
-	int dcolon = 0;
+	int dcolon = 0, zero = 0;

  	cp = ip6buf;

@@ -1880,14 +1880,31 @@
  			continue;
  		}
  		d = (const u_char *)a;
-		*cp++ = digits[*d >> 4];
-		*cp++ = digits[*d++ & 0xf];
-		*cp++ = digits[*d >> 4];
-		*cp++ = digits[*d & 0xf];
+		/* Try to eliminate leading zeros in printout like in :0001. */
+		zero = 1;
+		*cp = digits[*d >> 4];
+		if (*cp != '0') {
+			zero = 0;
+			cp++;
+		}
+		*cp = digits[*d++ & 0xf];
+		if (zero == 0 || (*cp != '0')) {
+			zero = 0;
+			cp++;
+		}
+		*cp = digits[*d >> 4];
+		if (zero == 0 || (*cp != '0')) {
+			zero = 0;
+			cp++;
+		}
+		*cp = digits[*d & 0xf];
+		if (zero == 0 || (*cp != '0'))
+			cp++;
  		*cp++ = ':';
  		a++;
  	}
  	*--cp = '\0';
+
  	return (ip6buf);
  }


-- 
Bjoern A. Zeeb				bzeeb at Zabbadoz dot NeT


More information about the freebsd-net mailing list