kern/92880: [libc] [patch] almost rewritten inet_network(3) function
Adrian Chadd
adrian at freebsd.org
Tue Oct 23 17:37:56 UTC 2012
... don't suppose you want to throw this into a test case somewhere in the tree?
The new ATF import would be ideal for this. :)
Adrian
On 23 October 2012 01:40, Andrey Simonenko <simon at comsys.ntu-kpi.kiev.ua> wrote:
> The following reply was made to PR kern/92880; it has been noted by GNATS.
>
> From: Andrey Simonenko <simon at comsys.ntu-kpi.kiev.ua>
> To: bug-followup at 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 <sys/types.h>
> #include <sys/socket.h>
>
> #include <netinet/in.h>
> #include <arpa/inet.h>
>
> #include <ctype.h>
> #include <stdbool.h>
> #include <stdint.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> 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);
> }
> _______________________________________________
> freebsd-net at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
More information about the freebsd-net
mailing list