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
Defined variables
Defined macros