Annotation of 43BSDReno/lib/libc/net/ns_addr.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1986 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * J.Q. Johnson.
                      7:  *
                      8:  * Redistribution and use in source and binary forms are permitted provided
                      9:  * that: (1) source distributions retain this entire copyright notice and
                     10:  * comment, and (2) distributions including binaries display the following
                     11:  * acknowledgement:  ``This product includes software developed by the
                     12:  * University of California, Berkeley and its contributors'' in the
                     13:  * documentation or other materials provided with the distribution and in
                     14:  * all advertising materials mentioning features or use of this software.
                     15:  * Neither the name of the University nor the names of its contributors may
                     16:  * be used to endorse or promote products derived from this software without
                     17:  * specific prior written permission.
                     18:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     19:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     20:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     21:  */
                     22: 
                     23: #if defined(LIBC_SCCS) && !defined(lint)
                     24: static char sccsid[] = "@(#)ns_addr.c  6.6 (Berkeley) 6/6/90";
                     25: #endif /* LIBC_SCCS and not lint */
                     26: 
                     27: #include <sys/types.h>
                     28: #include <netns/ns.h>
                     29: 
                     30: static struct ns_addr addr, zero_addr;
                     31: 
                     32: struct ns_addr 
                     33: ns_addr(name)
                     34:        char *name;
                     35: {
                     36:        char separator = '.';
                     37:        char *hostname, *socketname, *cp;
                     38:        char buf[50];
                     39:        extern char *index();
                     40: 
                     41:        addr = zero_addr;
                     42:        (void)strncpy(buf, name, 49);
                     43: 
                     44:        /*
                     45:         * First, figure out what he intends as a field separtor.
                     46:         * Despite the way this routine is written, the prefered
                     47:         * form  2-272.AA001234H.01777, i.e. XDE standard.
                     48:         * Great efforts are made to insure backward compatability.
                     49:         */
                     50:        if (hostname = index(buf, '#'))
                     51:                separator = '#';
                     52:        else {
                     53:                hostname = index(buf, '.');
                     54:                if ((cp = index(buf, ':')) &&
                     55:                    ( (hostname && cp < hostname) || (hostname == 0))) {
                     56:                        hostname = cp;
                     57:                        separator = ':';
                     58:                }
                     59:        }
                     60:        if (hostname)
                     61:                *hostname++ = 0;
                     62:        Field(buf, addr.x_net.c_net, 4);
                     63:        if (hostname == 0)
                     64:                return (addr);  /* No separator means net only */
                     65: 
                     66:        socketname = index(hostname, separator);
                     67:        if (socketname) {
                     68:                *socketname++ = 0;
                     69:                Field(socketname, (u_char *)&addr.x_port, 2);
                     70:        }
                     71: 
                     72:        Field(hostname, addr.x_host.c_host, 6);
                     73: 
                     74:        return (addr);
                     75: }
                     76: 
                     77: static
                     78: Field(buf, out, len)
                     79: char *buf;
                     80: u_char *out;
                     81: int len;
                     82: {
                     83:        register char *bp = buf;
                     84:        int i, ibase, base16 = 0, base10 = 0, clen = 0;
                     85:        int hb[6], *hp;
                     86:        char *fmt;
                     87: 
                     88:        /*
                     89:         * first try 2-273#2-852-151-014#socket
                     90:         */
                     91:        if ((*buf != '-') &&
                     92:            (1 < (i = sscanf(buf, "%d-%d-%d-%d-%d",
                     93:                        &hb[0], &hb[1], &hb[2], &hb[3], &hb[4])))) {
                     94:                cvtbase(1000L, 256, hb, i, out, len);
                     95:                return;
                     96:        }
                     97:        /*
                     98:         * try form 8E1#0.0.AA.0.5E.E6#socket
                     99:         */
                    100:        if (1 < (i = sscanf(buf,"%x.%x.%x.%x.%x.%x",
                    101:                        &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
                    102:                cvtbase(256L, 256, hb, i, out, len);
                    103:                return;
                    104:        }
                    105:        /*
                    106:         * try form 8E1#0:0:AA:0:5E:E6#socket
                    107:         */
                    108:        if (1 < (i = sscanf(buf,"%x:%x:%x:%x:%x:%x",
                    109:                        &hb[0], &hb[1], &hb[2], &hb[3], &hb[4], &hb[5]))) {
                    110:                cvtbase(256L, 256, hb, i, out, len);
                    111:                return;
                    112:        }
                    113:        /*
                    114:         * This is REALLY stretching it but there was a
                    115:         * comma notation separting shorts -- definitely non standard
                    116:         */
                    117:        if (1 < (i = sscanf(buf,"%x,%x,%x",
                    118:                        &hb[0], &hb[1], &hb[2]))) {
                    119:                hb[0] = htons(hb[0]); hb[1] = htons(hb[1]);
                    120:                hb[2] = htons(hb[2]);
                    121:                cvtbase(65536L, 256, hb, i, out, len);
                    122:                return;
                    123:        }
                    124: 
                    125:        /* Need to decide if base 10, 16 or 8 */
                    126:        while (*bp) switch (*bp++) {
                    127: 
                    128:        case '0': case '1': case '2': case '3': case '4': case '5':
                    129:        case '6': case '7': case '-':
                    130:                break;
                    131: 
                    132:        case '8': case '9':
                    133:                base10 = 1;
                    134:                break;
                    135: 
                    136:        case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
                    137:        case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
                    138:                base16 = 1;
                    139:                break;
                    140:        
                    141:        case 'x': case 'X':
                    142:                *--bp = '0';
                    143:                base16 = 1;
                    144:                break;
                    145: 
                    146:        case 'h': case 'H':
                    147:                base16 = 1;
                    148:                /* fall into */
                    149: 
                    150:        default:
                    151:                *--bp = 0; /* Ends Loop */
                    152:        }
                    153:        if (base16) {
                    154:                fmt = "%3x";
                    155:                ibase = 4096;
                    156:        } else if (base10 == 0 && *buf == '0') {
                    157:                fmt = "%3o";
                    158:                ibase = 512;
                    159:        } else {
                    160:                fmt = "%3d";
                    161:                ibase = 1000;
                    162:        }
                    163: 
                    164:        for (bp = buf; *bp++; ) clen++;
                    165:        if (clen == 0) clen++;
                    166:        if (clen > 18) clen = 18;
                    167:        i = ((clen - 1) / 3) + 1;
                    168:        bp = clen + buf - 3;
                    169:        hp = hb + i - 1;
                    170: 
                    171:        while (hp > hb) {
                    172:                (void)sscanf(bp, fmt, hp);
                    173:                bp[0] = 0;
                    174:                hp--;
                    175:                bp -= 3;
                    176:        }
                    177:        (void)sscanf(buf, fmt, hp);
                    178:        cvtbase((long)ibase, 256, hb, i, out, len);
                    179: }
                    180: 
                    181: static
                    182: cvtbase(oldbase,newbase,input,inlen,result,reslen)
                    183:        long oldbase;
                    184:        int newbase;
                    185:        int input[];
                    186:        int inlen;
                    187:        unsigned char result[];
                    188:        int reslen;
                    189: {
                    190:        int d, e;
                    191:        long sum;
                    192: 
                    193:        e = 1;
                    194:        while (e > 0 && reslen > 0) {
                    195:                d = 0; e = 0; sum = 0;
                    196:                /* long division: input=input/newbase */
                    197:                while (d < inlen) {
                    198:                        sum = sum*oldbase + (long) input[d];
                    199:                        e += (sum > 0);
                    200:                        input[d++] = sum / newbase;
                    201:                        sum %= newbase;
                    202:                }
                    203:                result[--reslen] = sum; /* accumulate remainder */
                    204:        }
                    205:        for (d=0; d < reslen; d++)
                    206:                result[d] = 0;
                    207: }

unix.superglobalmegacorp.com

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