Add detection of UFS filesystems.

PR:		bin/135565
Submitted by:	Daniel O'Connor
Reviewed by:	randi
MFC after:	1 month
This commit is contained in:
cperciva 2009-06-24 04:56:13 +00:00
parent 323707be16
commit daf18f9631
2 changed files with 61 additions and 4 deletions

View File

@ -421,7 +421,7 @@ skipif:
}
}
/* Finally, go get the disks and look for DOS partitions to register */
/* Finally, go get the disks and look for partitions to register */
if ((names = Disk_Names()) != NULL) {
int i;
@ -458,7 +458,11 @@ skipif:
if (isDebug())
msgDebug("Found a disk device named %s\n", names[i]);
/* Look for existing DOS partitions to register as "DOS media devices" */
/* Look for existing DOS partitions to register as "DOS media devices"
* XXX: libdisks handling of extended partitions is too
* simplistic - it does not handle them containing (for
* example) UFS partitions
*/
for (c1 = d->chunks->part; c1; c1 = c1->next) {
if (c1->type == fat || c1->type == efi || c1->type == extended) {
Device *dev;
@ -470,8 +474,25 @@ skipif:
mediaInitDOS, mediaGetDOS, mediaShutdownDOS, NULL);
dev->private = c1;
if (isDebug())
msgDebug("Found a DOS partition %s on drive %s\n", c1->name, d->name);
msgDebug("Found a DOS partition %s\n", c1->name);
} else if (c1->type == freebsd) {
Device *dev;
char devname[80];
Chunk *c2;
for (c2 = c1->part; c2; c2 = c2->next) {
if (c2->type != part || c2->subtype != 7)
continue;
/* Got one! */
snprintf(devname, sizeof devname, "/dev/%s", c1->name);
dev = deviceRegister(c2->name, c2->name, strdup(devname), DEVICE_TYPE_UFS, TRUE,
mediaInitUFS, mediaGetUFS, mediaShutdownUFS, NULL);
dev->private = c2;
if (isDebug())
msgDebug("Found a UFS sub-partition %s\n", c2->name);
}
}
}
}
free(names);

View File

@ -39,11 +39,47 @@
#include "sysinstall.h"
#include <sys/fcntl.h>
#include <sys/param.h>
#include <sys/mount.h>
#include <ufs/ufs/ufsmount.h>
/* No init or shutdown routines necessary - all done in mediaSetUFS() */
static Boolean UFSMounted;
static char mountpoint[] = "/dist";
Boolean
mediaInitUFS(Device *dev)
{
struct ufs_args args;
if (UFSMounted)
return TRUE;
Mkdir(mountpoint);
memset(&args, 0, sizeof(args));
args.fspec = dev->devname;
if (mount("ufs", mountpoint, MNT_RDONLY, (caddr_t)&args) == -1) {
msgConfirm("Error mounting %s on %s: %s (%u)", args.fspec, mountpoint, strerror(errno), errno);
return FALSE;
}
UFSMounted = TRUE;
return TRUE;
}
FILE *
mediaGetUFS(Device *dev, char *file, Boolean probe)
{
return mediaGenericGet((char *)dev->private, file);
}
void
mediaShutdownUFS(Device *dev)
{
if (!UFSMounted)
return;
if (unmount(mountpoint, MNT_FORCE) != 0)
msgConfirm("Could not unmount the UFS partition from %s: %s",
mountpoint, strerror(errno));
else
UFSMounted = FALSE;
return;
}