home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2007 January, February, March & April
/
Chip-Cover-CD-2007-02.iso
/
boot
/
i386
/
root
/
usr
/
share
/
YaST2
/
modules
/
ModuleLoading.ycp
< prev
next >
Wrap
Text File
|
2006-11-29
|
7KB
|
243 lines
/**
* Module: ModuleLoading.ycp
*
* Authors: Klaus Kaempf <kkaempf@suse.de> (initial)
*
* Purpose:
* This module does all module loading stuff.
*
* $Id: ModuleLoading.ycp 25850 2005-10-10 13:38:49Z mvidner $
*/
{
module "ModuleLoading";
textdomain "base";
import "Mode";
// import "Initrd";
import "Label";
string vendor_name = "";
string device_name = "";
/**
* @param map controller
* @returns list [string vendor, string device]
* Convert internal probing data to user readable string
* for module loading.
* @see ModuleLoading::Load
*/
global define list prepareVendorDeviceInfo (map controller)
``{
// build up vendor/device information
// if vendor not given, try sub_vendor
string controller_vendor = controller["vendor"]:(controller["sub_vendor"]:"");
if (controller_vendor != "")
{
string controller_sub_vendor = controller["sub_vendor"]:"";
if (controller_sub_vendor != "")
{
controller_vendor = controller_vendor
+ "\n("
+ controller_sub_vendor
+ ")";
}
}
// if device not given, try sub_device
string controller_device = controller["device"]:(controller["sub_device"]:"");
if (controller_device != "")
{
string controller_sub_device = controller["sub_device"]:"";
if (controller_sub_device != "")
{
controller_device = controller_device
+ "\n("
+ controller_sub_device
+ ")";
}
}
return [controller_vendor, controller_device];
};
/**
* Cache for MarkedAsBroken
*/
list<string> broken_modules = nil;
/**
* Is the module marked as broken in install.inf? (BrokenModules)
* #97655
* @param mod module
* @return broken?
*/
boolean MarkedAsBroken (string mod) {
if (broken_modules == nil)
{
string bms = (string)SCR::Read (.etc.install_inf.BrokenModules);
if (bms == nil)
{
bms = "";
}
broken_modules = splitstring (bms, " ");
}
return contains (broken_modules, mod);
}
/**
* @param string modulename
* @param string moduleargs
* @param string vendorname
* @param string devicename
* @param boolean ask_before_loading
* @param boolean with_modprobe
*
* @returns symbol: `dont user choose *not* to load module
* `ok module loaded ok
* `fail module loading failed
*
* load a module if not already loaded by linuxrc
*/
global define symbol Load (string modulename, string moduleargs,
string vendorname, string devicename,
boolean ask_before_loading, boolean with_modprobe)
``{
if ((modulename != "")
// there is no reason for checking initrd, if I need the module to get loaded, I just need to
// check if it isn't already loaded
// && (!contains (Initrd::ListModules (), modulename))
&& !Mode::test ())
{
// always look whether the module is already loaded
map loaded_modules = (map) SCR::Read(.proc.modules);
if (size (loaded_modules[modulename]:$[]) > 0)
{
// already loaded
return `ok;
}
// sformat( _("Loading module %1"), modulename);
// #97655
if (MarkedAsBroken (modulename))
{
y2milestone ("In BrokenModules, skipping: %1", modulename);
return `dont;
}
if (ask_before_loading && !Mode::autoinst())
{
UI::OpenDialog(`opt(`decorated, `centered),
`HBox (
`HSpacing(1),
`HCenter (
`HSquash(
`VBox (
`HCenter (
`HSquash(
`VBox(
// Popup-Box for manual driver installation.
// If the user selects 'manual installation' when
// booting from CD, YaST2 does not load any modules
// automatically, but asks the user for confirmation
// about every module.
// The popup box informs the user about the detected
// hardware and suggests a module to load.
// The user can confirm the module or change
// the suggested load command
//
// This is the heading of the popup box
`Left(`Heading(_("Confirm driver activation"))),
`VSpacing(0.2),
// This is in information message. Next come the
// vendor and device information strings as stored
// in the hardware-probing database.
`Left(`Label(_("YaST2 detected the following device"))),
`Left(`Label(vendorname)),
`Left(`Label(devicename)),
`VSpacing(0.1),
// Caption for Textentry with module information
`Left(`TextEntry(`id(`mod_name), _("&Driver/Module to load"), modulename+" "+moduleargs))
)
)
),
`HSquash(
`HBox(
`HWeight( 1, `PushButton(`id(`ok_msg), `opt(`default), Label::OKButton())),
`HSpacing(2),
`HWeight( 1, `PushButton(`id(`cancel_msg), Label::CancelButton()))
)
),
`VSpacing(0.2)
)
)
),
`HSpacing(1)
)
);
UI::SetFocus (`id(`ok_msg));
symbol ret = (symbol) UI::UserInput();
if (ret == `ok_msg)
{
string module_data = (string) UI::QueryWidget(`id(`mod_name), `Value);
if (size (module_data) > 0)
{
// skip leading spaces
integer firstspace = findfirstnotof (module_data, " ");
if (firstspace != nil)
{
module_data = substring (module_data, firstspace);
}
// split name and args
firstspace = findfirstof (module_data, " ");
if (firstspace == nil)
{
modulename = module_data;
moduleargs = "";
}
else
{
modulename = substring (module_data, 0, firstspace);
moduleargs = substring (module_data, firstspace+1);
}
}
}
UI::CloseDialog();
if (ret == `cancel_msg)
{
y2milestone ("NOT loaded module %1 %2", modulename, moduleargs);
return `dont;
}
} // ask_before_loading
}
boolean load_success = false;
if (with_modprobe)
{
load_success = (boolean) SCR::Execute(.target.modprobe, modulename, moduleargs);
}
else
{
load_success = (boolean) SCR::Execute(.target.insmod, modulename, moduleargs);
}
if (load_success == nil)
load_success = false;
y2milestone ("Loaded module %1 %2 %3", modulename, moduleargs, load_success?"Ok":"Failed");
return (load_success?`ok:`fail);
};
}