Author: grog Date: Fri Mar 13 03:51:41 2009 New Revision: 189754 URL: http://svn.freebsd.org/changeset/base/189754
Log: Add menus to read install.cfg from any disk device sysinstall can see (eg USB key, CD) rather than just floppy. Handle \r\n line termination in a cfg file. Add keeprcconf variable. Submitted by: Daniel O'Connor Modified: head/usr.sbin/sysinstall/config.c head/usr.sbin/sysinstall/dispatch.c head/usr.sbin/sysinstall/menus.c head/usr.sbin/sysinstall/modules.c head/usr.sbin/sysinstall/sysinstall.8 head/usr.sbin/sysinstall/sysinstall.h Modified: head/usr.sbin/sysinstall/config.c ============================================================================== --- head/usr.sbin/sysinstall/config.c Fri Mar 13 03:00:38 2009 (r189753) +++ head/usr.sbin/sysinstall/config.c Fri Mar 13 03:51:41 2009 (r189754) @@ -428,8 +428,12 @@ configRC_conf(void) while(fgets(line, sizeof(line), rcOld)) { if(line[0] == '#' || variable_check2(line) != 0) fprintf(rcSite, "%s", line); - else - fprintf(rcSite, "#REMOVED: %s", line); + else { + if (variable_get(VAR_KEEPRCCONF) != NULL) + fprintf(rcSite, "%s", line); + else + fprintf(rcSite, "#REMOVED: %s", line); + } } fclose(rcOld); } else if (write_header) { Modified: head/usr.sbin/sysinstall/dispatch.c ============================================================================== --- head/usr.sbin/sysinstall/dispatch.c Fri Mar 13 03:00:38 2009 (r189753) +++ head/usr.sbin/sysinstall/dispatch.c Fri Mar 13 03:51:41 2009 (r189754) @@ -47,6 +47,7 @@ static int dispatch_systemExecute(dialog static int dispatch_msgConfirm(dialogMenuItem *unused); static int dispatch_mediaOpen(dialogMenuItem *unused); static int dispatch_mediaClose(dialogMenuItem *unused); +static int cfgModuleFire(dialogMenuItem *self); static struct _word { char *name; @@ -90,6 +91,7 @@ static struct _word { { "installVarDefaults", installVarDefaults }, { "loadConfig", dispatch_load_file }, { "loadFloppyConfig", dispatch_load_floppy }, + { "loadCDROMConfig", dispatch_load_cdrom }, { "mediaOpen", dispatch_mediaOpen }, { "mediaClose", dispatch_mediaClose }, { "mediaSetCDROM", mediaSetCDROM }, @@ -242,8 +244,9 @@ dispatchCommand(char *str) msgConfirm("Null or zero-length string passed to dispatchCommand"); return DITEM_FAILURE; } - /* If it's got a newline, trim it */ - if ((cp = index(str, '\n')) != NULL) + + /* Fixup DOS abuse */ + if ((cp = index(str, '\r')) != NULL) *cp = '\0'; /* If it's got a `=' sign in there, assume it's a variable setting */ @@ -294,9 +297,12 @@ dispatch_load_fp(FILE *fp) INITQUE(*head); while (fgets(buf, sizeof buf, fp)) { - - if ((cp = strchr(buf, '\n')) != NULL) + /* Fix up DOS abuse */ + if ((cp = index(buf, '\r')) != NULL) *cp = '\0'; + /* If it's got a new line, trim it */ + if ((cp = index(buf, '\n')) != NULL) + *cp = '\0'; if (*buf == '\0' || *buf == '#') continue; @@ -326,7 +332,7 @@ dispatch_execute(qelement *head) while (!EMPTYQUE(*head)) { item = (command_buffer *) head->q_forw; - + if (DITEM_STATUS(dispatchCommand(item->string)) != DITEM_SUCCESS) { msgConfirm("Command `%s' failed - rest of script aborted.\n", item->string); @@ -401,8 +407,7 @@ dispatch_load_floppy(dialogMenuItem *sel mediaClose(); cp = variable_get_value(VAR_INSTALL_CFG, - "Specify the name of a configuration file\n" - "residing on a MSDOS or UFS floppy.", 0); + "Specify the name of a configuration file", 0); if (!cp || !*cp) { variable_unset(VAR_INSTALL_CFG); what |= DITEM_FAILURE; @@ -443,3 +448,189 @@ dispatch_load_floppy(dialogMenuItem *sel return what; } +int +dispatch_load_cdrom(dialogMenuItem *self) +{ + int what = DITEM_SUCCESS; + extern char *distWanted; + char *cp; + FILE *fp; + qelement *list; + + mediaClose(); + cp = variable_get_value(VAR_INSTALL_CFG, + "Specify the name of a configuration file\n" + "residing on the CDROM.", 0); + if (!cp || !*cp) { + variable_unset(VAR_INSTALL_CFG); + what |= DITEM_FAILURE; + return what; + } + + distWanted = cp; + /* Try to open the floppy drive */ + if (DITEM_STATUS(mediaSetCDROM(NULL)) == DITEM_FAILURE) { + msgConfirm("Unable to set media device to CDROM."); + what |= DITEM_FAILURE; + mediaClose(); + return what; + } + + if (!DEVICE_INIT(mediaDevice)) { + msgConfirm("Unable to CDROM filesystem."); + what |= DITEM_FAILURE; + mediaClose(); + return what; + } + + fp = DEVICE_GET(mediaDevice, cp, TRUE); + if (fp) { + list = dispatch_load_fp(fp); + fclose(fp); + mediaClose(); + + what |= dispatch_execute(list); + } + else { + if (!variable_get(VAR_NO_ERROR)) + msgConfirm("Configuration file '%s' not found.", cp); + variable_unset(VAR_INSTALL_CFG); + what |= DITEM_FAILURE; + mediaClose(); + } + return what; +} + +/* + * Create a menu based on available disk devices + */ +int +dispatch_load_menu(dialogMenuItem *self) +{ + DMenu *menu; + Device **devlist; + char *err; + int what, i, j, msize, count; + DeviceType dtypes[] = {DEVICE_TYPE_FLOPPY, DEVICE_TYPE_CDROM, DEVICE_TYPE_DOS, DEVICE_TYPE_UFS}; + + fprintf(stderr, "dispatch_load_menu called\n"); + + msize = sizeof(DMenu) + (sizeof(dialogMenuItem) * 2); + count = 0; + err = NULL; + what = DITEM_SUCCESS; + + if ((menu = malloc(msize)) == NULL) { + err = "Failed to allocate memory for menu"; + goto errout; + } + + bcopy(&MenuConfig, menu, sizeof(DMenu)); + + bzero(&menu->items[count], sizeof(menu->items[0])); + menu->items[count].prompt = strdup("X Exit"); + menu->items[count].title = strdup("Exit this menu (returning to previous)"); + menu->items[count].fire = dmenuExit; + count++; + + for (i = 0; i < sizeof(dtypes) / sizeof(dtypes[0]); i++) { + if ((devlist = deviceFind(NULL, dtypes[i])) == NULL) { + fprintf(stderr, "No devices found for type %d\n", dtypes[i]); + continue; + } + + for (j = 0; devlist[j] != NULL; j++) { + fprintf(stderr, "device type %d device name %s\n", dtypes[i], devlist[j]->name); + msize += sizeof(dialogMenuItem); + if ((menu = realloc(menu, msize)) == NULL) { + err = "Failed to allocate memory for menu item"; + goto errout; + } + + bzero(&menu->items[count], sizeof(menu->items[0])); + menu->items[count].fire = cfgModuleFire; + + menu->items[count].prompt = strdup(devlist[j]->name); + menu->items[count].title = strdup(devlist[j]->description); + /* XXX: dialog(3) sucks */ + menu->items[count].aux = (long)devlist[j]; + count++; + } + } + + menu->items[count].prompt = NULL; + menu->items[count].title = NULL; + + dmenuOpenSimple(menu, FALSE); + + errout: + for (i = 0; i < count; i++) { + free(menu->items[i].prompt); + free(menu->items[i].title); + } + + free(menu); + + if (err != NULL) { + what |= DITEM_FAILURE; + if (!variable_get(VAR_NO_ERROR)) + msgConfirm(err); + } + + return (what); + +} + +static int +cfgModuleFire(dialogMenuItem *self) { + Device *d; + FILE *fp; + int what = DITEM_SUCCESS; + extern char *distWanted; + qelement *list; + char *cp; + + d = (Device *)self->aux; + + msgDebug("cfgModuleFire: User selected %s (%s)\n", self->prompt, d->devname); + + mediaClose(); + + cp = variable_get_value(VAR_INSTALL_CFG, + "Specify the name of a configuration file", 0); + if (!cp || !*cp) { + variable_unset(VAR_INSTALL_CFG); + what |= DITEM_FAILURE; + return what; + } + + distWanted = cp; + + mediaDevice = d; + if (!DEVICE_INIT(mediaDevice)) { + msgConfirm("Unable to mount filesystem."); + what |= DITEM_FAILURE; + mediaClose(); + return what; + } + msgDebug("getting fp for %s\n", cp); + + fp = DEVICE_GET(mediaDevice, cp, TRUE); + if (fp) { + msgDebug("opened OK, processing..\n"); + + list = dispatch_load_fp(fp); + fclose(fp); + mediaClose(); + + what |= dispatch_execute(list); + } else { + if (!variable_get(VAR_NO_ERROR)) + msgConfirm("Configuration file '%s' not found.", cp); + variable_unset(VAR_INSTALL_CFG); + what |= DITEM_FAILURE; + mediaClose(); + } + + return(what); + } Modified: head/usr.sbin/sysinstall/menus.c ============================================================================== --- head/usr.sbin/sysinstall/menus.c Fri Mar 13 03:00:38 2009 (r189753) +++ head/usr.sbin/sysinstall/menus.c Fri Mar 13 03:51:41 2009 (r189754) @@ -152,7 +152,9 @@ DMenu MenuIndex = { { " Console settings", "Customize system console behavior.", NULL, dmenuSubmenu, NULL, &MenuSyscons }, #endif { " Configure", "The system configuration menu.", NULL, dmenuSubmenu, NULL, &MenuConfigure }, - { " Defaults, Load", "Load default settings.", NULL, dispatch_load_floppy }, + { " Defaults, Load (FDD)","Load default settings from floppy.", NULL, dispatch_load_floppy }, + { " Defaults, Load (CD)", "Load default settings from CDROM.", NULL, dispatch_load_cdrom }, + { " Defaults, Load", "Load default settings (all devices).", NULL, dispatch_load_menu }, #ifdef WITH_MICE { " Device, Mouse", "The mouse configuration menu.", NULL, dmenuSubmenu, NULL, &MenuMouse }, #endif @@ -256,7 +258,7 @@ DMenu MenuInitial = { { "Options", "View/Set various installation options", NULL, optionsEditor }, { "Fixit", "Repair mode with CDROM/DVD/floppy or start shell", NULL, dmenuSubmenu, NULL, &MenuFixit }, { "Upgrade", "Upgrade an existing system", NULL, installUpgrade }, - { "Load Config","Load default install configuration", NULL, dispatch_load_floppy }, + { "Load Config..","Load default install configuration", NULL, dispatch_load_menu }, { "Index", "Glossary of functions", NULL, dmenuSubmenu, NULL, &MenuIndex }, { NULL } }, }; @@ -818,6 +820,17 @@ DMenu MenuKLD = { { { NULL } }, }; +/* Prototype config file load menu */ +DMenu MenuConfig = { + DMENU_NORMAL_TYPE, + "Config Menu", + "Please select the device to load your configuration file from.\n" + "Note that a USB key will show up as daNs1.", + NULL, + NULL, + { { NULL } }, +}; + /* The media selection menu */ DMenu MenuMedia = { DMENU_NORMAL_TYPE | DMENU_SELECTION_RETURNS, Modified: head/usr.sbin/sysinstall/modules.c ============================================================================== --- head/usr.sbin/sysinstall/modules.c Fri Mar 13 03:00:38 2009 (r189753) +++ head/usr.sbin/sysinstall/modules.c Fri Mar 13 03:51:41 2009 (r189754) @@ -132,17 +132,13 @@ kldBrowser(dialogMenuItem *self) err = NULL; if (DITEM_STATUS(mediaSetFloppy(NULL)) == DITEM_FAILURE) { - msgConfirm("Unable to set media device to floppy."); - what |= DITEM_FAILURE; - mediaClose(); - return what; + err = "Unable to set media device to floppy."; + goto errout; } if (!DEVICE_INIT(mediaDevice)) { - msgConfirm("Unable to mount floppy filesystem."); - what |= DITEM_FAILURE; - mediaClose(); - return what; + err = "Unable to mount floppy filesystem."; + goto errout; } msize = sizeof(DMenu) + (sizeof(dialogMenuItem) * 2); @@ -191,11 +187,10 @@ kldBrowser(dialogMenuItem *self) dmenuOpenSimple(menu, FALSE); - mediaClose(); - deviceRescan(); errout: + mediaClose(); for (i = 0; i < count; i++) free(menu->items[i].prompt); Modified: head/usr.sbin/sysinstall/sysinstall.8 ============================================================================== --- head/usr.sbin/sysinstall/sysinstall.8 Fri Mar 13 03:00:38 2009 (r189753) +++ head/usr.sbin/sysinstall/sysinstall.8 Fri Mar 13 03:51:41 2009 (r189754) @@ -534,7 +534,16 @@ functions. .Pp .Sy Variables : None -.It installExpress +.It installConfigure +Commit any rc.conf changes to disk. +.Pp +.Sy Variables : +.Bl -tag -width indent +.It keeprcconf +Preserve existing rc.conf parameters. +This is useful if you have a post-install script which modifies rc.conf. +.El + .It installExpress Start an "express" installation, asking few questions of the user. .Pp @@ -894,3 +903,6 @@ for these tasks. .Pp This utility is a prototype which lasted several years past its expiration date and is greatly in need of death. +.Pp +There are a (great) number of undocumented variables. +UTSL. Modified: head/usr.sbin/sysinstall/sysinstall.h ============================================================================== --- head/usr.sbin/sysinstall/sysinstall.h Fri Mar 13 03:00:38 2009 (r189753) +++ head/usr.sbin/sysinstall/sysinstall.h Fri Mar 13 03:51:41 2009 (r189754) @@ -191,6 +191,7 @@ #define VAR_HOME_SIZE "homeSize" #define VAR_TERM "TERM" #define VAR_CONSTERM "_consterm" +#define VAR_KEEPRCCONF "keeprcconf" #ifdef PC98 #define DEFAULT_COUNTRY "jp" @@ -433,6 +434,7 @@ extern DMenu MenuIndex; /* Index menu extern DMenu MenuOptions; /* Installation options */ extern DMenu MenuOptionsLanguage; /* Language options menu */ extern DMenu MenuKLD; /* Prototype KLD menu */ +extern DMenu MenuConfig; /* Prototype config menu */ extern DMenu MenuMedia; /* Media type menu */ #ifdef WITH_MICE extern DMenu MenuMouse; /* Mouse type menu */ @@ -577,8 +579,10 @@ extern int diskGetSelectCount(Device *** /* dispatch.c */ extern int dispatchCommand(char *command); extern int dispatch_load_floppy(dialogMenuItem *self); +extern int dispatch_load_cdrom(dialogMenuItem *self); extern int dispatch_load_file_int(int); extern int dispatch_load_file(dialogMenuItem *self); +extern int dispatch_load_menu(dialogMenuItem *self); /* dist.c */ _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"