Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/nathanw_sa]: src/sys/arch/prep/stand/boot Need <lib/libkern/libkern.h>.
details: https://anonhg.NetBSD.org/src/rev/f3f51603a505
branches: nathanw_sa
changeset: 504691:f3f51603a505
user: kleink <kleink%NetBSD.org@localhost>
date: Mon May 28 15:53:52 2001 +0000
description:
Need <lib/libkern/libkern.h>.
diffstat:
sys/arch/prep/stand/boot/devopen.c | 165 +++++++++++++++++++++++++++++++++++++
1 files changed, 165 insertions(+), 0 deletions(-)
diffs (169 lines):
diff -r 02f66a14f6db -r f3f51603a505 sys/arch/prep/stand/boot/devopen.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/prep/stand/boot/devopen.c Mon May 28 15:53:52 2001 +0000
@@ -0,0 +1,165 @@
+/* $NetBSD: devopen.c,v 1.2.8.2 2001/05/28 15:53:52 kleink Exp $ */
+
+/*-
+ * Copyright (c) 1993 John Brezak
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. 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 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 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <lib/libsa/stand.h>
+#include <lib/libkern/libkern.h>
+
+#define ispart(c) ((c) >= 'a' && (c) <= 'h')
+
+int atoi __P((char *));
+int devlookup __P((char *));
+int devparse __P((const char *, int *, int *, int *, int *, int *, char **));
+
+int
+atoi(cp)
+ char *cp;
+{
+ int val = 0;
+
+ while (isdigit(*cp))
+ val = val * 10 + (*cp++ - '0');
+ return (val);
+}
+
+int
+devlookup(d)
+ char *d;
+{
+ struct devsw *dp = devsw;
+ int i;
+
+ for (i = 0; i < ndevs; i++, dp++)
+ if (dp->dv_name && strcmp(dp->dv_name, d) == 0)
+ return (i);
+
+ printf("No such device - Configured devices are:\n");
+ for (dp = devsw, i = 0; i < ndevs; i++, dp++)
+ if (dp->dv_name)
+ printf(" %s", dp->dv_name);
+ printf("\n");
+ return (-1);
+}
+
+/*
+ * Parse a device spec in one of two forms.
+ * dev(ctlr, unit, part)file
+ */
+int
+devparse(fname, dev, adapt, ctlr, unit, part, file)
+ const char *fname;
+ int *dev;
+ int *adapt;
+ int *ctlr;
+ int *unit;
+ int *part;
+ char **file;
+{
+ int argc, flag;
+ char *s, *args[3];
+ extern char nametmp[];
+
+ /* get device name and make lower case */
+ strcpy(nametmp, (char *)fname);
+ for (s = nametmp; *s && *s != '('; s++)
+ if (isupper(*s)) *s = tolower(*s);
+
+ if (*s == '(') {
+ /* lookup device and get index */
+ *s = NULL;
+ if ((*dev = devlookup(nametmp)) < 0)
+ goto baddev;
+
+ /* tokenize device ident */
+ for (++s, flag = 0, argc = 0; *s && *s != ')'; s++) {
+ if (*s != ',') {
+ if (!flag) {
+ flag++;
+ args[argc++] = s;
+ }
+ } else {
+ if (flag) {
+ *s = NULL;
+ flag = 0;
+ }
+ }
+ }
+ if (*s == ')')
+ *s = NULL;
+
+ switch (argc) {
+ case 3:
+ *part = atoi(args[2]);
+ /* FALL THROUGH */
+ case 2:
+ *unit = atoi(args[1]);
+ /* FALL THROUGH */
+ case 1:
+ *ctlr = atoi(args[0]);
+ break;
+ }
+ *file = ++s;
+ } else {
+ /* no device present */
+ *file = (char *)fname;
+ }
+ return (0);
+
+baddev:
+ return (EINVAL);
+}
+
+int
+devopen(f, fname, file)
+ struct open_file *f;
+ const char *fname;
+ char **file;
+{
+ int error;
+ int dev = 0, ctlr = 0, unit = 0, part = 0;
+ int adapt = 0;
+ struct devsw *dp = &devsw[0];
+
+ if ((error =
+ devparse(fname, &dev, &adapt, &ctlr, &unit, &part, file)) != 0)
+ return (error);
+
+ dp = &devsw[dev];
+ if (!dp->dv_open)
+ return (ENODEV);
+
+ f->f_dev = dp;
+ if ((error = (*dp->dv_open)(f, ctlr, unit, part)) == 0)
+ return (0);
+
+ printf("%s(%d,%d,%d): %s\n", devsw[dev].dv_name,
+ ctlr, unit, part, strerror(error));
+
+ return (error);
+}
Home |
Main Index |
Thread Index |
Old Index