kern/92880: [libc] [patch] almost rewritten inet_network(3) function
Andrey Simonenko
simon at comsys.ntu-kpi.kiev.ua
Tue Oct 23 08:40:01 UTC 2012
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);
}
More information about the freebsd-net
mailing list