|
|
researchv10 Norman
#include <ctype.h>
#include <sys/inet/in.h>
#include <ipc.h>
extern in_addr in_aton();
/* Get the next token in a string, returning a pointer the the byte
* following the token.
*/
char *
in_getw(buf, w)
char *buf, *w;
{
*w = 0;
while(isspace(*buf)) buf++;
if(*buf == '\0')
return(0);
while(!isspace(*buf) && *buf)
*w++ = *buf++;
*w = 0;
return(buf);
}
/* get the network that a host is on */
in_addr
in_netof(x)
in_addr x;
{
if(IN_CLASSC(x))
return(x&IN_CLASSC_NET);
else if(IN_CLASSB(x))
return(x&IN_CLASSB_NET);
else
return(x&IN_CLASSA_NET);
}
/*
* get the subnetwork that a host is on. if the mask is not a superset
* the classmask, just use the classmask.
*/
in_addr
in_subnetof(x, mask)
in_addr x;
in_addr mask;
{
in_addr cmask;
if(IN_CLASSC(x))
cmask = IN_CLASSC_NET;
else if(IN_CLASSB(x))
cmask = IN_CLASSB_NET;
else
cmask = IN_CLASSA_NET;
if((cmask&mask) != cmask)
return x & cmask;
else
return x & mask;
}
/*
* get the ip address for `name' on same net as `naddr'
*/
in_addr
in_addronnet(name, naddr, mask)
char *name;
in_addr naddr;
in_addr mask;
{
in_addr taddr;
Qset *sp, *tsp;
Qtuple *tp;
/*
* get the subnetwork naddr is on
*/
naddr = in_subnetof(naddr, mask);
/*
* if `name' is numeric, don't call the name server
*/
if(*name >= '0' && *name <= '9'){
taddr = in_aton(name);
if(in_subnetof(taddr, mask)!=naddr)
taddr = 0;
return taddr;
}
/*
* ask name server for a set of possibilities
*/
sp = qset(name, (char *)0);
if (!sp)
return 0;
/*
* Look for an inet address that matches the network.
* If none found return 0.
*/
for(tsp=sp; tsp; tsp=tsp->next) {
for(tp=tsp->this; tp; tp=tp->next)
if(tp->type && strcmp(tp->type, "in")==0){
taddr = in_aton(tp->value);
if(in_subnetof(taddr, mask)==naddr){
freeQset(sp);
return taddr;
}
}
}
freeQset(sp);
return 0;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.