From 71b38b3c129bc0d737201031fb75cf407f4bdfb6 Mon Sep 17 00:00:00 2001 From: Colin Percival Date: Wed, 8 Jul 2009 06:07:51 +0000 Subject: [PATCH] Add support for using a livefs from a USB disk. Submitted by: randi Approved by: re (kensmith) --- usr.sbin/sysinstall/dispatch.c | 1 + usr.sbin/sysinstall/install.c | 27 +++++++++++++++++++++++++++ usr.sbin/sysinstall/menus.c | 7 ++++--- usr.sbin/sysinstall/sysinstall.h | 1 + 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/usr.sbin/sysinstall/dispatch.c b/usr.sbin/sysinstall/dispatch.c index bd22afd0b72..0e4a6345da9 100644 --- a/usr.sbin/sysinstall/dispatch.c +++ b/usr.sbin/sysinstall/dispatch.c @@ -86,6 +86,7 @@ static struct _word { { "installFixupBase", installFixupBase }, { "installFixitHoloShell", installFixitHoloShell }, { "installFixitCDROM", installFixitCDROM }, + { "installFixitUSB", installFixitUSB }, { "installFixitFloppy", installFixitFloppy }, { "installFilesystems", installFilesystems }, { "installVarDefaults", installVarDefaults }, diff --git a/usr.sbin/sysinstall/install.c b/usr.sbin/sysinstall/install.c index 483b26ad253..d00da3c8d4f 100644 --- a/usr.sbin/sysinstall/install.c +++ b/usr.sbin/sysinstall/install.c @@ -327,6 +327,33 @@ installFixitHoloShell(dialogMenuItem *self) return DITEM_SUCCESS; } +/* + * Load the live filesystem from USB media. + */ +int +installFixitUSB(dialogMenuItem *self) +{ + if (!RunningAsInit) + return (DITEM_SUCCESS); + + variable_set2(SYSTEM_STATE, "fixit", 0); + + if (DITEM_STATUS(mediaSetUSB(NULL)) != DITEM_SUCCESS || + !DEVICE_INIT(mediaDevice)) { + msgConfirm("No USB devices found!"); + return (DITEM_FAILURE); + } else if (!file_readable("/dist/rescue/ldconfig")) { + msgConfirm("Unable to find a FreeBSD live filesystem."); + return (DITEM_FAILURE); + } + + if (DITEM_STATUS(fixit_livefs_common(self)) == DITEM_FAILURE) + return (DITEM_FAILURE); + + mediaClose(); + return (DITEM_SUCCESS); +} + int installFixitCDROM(dialogMenuItem *self) { diff --git a/usr.sbin/sysinstall/menus.c b/usr.sbin/sysinstall/menus.c index df54e171568..9376ed114f9 100644 --- a/usr.sbin/sysinstall/menus.c +++ b/usr.sbin/sysinstall/menus.c @@ -2173,8 +2173,9 @@ DMenu MenuFixit = { "Press F1 for more detailed repair instructions", "fixit", { { "X Exit", "Exit this menu (returning to previous)", NULL, dmenuExit }, - { "2 CDROM/DVD", "Use the \"live\" filesystem CDROM/DVD", NULL, installFixitCDROM }, - { "3 Floppy", "Use a floppy generated from the fixit image", NULL, installFixitFloppy }, - { "4 Shell", "Start an Emergency Holographic Shell", NULL, installFixitHoloShell }, + { "2 CDROM/DVD", "Use the live filesystem CDROM/DVD", NULL, installFixitCDROM }, + { "3 USB", "Use the live filesystem from a USB drive", NULL, installFixitUSB }, + { "4 Floppy", "Use a floppy generated from the fixit image", NULL, installFixitFloppy }, + { "5 Shell", "Start an Emergency Holographic Shell", NULL, installFixitHoloShell }, { NULL } }, }; diff --git a/usr.sbin/sysinstall/sysinstall.h b/usr.sbin/sysinstall/sysinstall.h index 9e95226764f..ff412c155e1 100644 --- a/usr.sbin/sysinstall/sysinstall.h +++ b/usr.sbin/sysinstall/sysinstall.h @@ -680,6 +680,7 @@ extern int installExpress(dialogMenuItem *self); extern int installStandard(dialogMenuItem *self); extern int installFixitHoloShell(dialogMenuItem *self); extern int installFixitCDROM(dialogMenuItem *self); +extern int installFixitUSB(dialogMenuItem *self); extern int installFixitFloppy(dialogMenuItem *self); extern int installFixupBase(dialogMenuItem *self); extern int installFixupKernel(dialogMenuItem *self, int dists);