This source file includes following definitions.
- devopen
- devboot
- putchar
- getchar
- ttyname
- ttydev
- cnspeed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #include "libsa.h"
31 #include "biosdev.h"
32 #include <sys/param.h>
33 #include <dev/cons.h>
34
35 extern int debug;
36
37 extern char *fs_name[];
38 extern int nfsname;
39 extern struct devsw netsw[];
40
41 extern char *bootmac;
42
43
44 const char bdevs[][4] = {
45 "wd", "", "fd", "", "sd", "st", "cd", "mcd",
46 "", "", "", "", "", "", "", "scd", "", "hd", ""
47 };
48 const int nbdevs = NENTS(bdevs);
49
50 const char cdevs[][4] = {
51 "cn", "", "", "", "", "", "", "",
52 "com", "", "", "", "pc"
53 };
54 const int ncdevs = NENTS(cdevs);
55
56
57 int
58 devopen(struct open_file *f, const char *fname, char **file)
59 {
60 struct devsw *dp = devsw;
61 char *p;
62 char *stripdev;
63 int i, l;
64 int rc = 1;
65
66 *file = (char *)fname;
67
68 #ifdef DEBUG
69 if (debug)
70 printf("devopen(%s):", fname);
71 #endif
72
73
74 for (p = (char *)fname; *p != ':' && *p != '\0'; ) p++;
75 if (*p != ':')
76 return 1;
77 stripdev = p + 1;
78
79 l = p - fname;
80 for (i = 0; i < nfsname; i++) {
81 if ((fs_name[i] != NULL) &&
82 (strncmp(fname, fs_name[i], l) == 0)) {
83
84
85 f->f_ops = &file_system[i];
86 f->f_dev = dp = &netsw[0];
87
88 rc = (*dp->dv_open)(f, NULL);
89 if (rc == 0)
90 *file = stripdev;
91 else
92 f->f_dev = NULL;
93 #ifdef DEBUG
94 if (debug)
95 putchar('\n');
96 #endif
97 return rc;
98 }
99 }
100
101
102
103
104
105
106
107
108
109 bootmac = NULL;
110
111 for (i = 0; i < ndevs && rc != 0; dp++, i++) {
112 #ifdef DEBUG
113 if (debug)
114 printf(" %s: ", dp->dv_name);
115 #endif
116 if ((rc = (*dp->dv_open)(f, file)) == 0) {
117 f->f_dev = dp;
118 return 0;
119 }
120 #ifdef DEBUG
121 else if (debug)
122 printf("%d", rc);
123 #endif
124
125 }
126 #ifdef DEBUG
127 if (debug)
128 putchar('\n');
129 #endif
130
131 if ((f->f_flags & F_NODEV) == 0)
132 f->f_dev = dp;
133
134 return rc;
135 }
136
137 void
138 devboot(dev_t bootdev, char *p)
139 {
140 *p++ = 't';
141 *p++ = 'f';
142 *p++ = 't';
143 *p++ = 'p';
144 *p = '\0';
145 }
146
147 int pch_pos = 0;
148
149 void
150 putchar(int c)
151 {
152 switch (c) {
153 case '\177':
154 cnputc('\b');
155 cnputc(' ');
156 case '\b':
157 cnputc('\b');
158 if (pch_pos)
159 pch_pos--;
160 break;
161 case '\t':
162 do
163 cnputc(' ');
164 while (++pch_pos % 8);
165 break;
166 case '\n':
167 case '\r':
168 cnputc(c);
169 pch_pos=0;
170 break;
171 default:
172 cnputc(c);
173 pch_pos++;
174 break;
175 }
176 }
177
178 int
179 getchar(void)
180 {
181 register int c = cngetc();
182
183 if (c == '\r')
184 c = '\n';
185
186 if ((c < ' ' && c != '\n') || c == '\177')
187 return c;
188
189 putchar(c);
190
191 return c;
192 }
193
194 char ttyname_buf[8];
195
196 char *
197 ttyname(int fd)
198 {
199 snprintf(ttyname_buf, sizeof ttyname_buf, "%s%d",
200 cdevs[major(cn_tab->cn_dev)], minor(cn_tab->cn_dev));
201
202 return ttyname_buf;
203 }
204
205 dev_t
206 ttydev(char *name)
207 {
208 int i, unit = -1;
209 char *no = name + strlen(name) - 1;
210
211 while (no >= name && *no >= '0' && *no <= '9')
212 unit = (unit < 0 ? 0 : (unit * 10)) + *no-- - '0';
213 if (no < name || unit < 0)
214 return NODEV;
215 for (i = 0; i < ncdevs; i++)
216 if (strncmp(name, cdevs[i], no - name + 1) == 0)
217 return (makedev(i, unit));
218 return NODEV;
219 }
220
221 int
222 cnspeed(dev_t dev, int sp)
223 {
224 if (major(dev) == 8)
225 return (comspeed(dev, sp));
226
227
228 return 9600;
229 }