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