Annotation of sys/arch/i386/stand/pxeboot/devopen.c, Revision 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