Line data Source code
1 : #include "fd_ip4.h" 2 : #include "../fd_util.h" 3 : 4 : #include <stdlib.h> 5 : 6 : 7 : /* FIXME add bounds checks to fd_util version */ 8 : static int 9 108 : __fd_cstr_to_uchar( char const * cstr ) { 10 108 : char const * endptr = NULL; 11 108 : ulong value = strtoul( cstr, (char **)&endptr, 10 ); 12 108 : if( FD_UNLIKELY( cstr==endptr || endptr[0] || value>UCHAR_MAX ) ) return -1; 13 96 : return (int)value; 14 108 : } 15 : 16 : 17 : int 18 : fd_cstr_to_ip4_addr( char const * s, 19 42 : uint * out ) { 20 : 21 42 : char _s[ 16 ]; 22 42 : strncpy( _s, s, 15 ); 23 42 : _s[ 15 ] = '\0'; 24 : 25 42 : char *tok[ 5 ]; 26 42 : if( FD_UNLIKELY( fd_cstr_tokenize( tok, 5UL, _s, '.' )!=4UL ) ) 27 15 : return 0; 28 : 29 27 : int v0 = __fd_cstr_to_uchar( tok[ 0 ] ); 30 27 : int v1 = __fd_cstr_to_uchar( tok[ 1 ] ); 31 27 : int v2 = __fd_cstr_to_uchar( tok[ 2 ] ); 32 27 : int v3 = __fd_cstr_to_uchar( tok[ 3 ] ); 33 27 : if( FD_UNLIKELY( (v0<0)|(v1<0)|(v2<0)|(v3<0) ) ) return 0; 34 15 : *out = FD_IP4_ADDR( v0, v1, v2, v3 ); 35 15 : return 1; 36 27 : }