From owner-freebsd-net@FreeBSD.ORG Tue Oct 23 08:40:01 2012 Return-Path: Delivered-To: freebsd-net@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 5E0155A5 for ; Tue, 23 Oct 2012 08:40:01 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.FreeBSD.org [8.8.178.135]) by mx1.freebsd.org (Postfix) with ESMTP id 455138FC14 for ; Tue, 23 Oct 2012 08:40:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id q9N8e041066539 for ; Tue, 23 Oct 2012 08:40:00 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id q9N8e038066538; Tue, 23 Oct 2012 08:40:00 GMT (envelope-from gnats) Date: Tue, 23 Oct 2012 08:40:00 GMT Message-Id: <201210230840.q9N8e038066538@freefall.freebsd.org> To: freebsd-net@FreeBSD.org Cc: From: Andrey Simonenko Subject: kern/92880: [libc] [patch] almost rewritten inet_network(3) function X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: Andrey Simonenko List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 23 Oct 2012 08:40:01 -0000 The following reply was made to PR kern/92880; it has been noted by GNATS. From: Andrey Simonenko To: bug-followup@FreeBSD.org Cc: Subject: kern/92880: [libc] [patch] almost rewritten inet_network(3) function Date: Tue, 23 Oct 2012 11:36:04 +0300 I optimized inet_network() again. Difference between implementation of inet_network(3) from 9.1-PRERELEASE and my implementation. STRING INET_NETWORK INET_NETWORK_NEW "0x12" 0x00000012 0x00000012 "127.1" 0x00007f01 0x00007f01 "127.1.2.3" 0x7f010203 0x7f010203 "0x123456" INADDR_NONE INADDR_NONE "0x12.0x34" 0x00001234 0x00001234 "0x12.0x345" INADDR_NONE INADDR_NONE "1.2.3.4.5" INADDR_NONE INADDR_NONE "1..3.4" INADDR_NONE INADDR_NONE "." INADDR_NONE INADDR_NONE "1." INADDR_NONE INADDR_NONE ".1" INADDR_NONE INADDR_NONE "0x" 0x00000000 INADDR_NONE <--- "0" 0x00000000 0x00000000 "01.02.07.077" 0x0102073f 0x0102073f "0x1.23.045.0" 0x01172500 0x01172500 "" INADDR_NONE INADDR_NONE " " INADDR_NONE INADDR_NONE " f" INADDR_NONE INADDR_NONE "bar" INADDR_NONE INADDR_NONE "1.2bar" INADDR_NONE INADDR_NONE "1." INADDR_NONE INADDR_NONE "=CA=C3=D5=CB=C5=CE" INADDR_NONE INADDR_NONE "255.255.255.255" INADDR_NONE INADDR_NONE "x" INADDR_NONE INADDR_NONE "0X12" 0x00000012 0x00000012 "078" INADDR_NONE INADDR_NONE "1 bar" 0x00000001 INADDR_NONE <--- "127.0xabcd" INADDR_NONE INADDR_NONE "128" 0x00000080 0x00000080 "0.1.2" 0x00000102 0x00000102 "0xff.010.23.0xa0" 0xff0817a0 0xff0817a0 "x10" 0x00000010 INADDR_NONE <--- "X20" 0x00000020 INADDR_NONE <--- "x10.x20" 0x00001020 INADDR_NONE <--- "4294967297" 0x00000001 INADDR_NONE <--- "0x10000000f" 0x0000000f INADDR_NONE <--- "040000000003" 0x00000003 INADDR_NONE <--- #include #include #include #include #include #include #include #include #include #include static in_addr_t inet_network_new(const char *s) { u_int d, base, dots; in_addr_t addr, byte; u_char c; bool flag; addr =3D 0; dots =3D 0; for (;; ++s) { byte =3D 0; flag =3D false; if (*s =3D=3D '0') { ++s; if (*s =3D=3D 'x' || *s =3D=3D 'X') { ++s; base =3D 16; } else { base =3D 8; flag =3D true; } } else base =3D 10; for (; (c =3D *s) !=3D '\0'; ++s) { d =3D digittoint(c); if (c !=3D '0' && (d =3D=3D 0 || d >=3D base)) break; byte =3D byte * base + d; if (byte > UINT8_MAX) return (INADDR_NONE); flag =3D true; } if (!flag) return (INADDR_NONE); addr =3D (addr << 8) | byte; if (c !=3D '.') break; if (++dots =3D=3D 4) return (INADDR_NONE); } return (c =3D=3D '\0' ? addr : INADDR_NONE); } int main(void) { const char *const addr_str_tbl[] =3D { "0x12", "127.1", "127.1.2.3", "0x123456", "0x12.0x34", "0x12.0x345", "1.2.3.4.5", "1..3.4", ".", "1.", ".1", "0x", "0", "01.02.07.077", "0x1.23.045.0", "", " ", " f", "bar", "1.2bar", "1.", "=CA=C3=D5=CB=C5=CE", "255.255.255.255", "x", "0X12"= , "078", "1 bar", "127.0xabcd", "128", "0.1.2", "0xff.010.23.0xa0", "x10", "X20", "x10.x20", "4294967297", "0x10000000f", "040000000003", NULL }; const char *const *addr_str; size_t len; in_addr_t addr1, addr2; printf("STRING\t\t\tINET_NETWORK\tINET_NETWORK_NEW\n"); for (addr_str =3D addr_str_tbl; *addr_str !=3D NULL; ++addr_str) { printf("\"%s\"", *addr_str); len =3D strlen(*addr_str) + 2; if (len < 8) printf("\t\t\t"); else if (len < 16) printf("\t\t"); else printf("\t"); addr1 =3D inet_network(*addr_str); if (addr1 =3D=3D INADDR_NONE) printf("INADDR_NONE\t"); else printf("0x%08x\t", addr1); addr2 =3D inet_network_new(*addr_str); if (addr2 =3D=3D INADDR_NONE) printf("INADDR_NONE"); else printf("0x%08x", addr2); if (addr1 !=3D addr2) printf("\t<---"); printf("\n"); } return (0); }