diff options
Diffstat (limited to 'sys/arch/wgrisc/stand/libsa/devopen.c')
-rw-r--r-- | sys/arch/wgrisc/stand/libsa/devopen.c | 126 |
1 files changed, 55 insertions, 71 deletions
diff --git a/sys/arch/wgrisc/stand/libsa/devopen.c b/sys/arch/wgrisc/stand/libsa/devopen.c index 32eef0c79cd..0c1c68f36b6 100644 --- a/sys/arch/wgrisc/stand/libsa/devopen.c +++ b/sys/arch/wgrisc/stand/libsa/devopen.c @@ -1,12 +1,8 @@ -/* $NetBSD: devopen.c,v 1.5 1995/01/18 06:53:54 mellon Exp $ */ +/* $OpenBSD: devopen.c,v 1.3 1997/07/21 06:58:14 pefo Exp $ */ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell. - * +/* + * Copyright (c) 1997 Per Fogelstrom + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -17,17 +13,16 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. + * This product includes software developed under OpenBSD by + * Per Fogelstrom. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT @@ -35,15 +30,22 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)devopen.c 8.1 (Berkeley) 6/10/93 */ #include <lib/libsa/stand.h> -/* - * Decode the string 'fname', open the device and return the remaining - * file name if any. - */ +static int +a2i(ch) + char *ch; +{ + unsigned int v; + + v = *ch - '0'; + if(v > 9) + v = 0; + return(v); +} + int devopen(f, fname, file) struct open_file *f; @@ -53,64 +55,46 @@ devopen(f, fname, file) const char *cp; char *ncp; struct devsw *dp; - int c, i; + unsigned int c; int ctlr = 0, unit = 0, part = 0; char namebuf[20]; - int rc; + int rc, n; cp = fname; ncp = namebuf; - /* expect a string like 'sd(0,0,0)vmunix' */ - while ((c = *cp) != '\0') { - if (c == '(') { - cp++; - break; - } - if (ncp < namebuf + sizeof(namebuf) - 1) - *ncp++ = c; - cp++; - } + while ((c = *cp++) != '\0' && c != '(') { + *ncp++ = c; + } + *ncp = '\0'; + if(c == '(') { /* get controller number */ - if ((c = *cp) >= '0' && c <= '9') { - ctlr = c - '0'; - c = *++cp; - } - - if (c == ',') { - /* get SCSI device number */ - if ((c = *++cp) >= '0' && c <= '9') { - unit = c - '0'; - c = *++cp; - } + ctlr = a2i(cp); + cp += 2; + /* get SCSI device number */ + unit = a2i(cp); + cp += 2; + /* get partition number */ + part = a2i(cp); + cp += 2; + if (cp[-1] != ')') + return (ENXIO); + } - if (c == ',') { - /* get partition number */ - if ((c = *++cp) >= '0' && c <= '9') { - part = c - '0'; - c = *++cp; - } + dp = devsw; + n = ndevs; + while(n--) { + if (strcmp (namebuf, dp->dv_name) == 0) { + rc = (dp->dv_open)(f, ctlr, unit, part); + if (!rc) { + f->f_dev = dp; + if (file && *cp != '\0') + *file = (char *)cp; } + return (rc); } - if (c != ')') - return (ENXIO); - cp++; - *ncp = '\0'; - - if (strcmp (namebuf, "sd")) { - printf ("Unknown device: %s\n", namebuf); - return ENXIO; + dp++; } - dp = devsw; - i = 0; - - rc = (dp->dv_open)(f, ctlr, unit, part); - if (rc) - return (rc); - - f->f_dev = dp; - if (file && *cp != '\0') - *file = (char *)cp; - return (0); + return ENXIO; } |