decodenetnum.c revision 54359
131921Sbrian/* 231921Sbrian * decodenetnum - return a net number (this is crude, but careful) 331921Sbrian */ 431921Sbrian#include <sys/types.h> 531921Sbrian#include <ctype.h> 631921Sbrian#include <sys/socket.h> 731921Sbrian#include <netinet/in.h> 831921Sbrian 931921Sbrian#include "ntp_stdlib.h" 1031921Sbrian 1131921Sbrianint 1231921Sbriandecodenetnum( 1331921Sbrian const char *num, 1431921Sbrian u_int32 *netnum 1531921Sbrian ) 1631921Sbrian{ 1731921Sbrian register const char *cp; 1831921Sbrian register char *bp; 1931921Sbrian register int i; 2031921Sbrian register int temp; 2131921Sbrian register int eos; 2231921Sbrian char buf[80]; /* will core dump on really stupid stuff */ 2331921Sbrian 2431921Sbrian cp = num; 2531921Sbrian *netnum = 0; 2650479Speter 2731272Sbrian if (*cp == '[') { 2831272Sbrian eos = ']'; 2936285Sbrian cp++; 3031272Sbrian } else { 3131272Sbrian eos = '\0'; 3249434Sbrian } 3336285Sbrian 3436285Sbrian for (i = 0; i < 4; i++) { 3531272Sbrian bp = buf; 3631272Sbrian while (isdigit((int)*cp)) 3731343Sbrian *bp++ = *cp++; 3831272Sbrian if (bp == buf) 3931272Sbrian break; 4036285Sbrian 4136285Sbrian if (i < 3) { 4231272Sbrian if (*cp++ != '.') 4364670Sbrian break; 4431272Sbrian } else if (*cp != eos) 4549434Sbrian break; 4631272Sbrian 4765178Sbrian *bp = '\0'; 4849434Sbrian temp = atoi(buf); 4964670Sbrian if (temp > 255) 5064670Sbrian break; 5164670Sbrian *netnum <<= 8; 5264670Sbrian *netnum += temp; 5364670Sbrian } 5464670Sbrian 5564670Sbrian if (i < 4) 5649434Sbrian return 0; 5749434Sbrian *netnum = htonl(*netnum); 5836285Sbrian return 1; 5936285Sbrian} 6036285Sbrian