Annotation of cci/usr/src/etc/nstat/arptab.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)if.c       4.4 82/11/14";
                      3: #endif
                      4: 
                      5: #include <sys/types.h>
                      6: #include <sys/socket.h>
                      7: 
                      8: #include <net/if.h>
                      9: #include <netinet/in.h>
                     10: #include <netinet/if_ether.h>
                     11: #include <tahoeif/if_enp.h>
                     12: #include <tahoeif/if_acereg.h>
                     13: #include <netdb.h>
                     14: #include <sys/ioctl.h>
                     15: #include <strings.h>
                     16: #include <errno.h>
                     17: #include <nlist.h>
                     18: 
                     19: #include <stdio.h>
                     20: #include "nstat.h"
                     21: 
                     22: 
                     23: /*
                     24:  * Internet to ethernet address resolution table.
                     25:  */
                     26: struct arptab {
                     27:        struct  in_addr at_iaddr;       /* internet address */
                     28:        u_char  at_enaddr[6];           /* ethernet address */
                     29:        struct  mbuf *at_hold;          /* last packet until resolved/timeout */
                     30:        u_char  at_timer;               /* minutes since last reference */
                     31:        u_char  at_flags;               /* flags */
                     32: };
                     33: /* at_flags field values */
                     34: #define        ATF_INUSE       1               /* entry in use */
                     35: #define ATF_COM                2               /* completed entry (enaddr valid) */
                     36: 
                     37: #define        ARPTAB_BSIZ     5               /* bucket size */
                     38: #define        ARPTAB_NB       19              /* number of buckets */
                     39: #define        ARPTAB_SIZE     (ARPTAB_BSIZ * ARPTAB_NB)
                     40: 
                     41: #define ACE    0                       /* ace driver type      */
                     42: #define ENP    1                       /* enp driver type      */
                     43: 
                     44: 
                     45: struct nlist   arptabnl[] = {
                     46: #                              define  N_ARPTAB        0
                     47:        { "_arptab" },
                     48: #                              define  N_NUMACE        1
                     49:        { "_numace" },
                     50: #                              define  N_NUMENP        2
                     51:        { "_numenp" },
                     52: #                              define  N_ACESOFTC      3
                     53:        { "_ace_softc" },
                     54: #                              define  N_ENPSOFTC      4
                     55:        { "_enp_softc" },
                     56:        { "" },
                     57: };
                     58: extern int     kmem;
                     59: extern char    *system;
                     60: extern struct  ace_softc       acesoftc[];
                     61: extern struct  enp_softc       enpsoftc[];
                     62: extern int     s;                              /* socket id    */
                     63: char   what_host[] = "NOT in /etc/hosts";
                     64: 
                     65: /*
                     66:  * Print a description of the network interfaces.
                     67:  */
                     68: 
                     69: arptab()
                     70: {
                     71:        static  off_t   arptabaddr,
                     72:                        numaceaddr,
                     73:                        numenpaddr,
                     74:                        enpsoftcaddr,
                     75:                        acesoftcaddr;
                     76: 
                     77:        struct arptab arp_tab[ARPTAB_SIZE];
                     78:        struct arptab *at = arp_tab;
                     79:        struct hostent *h;
                     80:        char    hostname[64];
                     81:        static  int getvm = 0;
                     82:        int i, num, dontrepeat = 0;
                     83: 
                     84: 
                     85:        if (!getvm) {
                     86:                nlist(system, arptabnl);
                     87:                arptabaddr = arptabnl[N_ARPTAB].n_value;
                     88:                numaceaddr = arptabnl[N_NUMACE].n_value;
                     89:                numenpaddr = arptabnl[N_NUMENP].n_value;
                     90:                acesoftcaddr = arptabnl[N_ACESOFTC].n_value;
                     91:                enpsoftcaddr = arptabnl[N_ENPSOFTC].n_value;
                     92:                if (arptabaddr == 0 || numaceaddr == 0 || numenpaddr == 0 ||
                     93:                    acesoftcaddr == 0 || enpsoftcaddr == 0) {
                     94:                    printf("arptab: symbol not defined\n");
                     95:                    return;
                     96:                }
                     97:                ++getvm;
                     98:        }
                     99:        printf("%-20s %-15.10s %-10.10s","Hostname","Internet","Ethernet");
                    100:        putchar('\n');
                    101: 
                    102: /* Search for its own Ethernet Addresses       */
                    103: 
                    104:        klseek(kmem, numaceaddr, 0);
                    105:        read(kmem, (char *)&num, sizeof (int));
                    106:        if ( num ) {    /* if there is any ace  */
                    107:                klseek(kmem, acesoftcaddr, 0);
                    108:                read(kmem, acesoftc, sizeof (struct ace_softc)*num);
                    109:                while (--num >= 0) {
                    110:                        struct ace_softc *is = &acesoftc[num];
                    111:                        struct ifnet    *ifp = &is->is_if;
                    112: 
                    113:                        if (ifp->if_flags & IFF_RUNNING) {/*is it operating ?*/
                    114: 
                    115:                           gethostname(hostname, sizeof(hostname));
                    116:                           h = gethostbyname(hostname);
                    117:                           output(h, h->h_addr, is->is_addr); 
                    118:                           if (ifp->if_flags & IFF_NOARP) 
                    119:                                        continue;
                    120:                           if (dontrepeat < 5) {
                    121:                                whoisup(ifp);
                    122:                                dontrepeat++;
                    123:                           }
                    124:                        }
                    125:                }       
                    126:        } 
                    127: 
                    128:        klseek(kmem, numenpaddr, 0);
                    129:        read(kmem, (char *)&num, sizeof (int));
                    130: 
                    131:        if ( num ) {    /* if there is any enp  */
                    132:                klseek(kmem, enpsoftcaddr, 0);
                    133:                read(kmem, enpsoftc, sizeof(struct enp_softc)*num);
                    134:                while (--num >= 0) {
                    135:                        struct enp_softc *es = &enpsoftc[num];
                    136:                        struct ifnet    *ifp = &es->es_if;
                    137: 
                    138:                        if (ifp->if_flags & IFF_RUNNING) {/*is it up ?*/
                    139: 
                    140:                           gethostname(hostname, sizeof(hostname));
                    141:                           h = gethostbyname(hostname);
                    142:                           output(h, h->h_addr, es->es_enaddr);
                    143:                           if (ifp->if_flags & IFF_NOARP) 
                    144:                                        continue;
                    145:                           if (dontrepeat < 5) {
                    146:                                whoisup(ifp);
                    147:                                dontrepeat++;
                    148:                           }
                    149:                        }
                    150:                }       
                    151: 
                    152:        }  
                    153: 
                    154: 
                    155: /* And then, foreign hosts' Ethernet Addresses */
                    156: 
                    157:        klseek(kmem, arptabaddr, 0);
                    158:        read(kmem, (char *)arp_tab, sizeof (struct arptab)*ARPTAB_SIZE);
                    159:         gethostname(hostname, sizeof(hostname));
                    160:        for (i = 0; i < ARPTAB_SIZE; i++, at++) {
                    161:                if (at->at_flags) {  /* if entry not empty */
                    162:                        struct hostent *h;
                    163: 
                    164:                        /* Read /etc/hosts to find out hostname */
                    165:                        h = gethostbyaddr(&at->at_iaddr,sizeof(struct in_addr),
                    166:                                          AF_INET);
                    167:                        /* Print hostname and internet addr, excluding
                    168:                           local host entries that are already printed 
                    169:                        */
                    170:                        if (strcmp(h->h_name, hostname))
                    171:                                output(h, &at->at_iaddr, at->at_enaddr);
                    172:                }
                    173:        }
                    174: }
                    175: 
                    176: 
                    177: 
                    178: output(hent, inaddr, enaddr)
                    179: struct hostent *hent;
                    180: struct in_addr *inaddr;
                    181: u_char         *enaddr;
                    182: {
                    183:        char    line[20], *h_name;
                    184:        u_char *ucp = (u_char *)inaddr;
                    185:        int j, lna;
                    186: 
                    187:        lna = inet_lnaof( *inaddr );
                    188:        if (lna != INADDR_ANY) {
                    189:                sprintf(line, "%u.%u.%u.%u", ucp[0], ucp[1], ucp[2], ucp[3]);
                    190: 
                    191:                if (hent == NULL)
                    192:                        h_name = what_host;
                    193:                else
                    194:                        h_name = hent->h_name;
                    195: 
                    196:                printf("%-20s %-10.10s      ", h_name, line);
                    197:                for (j = 0 ; j < ETHADDR_SIZE-1; j++) 
                    198:                        printf("%x.", (enaddr[j] & 0xff));
                    199:                printf("%x\n", (enaddr[j] & 0xff));
                    200:        }
                    201: }
                    202: 
                    203: 
                    204: /* probe around to see who is up & then ask for its ethernet addr */
                    205: 
                    206: whoisup(ifp)
                    207: struct ifnet *ifp;
                    208: {
                    209:        register struct ifreq   ifr;
                    210:        register struct hostent *p;
                    211:        struct  in_addr in;
                    212:        int     net;
                    213:        char    *cp;
                    214: 
                    215:        klseek(kmem, (off_t)ifp->if_name, 0);
                    216:        read(kmem, ifr.ifr_name, sizeof(ifr.ifr_name));
                    217:        ifr.ifr_name[IFNAMSIZ] = '\0';
                    218:        cp = index(ifr.ifr_name, '\0');
                    219:        *cp++ = '0' + ifp->if_unit;
                    220:        *cp = 0;
                    221:        sethostent(0);
                    222: 
                    223:        while (p = gethostent()) { 
                    224:                net = inet_netof(*(struct in_addr *)p->h_addr);
                    225:                if (net == ifp->if_net) {
                    226:                        ifr.ifr_data = p->h_addr;
                    227:                        if (ioctl(s, SIOCGETETADDR, (caddr_t)&ifr) < 0) {
                    228:                                Perror("ioctl (SIOCGETETADDR)");
                    229:                                exit(1);
                    230:                        }
                    231:                }
                    232:        }
                    233:        endhostent();
                    234:        return;         /* at this point arptab is updated & ready for nstat */
                    235: }
                    236: 
                    237: Perror(cmd)
                    238:        char *cmd;
                    239: {
                    240:        extern int errno;
                    241: 
                    242:        fprintf(stderr, "arptab: ");
                    243:        switch (errno) {
                    244: 
                    245:        case ENXIO:
                    246:                fprintf(stderr, "%s: ", cmd);
                    247:                fprintf(stderr, "no such interface\n");
                    248:                break;
                    249: 
                    250:        case EPERM:
                    251:                fprintf(stderr, "%s: permission denied\n", cmd);
                    252:                break;
                    253: 
                    254:        default:
                    255:                perror(cmd);
                    256:        }
                    257:        exit(1);
                    258: }
                    259: 

unix.superglobalmegacorp.com

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