Annotation of sys/arch/i386/stand/pxeboot/devopen.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: devopen.c,v 1.4 2007/07/27 17:46:57 tom Exp $ */
2:
3: /*
4: * Copyright (c) 2004 Tom Cosgrove
5: * Copyright (c) 1996-1999 Michael Shalayeff
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: *
17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20: * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
21: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23: * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
26: * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27: * THE POSSIBILITY OF SUCH DAMAGE.
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; /* Gets passed to kernel for network boot */
42:
43: /* XXX use slot for 'rd' for 'hd' pseudo-device */
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: /* pass dev_t to the open routines */
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: /* Make sure we have a prefix, e.g. hd0a: or tftp:. */
74: for (p = (char *)fname; *p != ':' && *p != '\0'; ) p++;
75: if (*p != ':')
76: return 1;
77: stripdev = p + 1;
78:
79: l = p - fname; /* Length of device prefix. */
80: for (i = 0; i < nfsname; i++) {
81: if ((fs_name[i] != NULL) &&
82: (strncmp(fname, fs_name[i], l) == 0)) {
83:
84: /* Force oopen() etc to use this filesystem. */
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: * Assume that any network filesystems would be caught by the
103: * code above, so that the next phase of devopen() is only for
104: * local devices.
105: *
106: * Clear bootmac, to signal that we loaded this file from a
107: * non-network device.
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': /* DEL erases */
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) /* comN */
225: return (comspeed(dev, sp));
226:
227: /* pc0 and anything else */
228: return 9600;
229: }
CVSweb