# 2.11BSD#431 - /usr/src/sys/autoconfig/read_nlist.c

##### Functions

    add_nlist         X
    read_nlist        X

##### Variables

    bad_nl            X
    end_vector        X
    good_nl           X
    int_nl            X
    next_nl           X
    nl                X
    np                X
    sep_nl            X
    trap_nl           X
    vers_nl           X

##### Macros

    BAD_NAME          X
    END_NAME          X
    GOOD_NAME         X
    INT_NAME          X
    NEXTIV_NAME       X
    SEPID_NAME        X
    TRAP_NAME         X
    VERSION           X
    round             X

       1: /*
       2:  * Copyright (c) 1986 Regents of the University of California.
       3:  * All rights reserved.  The Berkeley software License Agreement
       4:  * specifies the terms and conditions for redistribution.
       5:  *
       6:  *	@(#)read_nlist.c	2.2 (2.11BSD GTE) 1/10/94
       7:  */
       8:
       9: /*
      10:  * Read all the symbols we'll need for the devices we want to configure
      11:  * These are -- The probe, attach and handler routines for each device,
      12:  * and a few symbols that we'll need later on.
      13:  */
      14:
      15: #include <machine/autoconfig.h>
      16: #include <sys/param.h>
      17: #include <sys/file.h>
      18: #include <a.out.h>
      19: #include <stdio.h>
      20: #include "dtab.h"
      21:
      22: extern  char    *strdup();
      23: extern  char    *nlist_name;    /* file we read the namelist from */
      24: extern int  guess_ndev; /* number of lines read from dtab */
      25: extern int  debug;
      26: extern int  kmem;
      27: extern int  pflag;
      28: NLIST   *nl, *np, *int_nl, *good_nl, *bad_nl, *trap_nl, *sep_nl, *vers_nl,
      29:     *add_nlist(), *end_vector, *next_nl;
      30:
      31: #define END_NAME    "endvec"
      32: #define NEXTIV_NAME "_nextiv"   /* floating vector allocator */
      33: #define INT_NAME    "_conf_int"
      34: #define GOOD_NAME   "CGOOD"
      35: #define BAD_NAME    "CBAD"
      36: #define TRAP_NAME   "trap"
      37: #define SEPID_NAME  "KERN_NONSEP"   /* KERN_NONSEP */
      38: #define VERSION     "_version"
      39:
      40: read_nlist()
      41: {
      42:     register NLIST  **lp,
      43:             *nnp;
      44:     register DTAB   *dp;
      45:     struct exec head;
      46:     struct ovlhdr   ovhead;
      47:     HAND    *already = (HAND *)NULL,
      48:         *sp;
      49:     off_t   offst;
      50:     int unix_fd;
      51:     short   cnt;
      52:     char    tname[20],
      53:         unix_vers[100],
      54:         core_vers[100],
      55:         *calloc();
      56:     NLIST   *add_nlist();
      57:
      58:     np = nl = (NLIST *)calloc(guess_ndev + 10,sizeof(NLIST));
      59:     for (dp = devs; dp != NULL; dp = dp->dt_next) {
      60:         sprintf(tname, "_%sprobe", dp->dt_name);
      61:         dp->dt_probe = add_nlist(tname);
      62:         sprintf(tname, "_%sattach", dp->dt_name);
      63:         dp->dt_attach = add_nlist(tname);
      64:         sprintf(tname, "_%sVec", dp->dt_name);
      65:         dp->dt_setvec = add_nlist(tname);
      66:         for (sp = dp->dt_handlers;sp;sp = sp->s_next)
      67:             sp->s_nl = add_nlist(sp->s_str);
      68:     }
      69:     end_vector = np++;
      70:     end_vector->n_un.n_name = END_NAME;
      71:     int_nl = np++;
      72:     int_nl->n_un.n_name = INT_NAME;
      73:     good_nl = np++;
      74:     good_nl->n_un.n_name = GOOD_NAME;
      75:     bad_nl = np++;
      76:     bad_nl->n_un.n_name = BAD_NAME;
      77:     next_nl = np++;
      78:     next_nl->n_un.n_name = NEXTIV_NAME;
      79:     trap_nl = np++;
      80:     trap_nl->n_un.n_name = TRAP_NAME;
      81:     vers_nl = np++;
      82:     vers_nl->n_un.n_name = VERSION;
      83:     sep_nl = np++;
      84:     sep_nl->n_un.n_name = SEPID_NAME;
      85:
      86:     if ((unix_fd = open(nlist_name,O_RDONLY)) < 0) {
      87:         perror(nlist_name);
      88:         exit(AC_SETUP);
      89:     }
      90:     nlist(nlist_name,nl);
      91:     if (debug || pflag)
      92:         for (np = nl; np->n_un.n_name; np++)
      93:             printf("%s = %o\n", np->n_un.n_name, np->n_value);
      94:     for (np = end_vector; np <= trap_nl; np++)
      95:         if (!np->n_value) {
      96:             fprintf(stderr,"%s: couldn't find symbols in %s.\n",myname,nlist_name);
      97:             exit(AC_SETUP);
      98:         }
      99:     if (!debug) {
     100: #define round(x) (ctob(stoc(ctos(btoc(x)))))
     101:         lseek(unix_fd,(off_t)0,L_SET);
     102:         read(unix_fd,(char *)&head,sizeof(head));
     103:         offst = (off_t)vers_nl->n_value + (off_t)head.a_text + sizeof(head);
     104:         if (head.a_magic == A_MAGIC2 || head.a_magic == A_MAGIC5)
     105:             offst -= (off_t)round(head.a_text);
     106:         if (head.a_magic == A_MAGIC5 || head.a_magic == A_MAGIC6) {
     107:             read(unix_fd,(char *)&ovhead,sizeof(ovhead));
     108:             offst += sizeof(ovhead);
     109:             if (head.a_magic == A_MAGIC5)
     110:                 offst -= (off_t)round(ovhead.max_ovl);
     111:             for (cnt = 0;cnt < NOVL;++cnt)
     112:                 offst += (off_t)ovhead.ov_siz[cnt];
     113:         }
     114:         lseek(unix_fd,offst,L_SET);
     115:         read(unix_fd,unix_vers,sizeof(unix_vers));
     116:         lseek(kmem,(off_t)vers_nl->n_value,L_SET);
     117:         read(kmem,core_vers,sizeof(core_vers));
     118:         unix_vers[99] = core_vers[99] = EOS;    /* Just in case! */
     119:         if (strcmp(unix_vers,core_vers)) {
     120:             fprintf(stderr,"%s: %s is not the running version.\n",myname,nlist_name);
     121:             exit(AC_SETUP);
     122:         }
     123:     }
     124:     close(unix_fd);
     125: }
     126:
     127: /*
     128:  * If the passed symbol is in the nlist table, return pointer to it,
     129:  * otherwise add it to the table and return a pointer to new entry.
     130:  */
     131: NLIST *
     132: add_nlist(name)
     133: char    *name;
     134: {
     135:     register NLIST  *n;
     136:
     137:     for (n = nl;n < np;++n)
     138:         if (!strcmp(n->n_un.n_name, name))
     139:             return(n);
     140:     np->n_un.n_name = strdup(name);
     141:     return(np++);
     142: }

