#include <lib/libsa/stand.h>
#include <lib/libkern/libkern.h>
#include <lib/libsa/ufs.h>
#include <libi386.h>
#include <biosdisk.h>
#include <bootinfo.h>
#include "dosfile.h"
struct devsw devsw[] = {
{"disk", biosdisk_strategy, biosdisk_open, biosdisk_close, biosdisk_ioctl},
};
int ndevs = sizeof(devsw) / sizeof(struct devsw);
static struct fs_ops dosfs = {
dos_open, dos_close, dos_read, dos_write, dos_seek, dos_stat
};
static struct fs_ops ufsfs = {
ufs_open, ufs_close, ufs_read, ufs_write, ufs_seek, ufs_stat
};
struct fs_ops file_system[] = {
{0},
};
int nfsys = 1;
static struct {
char *name;
int biosdev;
} biosdevtab[] = {
{
"fd", 0
},
{
"wd", 0x80
},
{
"sd", 0x80
},
{
"hd", 0x80
}
};
#define NUMBIOSDEVS (sizeof(biosdevtab) / sizeof(biosdevtab[0]))
static int dev2bios(char *, unsigned int, int *);
static int
dev2bios(char *devname, unsigned int unit, int *biosdev)
{
unsigned i;
for (i = 0; i < NUMBIOSDEVS; i++)
if (!strcmp(devname, biosdevtab[i].name)) {
*biosdev = biosdevtab[i].biosdev + unit;
if (unit >= 4)
return (EUNIT);
return (0);
}
return (ENXIO);
}
struct btinfo_bootpath bibp;
int
devopen(struct open_file *f, const char *fname, char **file)
{
char *devname;
char *fsmode;
int unit, partition;
int biosdev;
int error;
struct devsw *dp;
if ((error = parsebootfile(fname, &fsmode, &devname, &unit,
&partition, (const char **) file)))
return (error);
if (!strcmp(fsmode, "dos")) {
file_system[0] = dosfs;
f->f_flags |= F_NODEV;
return (0);
} else if (!strcmp(fsmode, "ufs")) {
if ((error = dev2bios(devname, unit, &biosdev)))
return (error);
file_system[0] = ufsfs;
dp = &devsw[0];
f->f_dev = dp;
strncpy(bibp.bootpath, *file, sizeof(bibp.bootpath));
BI_ADD(&bibp, BTINFO_BOOTPATH, sizeof(bibp));
return (biosdisk_open(f, biosdev, partition));
} else {
printf("no file system\n");
return (ENXIO);
}
}