Xinu7/src/serve11/sys/dgparse.c

/* dgparse.c - dgparse */

#include <conf.h>
#include <kernel.h>
#include <network.h>
#include <ctype.h>

/*------------------------------------------------------------------------
 *  dgparse  -  parse foreign address specification; get IP and port #s
 *------------------------------------------------------------------------
 */
dgparse(dgptr, fspec)
struct	dgblk	*dgptr;
char	*fspec;
{
	int	i, byte;
	char	ch;
	char	*ipptr;

	if (fspec == ANYFPORT) {
		dgptr->dg_fport = 0;
		return(OK);
	}

	/* parse forms like 192.5.48.30:3 into (ip-address,udp-port) */

	ipptr = (char *) dgptr->dg_faddr;
	for (i=0 ; i<4 ; i++) {
		byte = 0;
		while ( isdigit(ch = *fspec++) )
			byte = 10*byte + (ch - '0');
		if (byte > 256 || (i<3 && ch!='.') )
			return(SYSERR);
		*ipptr++ = (char)byte;
	}
	if (ch != ':')
		return(SYSERR);
	i = 0;
	while ( isdigit(ch = *fspec++) )
		i = 10*i + (ch - '0');
	if (i==0 || ch!='\0')
		return(SYSERR);
	dgptr->dg_fport = i;
	return(OK);
}