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

##### Functions

    read_dtab         X

##### Variables

    guess_ndev        X

##### Macros

    STRSAVE           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_dtab.c	2.1 (2.11BSD GTE) 1/10/94
       7:  */
       8:
       9: #include <machine/autoconfig.h>
      10: #include <sys/types.h>
      11: #include <stdio.h>
      12: #include <ctype.h>
      13: #include "dtab.h"
      14: #include "uprobe.h"
      15:
      16: extern UPROBE   uprobe[];
      17:
      18: int guess_ndev = 0;     /* Guess as to size of nlist table */
      19: #define STRSAVE(str)    (strcpy(malloc((u_int)(strlen(str) + 1)),str))
      20:
      21: /*
      22:  * read the device table (/etc/dtab) into internal structures
      23:  * format of lines in the device table are:
      24:  *	device_name unit_number address vector br handler[0-3]	; comment
      25:  *								# comment
      26:  */
      27: read_dtab()
      28: {
      29:     register DTAB   *dp,
      30:             *cdp;
      31:     UPROBE  *up;
      32:     HAND    *sp;
      33:     FILE    *fp;
      34:     int nhandlers,  /* number of handlers per line */
      35:         line;       /* line number in dtab file */
      36:     short   cnt;        /* general counter */
      37:     char    *cp,        /* traveling char pointer */
      38:         *save,      /* save string position */
      39:         buf[500],   /* line buffer */
      40:         name[20],   /* device name */
      41:         unit[5],    /* unit number */
      42:         *index(), *malloc(), *strcpy(), *fgets();
      43:
      44:     if (!(fp = fopen(dtab_name,"r"))) {
      45:         perror(dtab_name);
      46:         exit(AC_SETUP);
      47:     }
      48:     for (line = 1,devs = NULL;fgets(buf, sizeof(buf), fp);++line) {
      49:         if (cp = index(buf, '\n'))
      50:             *cp = EOS;
      51:         else {
      52:             fprintf(stderr,"%s: line %d too long.\n",myname,line);
      53:             exit(AC_SINGLE);
      54:         }
      55:         for (cp = buf;isspace(*cp);++cp);
      56:         if (!*cp || cp == ';' || *cp == '#')
      57:             continue;
      58:         dp = (DTAB *)malloc(sizeof(DTAB));
      59:         if (sscanf(buf," %s %s %o %o %o ",name,unit,&dp->dt_addr,&dp->dt_vector,&dp->dt_br) != 5) {
      60:             fprintf(stderr,"%s: missing information on line %d.\n",myname,line);
      61:             exit(AC_SINGLE);
      62:         }
      63:         dp->dt_name = STRSAVE(name);
      64:         dp->dt_unit = *unit == '?' ? -1 : atoi(unit);
      65:         for (cnt = 0;cnt < 5;++cnt) {
      66:             for (;!isspace(*cp);++cp);
      67:             for (;isspace(*cp);++cp);
      68:         }
      69:         dp->dt_probe = dp->dt_attach = (NLIST *)0;
      70:         dp->dt_handlers = (HAND *)0;
      71:         for (nhandlers = 0;;nhandlers) {
      72:             if (!*cp || *cp == ';' || *cp == '#')
      73:                 break;
      74:             if (++nhandlers == 4)
      75:                 fprintf(stderr,"%s: warning: more than three handlers for device %s on line %d.\n",myname,dp->dt_name,line);
      76:             for (save = cp;!isspace(*cp);++cp);
      77:             *cp = EOS;
      78:             addent(&dp->dt_handlers,STRSAVE(save));
      79:             for (++cp;isspace(*cp);++cp);
      80:         }
      81:         guess_ndev += nhandlers;
      82: /*
      83:  * In addition to the "handler" symbols for a device we need 3 more
      84:  * symbols: 'xxVec', 'xxprobe', and 'xxattach'.
      85:  *
      86:  * N.B.  If more symbols are added (to the 'DTAB' structure) the following
      87:  *       line may need to be modified.
      88: */
      89:         guess_ndev += 3;
      90:         for (up = uprobe;up->up_name;++up)
      91:             if (!strcmp(dp->dt_name,up->up_name)) {
      92:                 dp->dt_uprobe = up->up_func;
      93:                 break;
      94:             }
      95:         dp->dt_next = NULL;
      96:         if (!devs)
      97:             devs = cdp = dp;
      98:         else {
      99:             cdp->dt_next = dp;
     100:             cdp = dp;
     101:         }
     102:     }
     103: }
     104:
     105: static
     106: addent(listp, cp)
     107: HAND    **listp;
     108: char    *cp;
     109: {
     110:     HAND    *el,
     111:         *sp;
     112:     char    *malloc();
     113:
     114:     el = (HAND *)malloc(sizeof(HAND));
     115:     el->s_str = cp;
     116:     el->s_next = NULL;
     117:     if (!*listp)
     118:         *listp = el;
     119:     else {
     120:         for (sp = *listp;sp->s_next; sp = sp->s_next);
     121:         sp->s_next = el;
     122:     }
     123: }

#### Defined functions

addent defined in line 105; used 1 times

- in line 78

read_dtab defined in line 27; used 1 times

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

#### Defined variables

guess_ndev defined in line 18; used 3 times

- in line 81, 89
- in /usr/src/sys/autoconfig/read_nlist.c line 58

#### Defined macros

STRSAVE defined in line 19; used 2 times

- in line 63, 78

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