Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Oct 2012 10:37:56 -0700
From:      Adrian Chadd <adrian@freebsd.org>
To:        Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua>
Cc:        freebsd-net@freebsd.org
Subject:   Re: kern/92880: [libc] [patch] almost rewritten inet_network(3) function
Message-ID:  <CAJ-VmomcmWEBWAeBboomwqk3X0D09qGdXxyuw5yiuj0W5zkDbg@mail.gmail.com>
In-Reply-To: <201210230840.q9N8e038066538@freefall.freebsd.org>
References:  <201210230840.q9N8e038066538@freefall.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
... 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@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@comsys.ntu-kpi.kiev.ua>
> 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 <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@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-net
> To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAJ-VmomcmWEBWAeBboomwqk3X0D09qGdXxyuw5yiuj0W5zkDbg>