Annotation of researchv10dc/ipc/libin/in_subrs.c, revision 1.1.1.1

1.1       root        1: #include <ctype.h>
                      2: #include <sys/inet/in.h>
                      3: #include <ipc.h>
                      4: 
                      5: extern in_addr in_aton();
                      6: 
                      7: /* Get the next token in a string, returning a pointer the the byte
                      8:  * following the token.
                      9:  */
                     10: char *
                     11: in_getw(buf, w)
                     12: char *buf, *w;
                     13: {
                     14:        *w = 0;
                     15:        while(isspace(*buf)) buf++;
                     16:        if(*buf == '\0')
                     17:                return(0);
                     18:        while(!isspace(*buf) && *buf)
                     19:                *w++ = *buf++;
                     20:        *w = 0;
                     21:        return(buf);
                     22: }
                     23: 
                     24: /* get the network that a host is on */
                     25: in_addr
                     26: in_netof(x)
                     27: in_addr x;
                     28: {
                     29:        if(IN_CLASSC(x))
                     30:                return(x&IN_CLASSC_NET);
                     31:        else if(IN_CLASSB(x))
                     32:                return(x&IN_CLASSB_NET);
                     33:        else
                     34:                return(x&IN_CLASSA_NET);
                     35: }
                     36: 
                     37: /*
                     38:  *  get the subnetwork that a host is on.  if the mask is not a superset
                     39:  *  the classmask, just use the classmask.
                     40:  */
                     41: in_addr
                     42: in_subnetof(x, mask)
                     43:        in_addr x;
                     44:        in_addr mask;
                     45: {
                     46:        in_addr cmask;
                     47: 
                     48:        if(IN_CLASSC(x))
                     49:                cmask = IN_CLASSC_NET;
                     50:        else if(IN_CLASSB(x))
                     51:                cmask = IN_CLASSB_NET;
                     52:        else
                     53:                cmask = IN_CLASSA_NET;
                     54:        if((cmask&mask) != cmask)
                     55:                return x & cmask;
                     56:        else
                     57:                return x & mask;
                     58: }
                     59: 
                     60: /*
                     61:  *  get the ip address for `name' on same net as `naddr'
                     62:  */
                     63: in_addr
                     64: in_addronnet(name, naddr, mask)
                     65:        char *name;
                     66:        in_addr naddr;
                     67:        in_addr mask;
                     68: {
                     69:        in_addr taddr;
                     70:        Qset *sp, *tsp;
                     71:        Qtuple *tp;
                     72: 
                     73:        /*
                     74:         *  get the subnetwork naddr is on
                     75:         */
                     76:        naddr = in_subnetof(naddr, mask);
                     77: 
                     78:        /*
                     79:         *  if `name' is numeric, don't call the name server
                     80:         */
                     81:        if(*name >= '0' && *name <= '9'){
                     82:                taddr = in_aton(name);
                     83:                if(in_subnetof(taddr, mask)!=naddr)
                     84:                        taddr = 0;
                     85:                return taddr;
                     86:        }
                     87: 
                     88:        /*
                     89:         *  ask name server for a set of possibilities
                     90:         */
                     91:        sp = qset(name, (char *)0);
                     92:        if (!sp)
                     93:                return 0;
                     94: 
                     95:        /*  
                     96:         *  Look for an inet address that matches the network.
                     97:         *  If none found return 0.
                     98:         */
                     99:        for(tsp=sp; tsp; tsp=tsp->next) {
                    100:                for(tp=tsp->this; tp; tp=tp->next)
                    101:                        if(tp->type && strcmp(tp->type, "in")==0){
                    102:                                taddr = in_aton(tp->value);
                    103:                                if(in_subnetof(taddr, mask)==naddr){
                    104:                                        freeQset(sp);
                    105:                                        return taddr;
                    106:                                }
                    107:                        }
                    108:        }
                    109:        freeQset(sp);
                    110:        return 0;
                    111: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.