#### Defined functions

add_nlist defined in line 131; used 6 times

- in line 29, 56-67(5)

read_nlist defined in line 40; used 1 times

- in /usr/src/sys/autoconfig/main.c line 77

#### Defined variables

bad_nl defined in line 28; used 7 times

- in line 75-76(2)
- in /usr/src/sys/autoconfig/do_config.c line 93, 245, 335-336(2), 346

end_vector defined in line 29; used 5 times

- in line 69-70(2), 94
- in /usr/src/sys/autoconfig/do_config.c line 275, 345

good_nl defined in line 28; used 3 times

- in line 73-74(2)
- in /usr/src/sys/autoconfig/do_config.c line 252

int_nl defined in line 28; used 4 times

- in line 71-72(2)
- in /usr/src/sys/autoconfig/do_config.c line 181, 301

next_nl defined in line 29; used 3 times

- in line 77-78(2)
- in /usr/src/sys/autoconfig/do_config.c line 228

nl defined in line 28; used 4 times

- in line 58, 90-92(2), 137

np defined in line 28; used 21 times

- in line 58, 69-83(8), 92-95(9), 137-141(3)

sep_nl defined in line 28; used 3 times

- in line 83-84(2)
- in /usr/src/sys/autoconfig/do_config.c line 323

trap_nl defined in line 28; used 6 times

- in line 79-80(2), 94
- in /usr/src/sys/autoconfig/do_config.c line 339-342(2), 348

vers_nl defined in line 28; used 4 times

- in line 81-82(2), 103, 116

#### Defined macros

BAD_NAME defined in line 35; used 1 times

- in line 76

END_NAME defined in line 31; used 1 times

- in line 70

GOOD_NAME defined in line 34; used 1 times

- in line 74

INT_NAME defined in line 33; used 1 times

- in line 72

NEXTIV_NAME defined in line 32; used 1 times

- in line 78

SEPID_NAME defined in line 37; used 1 times

- in line 84

TRAP_NAME defined in line 36; used 1 times

- in line 80

VERSION defined in line 38; used 1 times

- in line 82

round defined in line 100; used 2 times

- in line 105-110(2)

Last modified: 1994-01-15 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1102 |