Change format of path for device. A current form strangely feels dissatisfied.

This new format looks like the format of BootROM of BeBox.
This commit is contained in:
kiyohara 2010-10-14 06:39:52 +00:00
parent 246f73effa
commit 9fe16975a7
4 changed files with 118 additions and 111 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: boot.c,v 1.20 2010/10/14 06:17:57 kiyohara Exp $ */
/* $NetBSD: boot.c,v 1.21 2010/10/14 06:39:52 kiyohara Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@ -42,10 +42,9 @@
#include "boot.h"
char *names[] = {
"in()",
"fd(0,1,0)netbsd", "fd(0,1,0)netbsd.gz",
"fd(0,1,0)netbsd.old", "fd(0,1,0)netbsd.old.gz",
"fd(0,1,0)onetbsd", "fd(0,1,0)onetbsd.gz"
"/dev/disk/floppy:netbsd", "/dev/disk/floppy:netbsd.gz",
"/dev/disk/floppy:onetbsd", "/dev/disk/floppy:onetbsd.gz"
"in",
};
#define NUMNAMES (sizeof (names) / sizeof (names[0]))

View File

@ -1,4 +1,4 @@
/* $NetBSD: conf.c,v 1.6 2005/12/11 12:17:04 christos Exp $ */
/* $NetBSD: conf.c,v 1.7 2010/10/14 06:39:52 kiyohara Exp $ */
/*
* Copyright (c) 1982, 1986, 1990, 1993
@ -34,17 +34,19 @@
#include <sys/param.h>
#include <lib/libsa/stand.h>
int fdstrategy(void *, int, daddr_t, size_t, void *, size_t *);
int fdopen(struct open_file *, ...);
int fdclose(struct open_file *);
extern int fdstrategy(void *, int, daddr_t, size_t, void *, size_t *);
extern int fdopen(struct open_file *, ...);
extern int fdclose(struct open_file *);
int instrategy(void *, int, daddr_t, size_t, void *, size_t *);
int inopen(struct open_file *, ...);
int inclose(struct open_file *);
extern int instrategy(void *, int, daddr_t, size_t, void *, size_t *);
extern int inopen(struct open_file *, ...);
extern int inclose(struct open_file *);
struct devsw devsw[] = {
{ "fd", fdstrategy, fdopen, fdclose, noioctl },
{ "in", instrategy, inopen, inclose, noioctl },
{ NULL, NULL, NULL, NULL, NULL },
};
struct devsw pseudo_devsw = { "in", instrategy, inopen, inclose, noioctl };
int ndevs = sizeof(devsw) / sizeof(devsw[0]);

View File

@ -1,4 +1,4 @@
/* $NetBSD: devopen.c,v 1.9 2008/05/26 16:28:39 kiyohara Exp $ */
/* $NetBSD: devopen.c,v 1.10 2010/10/14 06:39:52 kiyohara Exp $ */
/*-
* Copyright (c) 1993 John Brezak
@ -33,125 +33,132 @@
#include <sys/param.h>
#include <sys/reboot.h>
#define ispart(c) ((c) >= 'a' && (c) <= 'h')
static int atoi(char *);
static int devlookup(char *);
static int devparse(const char *, int *, int *, int *, int *, int *, char **);
static int
atoi(char *cp)
{
int val = 0;
while (isdigit(*cp))
val = val * 10 + (*cp++ - '0');
return val;
}
static int
devlookup(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
* Parse a device spec.
* i.e.
* /dev/disk/floppy
* /dev/disk/ide/0/master/0
* /dev/disk/ide/0/slave/0
* /dev/disk/scsi/0/0/0
* /dev/disk/scsi/0/3/0
*/
static int
devparse(const char *fname, int *dev, int *adapt, int *ctlr, int *unit,
devparse(const char *fname, int *dev, int *ctlr, int *unit, int *lunit,
int *part, char **file)
{
int argc, flag;
char *s, *args[3];
extern char nametmp[];
int i;
char devdir[] = "/dev/disk/";
char floppy[] = "floppy";
char ide[] = "ide";
char scsi[] = "scsi";
char *p;
/* get device name and make lower case */
strcpy(nametmp, (char *)fname);
for (s = nametmp; *s && *s != '('; s++)
if (isupper(*s)) *s = tolower(*s);
if (strncmp(fname, devdir, strlen(devdir)) != 0)
return EINVAL;
p = __UNCONST(fname) + strlen(devdir);
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 (strncmp(p, floppy, strlen(floppy)) == 0) {
p += strlen(floppy);
for (i = 0; devsw[i].dv_name != NULL; i++)
if (strcmp(devsw[i].dv_name, "fd") == 0) {
*dev = i;
*ctlr = 0;
*unit = 1;
*lunit = 0;
break;
}
}
if (*s == ')')
*s = NULL;
} else if (strncmp(p, ide, strlen(ide)) == 0) {
char master[] = "master";
char slave[] = "slave";
switch (argc) {
case 3:
*part = atoi(args[2]);
/* FALLTHROUGH */
case 2:
*unit = atoi(args[1]);
/* FALLTHROUGH */
case 1:
*ctlr = atoi(args[0]);
break;
}
*file = ++s;
} else {
/* no device present */
*file = (char *)fname;
p += strlen(ide);
if (*p++ != '/' ||
!isdigit(*p++) ||
*p++ != '/')
return EINVAL;
*ctlr = *(p - 2) - '0';
if (strncmp(p, master, strlen(master)) == 0) {
*unit = 0;
p += strlen(master);
} else if (strncmp(p, slave, strlen(slave)) == 0) {
*unit = 1;
p += strlen(slave);
} else
return EINVAL;
if (*p++ != '/' ||
!isdigit(*p++) ||
*p++ != '_' ||
!isdigit(*p++))
return EINVAL;
*lunit = *(p - 3) - '0';
*part = *(p - 1) - '0';
for (i = 0; devsw[i].dv_name != NULL; i++)
if (strcmp(devsw[i].dv_name, "wd") == 0) {
*dev = i;
break;
}
if (devsw[i].dv_name == NULL)
return EINVAL;
} else if (strncmp(p, scsi, strlen(scsi)) == 0) {
p += strlen(scsi);
if (*p++ != '/' ||
!isdigit(*p++) ||
*p++ != '/' ||
!isdigit(*p++) ||
*p++ != '/' ||
!isdigit(*p++) ||
*p++ != '_' ||
!isdigit(*p++))
return EINVAL;
*ctlr = *(p - 7) - '0';
*unit = *(p - 5) - '0';
*lunit = *(p - 3) - '0';
*part = *(p - 1) - '0';
for (i = 0; devsw[i].dv_name != NULL; i++)
if (strcmp(devsw[i].dv_name, "sd") == 0) {
*dev = i;
break;
}
if (devsw[i].dv_name == NULL)
return EINVAL;
}
return 0;
baddev:
return EINVAL;
if (*p++ != ':')
return EINVAL;
*file = p;
return 0;
}
int
devopen(struct open_file *f, const char *fname, char **file)
{
int error;
int dev = 0, ctlr = 0, unit = 0, part = 0;
int adapt = 0;
int dev = 0, ctlr = 0, unit = 0, lunit = 0, part = 0;
struct devsw *dp = &devsw[0];
extern struct devsw pseudo_devsw;
if ((error =
devparse(fname, &dev, &adapt, &ctlr, &unit, &part, file)) != 0)
return error;
dp = &devsw[dev];
if (!dp->dv_open)
return ENODEV;
**file = '\0';
error = devparse(fname, &dev, &ctlr, &unit, &lunit, &part, file);
if (error == 0) {
dp = &devsw[dev];
if (!dp->dv_open)
return ENODEV;
} else {
if (strcmp(fname, "in") == 0)
/* special case: kernel in memory */
dp = &pseudo_devsw;
else
return error;
}
f->f_dev = dp;
if ((error = (*dp->dv_open)(f, ctlr, unit, part)) == 0)
if ((error = (*dp->dv_open)(f, ctlr, unit, lunit, part)) == 0)
return 0;
printf("%s(%d,%d,%d): %s\n", devsw[dev].dv_name,
ctlr, unit, part, strerror(error));
printf("%s %s\n", fname, strerror(error));
return error;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: fd.c,v 1.9 2009/03/18 10:22:27 cegger Exp $ */
/* $NetBSD: fd.c,v 1.10 2010/10/14 06:39:52 kiyohara Exp $ */
/*-
* Copyright (C) 1997-1998 Kazuki Sakamoto (sakamoto@NetBSD.org)
@ -136,7 +136,6 @@ int fdsectors[] = {128, 256, 512, 1024, 2048, 4096};
struct fd_unit {
int ctlr;
int unit;
int part;
u_int un_flags; /* unit status flag */
int stat[STATUS_MAX]; /* result code */
FDDTYPE *un_type; /* floppy type (pointer) */
@ -164,7 +163,7 @@ FD_UNIT fd_unit[CTLR_MAX][UNIT_MAX];
* function declaration
*/
int fdinit(FD_UNIT *);
int fdopen(struct open_file *, int, int, int);
int fdopen(struct open_file *, int, int);
int fdclose(struct open_file *);
int fdioctl(struct open_file *, u_long, void *);
int fdstrategy(void *, int, daddr_t, size_t, void *, size_t *);
@ -221,7 +220,7 @@ fdinit(FD_UNIT *un)
* fdopen *
*===========================================================================*/
int
fdopen(struct open_file *f, int ctlr, int unit, int part)
fdopen(struct open_file *f, int ctlr, int unit)
{
FD_UNIT *un;
int *stat;