From bba7212c561429909e22267f43ebabfab866ba62 Mon Sep 17 00:00:00 2001 From: ms Date: Sun, 19 Aug 2007 21:21:25 +0000 Subject: [PATCH] Rudimentaere ISDN-Erkennung erstellt. ProbeHW optimiert weges des via-rhine-Problem. Grubs gfx-Menue entfernt wegen der Kompatibilitaet. git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@785 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- config/grub/grub.conf | 3 +- config/grub/message | Bin 169472 -> 0 bytes config/rootfiles/common/grub | 1 - doc/packages-list.txt | 1 - html/cgi-bin/remote.cgi | 7 +- langs/de/install/lang_de.c | 12 +- langs/en/install/lang_en.c | 12 +- lfs/grub | 5 +- src/install+setup/install/main.c | 30 +- src/install+setup/install/probehw.sh | 2 + src/install+setup/libsmooth/netstuff.c | 106 +-- src/install+setup/setup/main.c | 17 +- src/install+setup/setup/misc.c | 290 +++--- src/install+setup/setup/setup.h | 1 + src/patches/grub-0.97-disk_geometry-1.patch | 892 ++++++++++++++++++ src/patches/grub-gfxmenu-v8.diff | 994 -------------------- 16 files changed, 1110 insertions(+), 1263 deletions(-) delete mode 100644 config/grub/message create mode 100644 src/patches/grub-0.97-disk_geometry-1.patch delete mode 100644 src/patches/grub-gfxmenu-v8.diff diff --git a/config/grub/grub.conf b/config/grub/grub.conf index 6f8651457..4400edcda 100644 --- a/config/grub/grub.conf +++ b/config/grub/grub.conf @@ -2,7 +2,8 @@ timeout 10 default saved foreground = 16064e background = ffffff -gfxmenu /grub/message +#hiddenmenu +splashimage (hd0,0)/grub/ipfire.xpm.gz title IPFire (1024x768) root (hd0,0) kernel /vmlinuz-ipfire root=ROOT panic=10 vga=791 MOUNT diff --git a/config/grub/message b/config/grub/message deleted file mode 100644 index 3e6694a59df7687ce6e15cd898d476ce4e0da71e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169472 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::tr{'ssh keys'} -
-
-
+
+ + + END diff --git a/langs/de/install/lang_de.c b/langs/de/install/lang_de.c index 56379792a..a24110084 100644 --- a/langs/de/install/lang_de.c +++ b/langs/de/install/lang_de.c @@ -29,13 +29,21 @@ char *de_tr[] = { +/* TR_ISDN */ +"ISDN", +/* TR_ERROR_PROBING_ISDN */ +"Konnte ISDN Scan nicht durchführen.", +/* TR_PROBING_ISDN */ +"Suche und konfiguriere ISDN Geräte.", +/* TR_MISSING_GREEN_IP */ +"Fehlende IP auf der grünen Schnittstelle!", /* TR_CHOOSE_FILESYSTEM */ "Bitte wählen Sie ihr Dateisystem aus:", /* TR_NOT_ENOUGH_INTERFACES */ "Nicht genügend Netzwerkkarten für diese Auswahl gefunden.\n\nBenötigt: %d - Gefunden: %d\n", /* TR_INTERFACE_CHANGE */ "Bitte wählen Sie das Interface aus das geändert werden soll.\n\n", -/* TR_METCARD_COLOR */ +/* TR_NETCARD_COLOR */ "Zugewiesene Karten", /* TR_REMOVE */ "Entfernen", @@ -52,7 +60,7 @@ char *de_tr[] = { /* TR_ERROR_INTERFACES */ "Es wurden leider keine freien Netzwerkkarten für die Schnittstelle in ihrem System gefunden.", /* TR_REMOVE_CARD */ -"Soll die Zuordnung der folgende Netzwerkkarte entfernt werden?", +"Soll die Zuordnung der folgende Netzwerkkarte entfernt werden? - %s", /* TR_JOURNAL_ERROR */ "Konnte das Journal nicht erstelle, verwende ext2 Fallback.", /* TR_FILESYSTEM */ diff --git a/langs/en/install/lang_en.c b/langs/en/install/lang_en.c index bb76aae4c..f4c7311ee 100644 --- a/langs/en/install/lang_en.c +++ b/langs/en/install/lang_en.c @@ -25,13 +25,21 @@ char *en_tr[] = { +/* TR_ISDN */ +"ISDN", +/* TR_ERROR_PROBING_ISDN */ +"Unable to scan for ISDN devices.", +/* TR_PROBING_ISDN */ +"Scanning and configuring ISDN devices.", +/* TR_MISSING_GREEN_IP */ +"Missing Green IP!", /* TR_CHOOSE_FILESYSTEM */ "Please choose your filesystem:", /* TR_NOT_ENOUGH_INTERFACES */ "Not enough netcards for your choice.\n\nNeeded: %d - Available: %d\n", /* TR_INTERFACE_CHANGE */ "Please choose the interface you wish to change.\n\n", -/* TR_METCARD_COLOR */ +/* TR_NETCARD_COLOR */ "Assigned Cards", /* TR_REMOVE */ "Remove", @@ -48,7 +56,7 @@ char *en_tr[] = { /* TR_ERROR_INTERFACES */ "There are no free interfaces on your system.", /* TR_REMOVE_CARD */ -"Should the allocation for the networkcard be deleted?", +"Should the allocation for the networkcard be deleted? - %s", /* TR_JOURNAL_ERROR */ "Could not create the journal, using fallback to ext2.", /* TR_FILESYSTEM */ diff --git a/lfs/grub b/lfs/grub index 9f1130f10..f60c3b4f4 100644 --- a/lfs/grub +++ b/lfs/grub @@ -74,10 +74,7 @@ $(subst %,%_MD5,$(objects)) : $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) @$(PREBUILD) @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE) - - # This fails, but doesn't matter - -cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-disk_geometry-1.patch - cd $(DIR_APP) && patch -Np0 < $(DIR_SRC)/src/patches/grub-gfxmenu-v8.diff + cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/grub-0.97-disk_geometry-1.patch cd $(DIR_APP) && perl -pi -e 's,/usr/lib/grub/i386-pc,/usr/share/grub/i386-pc,' docs/grub.texi cd $(DIR_APP) && sed -i 's/AM_INIT_AUTOMAKE/&\nAM_PROG_AS/' configure.ac diff --git a/src/install+setup/install/main.c b/src/install+setup/install/main.c index bbda982cf..4d9538ad2 100644 --- a/src/install+setup/install/main.c +++ b/src/install+setup/install/main.c @@ -142,28 +142,27 @@ int main(int argc, char *argv[]) { fprintf(flog, "Couldn't open commandline: /proc/cmdline\n"); } else { - mysystem("/sbin/modprobe ide-generic"); - mysystem("/sbin/modprobe generic"); - mysystem("/sbin/modprobe ide-cd"); - mysystem("/sbin/modprobe ide-disk"); - mysystem("/sbin/modprobe sd_mod"); - mysystem("/sbin/modprobe sr_mod"); - mysystem("/sbin/modprobe usb-storage"); - fgets(line, STRING_SIZE, cmdfile); // check if we have to make an unattended install if (strstr (line, "unattended") != NULL) { unattended = 1; - } - mysystem("/sbin/modprobe iso9660"); // CDROM - mysystem("/sbin/modprobe ext2"); // Boot patition - mysystem("/sbin/modprobe vfat"); // USB key + runcommandwithstatus("/bin/sleep 10", "WARNING: Unattended installation will start in 10 seconds..."); + } } + + mysystem("/sbin/modprobe ide-generic"); + mysystem("/sbin/modprobe generic"); + mysystem("/sbin/modprobe ide-cd"); + mysystem("/sbin/modprobe ide-disk"); + mysystem("/sbin/modprobe sd_mod"); + mysystem("/sbin/modprobe sr_mod"); + mysystem("/sbin/modprobe usb-storage"); + mysystem("/sbin/modprobe usbhid"); - if (unattended) { - runcommandwithstatus("/bin/sleep 10", "WARNING: Unattended installation will start in 10 seconds..."); - } + mysystem("/sbin/modprobe iso9660"); // CDROM + mysystem("/sbin/modprobe ext2"); // Boot patition + mysystem("/sbin/modprobe vfat"); // USB key /* German is the default */ for (choice = 0; langnames[choice]; choice++) @@ -181,7 +180,6 @@ int main(int argc, char *argv[]) ctr = langtrs[choice]; strcpy(shortlangname, shortlangnames[choice]); - fprintf(flog, "Selected language: %s\n", shortlangname); newtDrawRootText(14, 0, NAME " " VERSION " - " SLOGAN ); newtPushHelpLine(ctr[TR_HELPLINE]); diff --git a/src/install+setup/install/probehw.sh b/src/install+setup/install/probehw.sh index b56cde02b..ff4320aff 100644 --- a/src/install+setup/install/probehw.sh +++ b/src/install+setup/install/probehw.sh @@ -6,6 +6,8 @@ for MODULE in $(kudzu -qps -t 30 | grep driver: | cut -d ' ' -f 2 | sort | uniq [ "${MODULE}" = "ignore" ]; then continue fi + MODULE=$(basename $(find /lib/modules -name $(echo $MODULE | sed -e 's/[_-]/*/g')* ) | cut -d. -f1 | head -1) + if grep -Eqe "^${MODULE} " /proc/modules; then continue fi diff --git a/src/install+setup/libsmooth/netstuff.c b/src/install+setup/libsmooth/netstuff.c index dd17bf68c..cecfb2009 100644 --- a/src/install+setup/libsmooth/netstuff.c +++ b/src/install+setup/libsmooth/netstuff.c @@ -335,37 +335,6 @@ int probecards(char *driver, char *driveroptions ) return 0; } -/* ### alter strupper ### -char *strupper(char *s) -{ - int n; - for (n=0;s[n];n++) s[n]=toupper(s[n]); - return s; -} -*/ - -/* neuer StringUpper, wird zur Zeit nicht benutzt da UTF-8 nicht geht. -void strupper(unsigned char *string) -{ - unsigned char *str; - for (str = string; *str != '\0'; str++) - if (!(*str & 0x80) && islower(*str)) - *str = toupper(*str); -} -*/ - -/* int ismacaddr(char *ismac) -{ - char *a; - fprintf(flog,"Check is MAC true\n"); // #### Debug #### - for (a = ismac; *a; a++) { - sprintf(flog,"%c\n", *a); // #### Debug #### - if (*a != ':' && !isxdigit(*a)) return 0; // is int != ':' or not hexdigit then exit - } - return 1; -} -*/ - int get_knic(int card) //returns "0" for zero cards or error and "1" card is found. { struct keyvalue *kv = initkeyvalues(); @@ -412,13 +381,13 @@ int init_knics(void) return found; } -int fmt_exists(const char *fname) { /* Check it's any File or Directory */ +int fmt_exists(const char *fname) { /* Check if it is any file or directory */ struct stat st; if (stat(fname, &st) == -1) return 0; else return 1; } -int is_interface_up(char *card) { /* Check is interface UP */ +int is_interface_up(char *card) { /* Check if the interface is UP */ char temp[STRING_SIZE]; sprintf(temp,"ip link show dev %s | grep -q UP", card); @@ -433,7 +402,6 @@ int rename_device(char *old_name, char *new_name) { fprintf(flog,"Device not found: %s\n",old_name); return 0; } -// fprintf(flog,"NIC: %s wurde in %s umbenannt.\n", old_name, new_name); // #### Debug #### sprintf(temp,"/sbin/ip link set dev %s name %s",old_name ,new_name ); mysystem(temp); @@ -442,7 +410,6 @@ int rename_device(char *old_name, char *new_name) { char g_temp[STRING_SIZE]=""; char* readmac(char *card) { -// fprintf(flog,"Enter readmac... NIC: %s\n", card); // #### Debug #### FILE *fp; char temp[STRING_SIZE], mac[20]; @@ -459,8 +426,6 @@ char* readmac(char *card) { } char* find_nic4mac(char *findmac) { - fprintf(flog,"Enter find_name4nic... Search for %s\n", findmac); // #### Debug #### - DIR *dir; struct dirent *dirzeiger; char temp[STRING_SIZE], temp2[STRING_SIZE]; @@ -476,7 +441,6 @@ char* find_nic4mac(char *findmac) { sprintf(temp2, "%s", readmac((*dirzeiger).d_name) ); if (strcmp(findmac, temp2) == 0) { sprintf(temp,"%s", (*dirzeiger).d_name); -// fprintf(flog,"MAC: %s is NIC: %s\n", findmac, temp); // #### Debug #### break; } } @@ -507,43 +471,27 @@ int rename_nics(void) { int fnics = scan_network_cards(); char nic2find[STRING_SIZE], temp[STRING_SIZE]; - fprintf(flog,"Renaming Nics\n"); // #### Debug #### - for(i=0; i<4; i++) - if (strcmp(knics[i].macaddr, "")) // Wird das Interface benutzt ? + if (strcmp(knics[i].macaddr, "")) for(j=0; j %s\n", temp); // #### Debug #### - if(fmt_exists(temp)) { // Ist der Name schon in Benutzung ? -// fprintf(flog,"is exists %s\n", nic2find); // #### Debug #### - for(k=0; k kcount) { @@ -673,12 +609,10 @@ int nicmenu(int colour) for (j=0 ; j <= kcount ; j++) { if (strcmp(nics[ i ].macaddr, knics[ j ].macaddr) == 0 ) { nic_in_use = 1; - fprintf(flog,"NIC \"%s\" is in use.\n", nics[ i ].macaddr); // #### Debug #### break; } } if (!(nic_in_use)) { - fprintf(flog,"NIC \"%s\" is free.\n", nics[ i ].macaddr); // #### Debug #### if ( strlen(nics[i].description) < 55 ) sprintf(MenuInhalt[mcount], "%.*s", strlen(nics[i].description)-2, nics[i].description+1); else { @@ -700,17 +634,12 @@ int nicmenu(int colour) pMenuInhalt[mcount] = NULL; -// sprintf(message, "Es wurde(n) %d freie Netzwerkkarte(n) in Ihrem System gefunden.\nBitte waehlen Sie im naechsten Dialog eine davon aus.\n", count); -// newtWinMessage("NetcardMenu", ctr[TR_OK], message); - sprintf(message, ctr[TR_CHOOSE_NETCARD], ucolourcard[colour]); rc = newtWinMenu( ctr[TR_NETCARDMENU2], message, 50, 5, 5, 6, pMenuInhalt, &choise, ctr[TR_OK], ctr[TR_SELECT], ctr[TR_CANCEL], NULL); if ( rc == 0 || rc == 1) { write_configs_netudev(found_NIC_as_Card[choise], colour); - } else if (rc == 2) { -// manualdriver("pcnet32",""); - } + } return 0; } else { // We have to add here that you can manually add a device @@ -747,7 +676,6 @@ int clear_card_entry(int card) writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings"); freekeyvalues(kv); - fprintf(flog,"Card \"%s\" cleared\n",ucolourcard[card]); // #### Debug #### return 0; } @@ -756,19 +684,11 @@ int ask_clear_card_entry(int card) char message[STRING_SIZE]; int rc; - sprintf(message, ctr[TR_REMOVE_CARD] "%s \n", ucolourcard[card]); + sprintf(message, ctr[TR_REMOVE_CARD], ucolourcard[card]); rc = newtWinChoice(ctr[TR_WARNING], ctr[TR_OK], ctr[TR_CANCEL], message); if ( rc = 0 || rc == 1) { clear_card_entry(card); -// sprintf(temp1, "%s_DEV", ucolour); -// sprintf(temp2, "%s_MACADDR", ucolour); -// replacekeyvalue(kv, temp1, ""); -// replacekeyvalue(kv, temp2, ""); -// sprintf(temp1, "%s_DESCRIPTION", ucolour); -// replacekeyvalue(kv, temp1, ""); - -// writekeyvalues(kv, CONFIG_ROOT "/ethernet/settings"); } else return 1; return 0; diff --git a/src/install+setup/setup/main.c b/src/install+setup/setup/main.c index 3fc800e13..0595468ac 100644 --- a/src/install+setup/setup/main.c +++ b/src/install+setup/setup/main.c @@ -95,9 +95,10 @@ int main(int argc, char *argv[]) sections[2] = ctr[TR_HOSTNAME]; sections[3] = ctr[TR_DOMAINNAME]; sections[4] = ctr[TR_NETWORKING]; - sections[5] = ctr[TR_ROOT_PASSWORD]; - sections[6] = ctr[TR_ADMIN_PASSWORD]; - sections[7] = NULL; + sections[5] = ctr[TR_ISDN]; + sections[6] = ctr[TR_ROOT_PASSWORD]; + sections[7] = ctr[TR_ADMIN_PASSWORD]; + sections[8] = NULL; newtInit(); newtCls(); @@ -147,12 +148,16 @@ int main(int argc, char *argv[]) case 4: handlenetworking(); break; - + case 5: + handleisdn(); + break; + + case 6: handlerootpassword(); break; - case 6: + case 7: handleadminpassword(); break; @@ -173,6 +178,8 @@ int main(int argc, char *argv[]) goto EXIT; if (!(handlenetworking())) goto EXIT; + if (!(handleisdn())) + goto EXIT; if (!(handledhcp())) goto EXIT; if (!(handlerootpassword())) diff --git a/src/install+setup/setup/misc.c b/src/install+setup/setup/misc.c index 3d645d39c..10f43a285 100644 --- a/src/install+setup/setup/misc.c +++ b/src/install+setup/setup/misc.c @@ -1,141 +1,149 @@ -/* SmoothWall setup program. - * - * This program is distributed under the terms of the GNU General Public - * Licence. See the file COPYING for details. - * - * (c) Lawrence Manning, 2001 - * Misc. stuff for the lib. - * - * $Id: misc.c,v 1.5.2.3 2005/08/25 17:51:42 gespinasse Exp $ - * - */ - -#include "setup.h" - -extern FILE *flog; -extern char *mylog; - -extern char **ctr; - -extern int automode; - -/* This will rewrite /etc/hosts, /etc/hosts.*, and the apache ServerName file. */ -int writehostsfiles(void) -{ - char address[STRING_SIZE] = ""; - char netaddress[STRING_SIZE] = ""; - char netmask[STRING_SIZE] = ""; - char message[1000]; - FILE *file, *hosts; - struct keyvalue *kv; - char hostname[STRING_SIZE]; - char domainname[STRING_SIZE] = ""; - char commandstring[STRING_SIZE]; - char buffer[STRING_SIZE]; - - kv = initkeyvalues(); - if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings"))) - { - freekeyvalues(kv); - errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); - return 0; - } - findkey(kv, "GREEN_ADDRESS", address); - findkey(kv, "GREEN_NETADDRESS", netaddress); - findkey(kv, "GREEN_NETMASK", netmask); - freekeyvalues(kv); - - kv = initkeyvalues(); - if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings"))) - { - freekeyvalues(kv); - errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); - return 0; - } - strcpy(hostname, SNAME ); - findkey(kv, "HOSTNAME", hostname); - findkey(kv, "DOMAINNAME", domainname); - freekeyvalues(kv); - - if (!(file = fopen(CONFIG_ROOT "/main/hostname.conf", "w"))) - { - sprintf (message, ctr[TR_UNABLE_TO_WRITE_VAR_SMOOTHWALL_MAIN_HOSTNAMECONF], CONFIG_ROOT); - errorbox(message); - return 0; - } - fprintf(file, "ServerName %s.%s\n", hostname,domainname); - fclose(file); - - if (!(file = fopen(CONFIG_ROOT "/main/hosts", "r"))) - { - errorbox(ctr[TR_UNABLE_TO_OPEN_HOSTS_FILE]); - return 0; - } - if (!(hosts = fopen("/etc/hosts", "w"))) - { - errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS]); - return 0; - } - fprintf(hosts, "127.0.0.1\tlocalhost\n"); - if (strlen(domainname)) - fprintf(hosts, "%s\t%s.%s\t%s\n",address,hostname,domainname,hostname); - else - fprintf(hosts, "%s\t%s\n",address,hostname); - while (fgets(buffer, STRING_SIZE, file)) - { - char *token, *ip, *host, *domain; - - buffer[strlen(buffer) - 1] = 0; - - token = strtok(buffer, ","); - - ip = strtok(NULL, ","); - host = strtok(NULL, ","); - domain = strtok(NULL, ","); - - if (!(ip && host)) - break; - - if (strlen(ip) < 7 || strlen(ip) > 15 - || strspn(ip, "0123456789.") != strlen(ip)) - break; - - if (strspn(host, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-") != strlen(host)) - break; - - if (domain) - fprintf(hosts, "%s\t%s.%s\t%s\n",ip,host,domain,host); - else - fprintf(hosts, "%s\t%s\n",ip,host); - } - fclose(file); - fclose(hosts); - - /* TCP wrappers stuff. */ - if (!(file = fopen("/etc/hosts.deny", "w"))) - { - errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_DENY]); - return 0; - } - fprintf(file, "ALL : ALL\n"); - fclose(file); - - if (!(file = fopen("/etc/hosts.allow", "w"))) - { - errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_ALLOW]); - return 0; - } - fprintf(file, "sshd : ALL\n"); - fprintf(file, "ALL : localhost\n"); - fprintf(file, "ALL : %s/%s\n", netaddress, netmask); - fclose(file); - - sprintf(commandstring, "/bin/hostname %s.%s", hostname, domainname); - if (mysystem(commandstring)) - { - errorbox(ctr[TR_UNABLE_TO_SET_HOSTNAME]); - return 0; - } - - return 1; -} +/* SmoothWall setup program. + * + * This program is distributed under the terms of the GNU General Public + * Licence. See the file COPYING for details. + * + * (c) Lawrence Manning, 2001 + * Misc. stuff for the lib. + * + */ + +#include "setup.h" + +extern FILE *flog; +extern char *mylog; + +extern char **ctr; + +extern int automode; + +/* This will rewrite /etc/hosts, /etc/hosts.*, and the apache ServerName file. */ +int writehostsfiles(void) +{ + char address[STRING_SIZE] = ""; + char netaddress[STRING_SIZE] = ""; + char netmask[STRING_SIZE] = ""; + char message[1000]; + FILE *file, *hosts; + struct keyvalue *kv; + char hostname[STRING_SIZE]; + char domainname[STRING_SIZE] = ""; + char commandstring[STRING_SIZE]; + char buffer[STRING_SIZE]; + + kv = initkeyvalues(); + if (!(readkeyvalues(kv, CONFIG_ROOT "/ethernet/settings"))) + { + freekeyvalues(kv); + errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); + return 0; + } + findkey(kv, "GREEN_ADDRESS", address); + findkey(kv, "GREEN_NETADDRESS", netaddress); + findkey(kv, "GREEN_NETMASK", netmask); + freekeyvalues(kv); + + kv = initkeyvalues(); + if (!(readkeyvalues(kv, CONFIG_ROOT "/main/settings"))) + { + freekeyvalues(kv); + errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]); + return 0; + } + strcpy(hostname, SNAME ); + findkey(kv, "HOSTNAME", hostname); + findkey(kv, "DOMAINNAME", domainname); + freekeyvalues(kv); + + if (!(file = fopen(CONFIG_ROOT "/main/hostname.conf", "w"))) + { + sprintf (message, ctr[TR_UNABLE_TO_WRITE_VAR_SMOOTHWALL_MAIN_HOSTNAMECONF], CONFIG_ROOT); + errorbox(message); + return 0; + } + fprintf(file, "ServerName %s.%s\n", hostname,domainname); + fclose(file); + + if (!(file = fopen(CONFIG_ROOT "/main/hosts", "r"))) + { + errorbox(ctr[TR_UNABLE_TO_OPEN_HOSTS_FILE]); + return 0; + } + if (!(hosts = fopen("/etc/hosts", "w"))) + { + errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS]); + return 0; + } + fprintf(hosts, "127.0.0.1\tlocalhost\n"); + if (strlen(domainname)) + fprintf(hosts, "%s\t%s.%s\t%s\n",address,hostname,domainname,hostname); + else + fprintf(hosts, "%s\t%s\n",address,hostname); + while (fgets(buffer, STRING_SIZE, file)) + { + char *token, *ip, *host, *domain; + + buffer[strlen(buffer) - 1] = 0; + + token = strtok(buffer, ","); + + ip = strtok(NULL, ","); + host = strtok(NULL, ","); + domain = strtok(NULL, ","); + + if (!(ip && host)) + break; + + if (strlen(ip) < 7 || strlen(ip) > 15 + || strspn(ip, "0123456789.") != strlen(ip)) + break; + + if (strspn(host, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-") != strlen(host)) + break; + + if (domain) + fprintf(hosts, "%s\t%s.%s\t%s\n",ip,host,domain,host); + else + fprintf(hosts, "%s\t%s\n",ip,host); + } + fclose(file); + fclose(hosts); + + /* TCP wrappers stuff. */ + if (!(file = fopen("/etc/hosts.deny", "w"))) + { + errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_DENY]); + return 0; + } + fprintf(file, "ALL : ALL\n"); + fclose(file); + + if (!(file = fopen("/etc/hosts.allow", "w"))) + { + errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_HOSTS_ALLOW]); + return 0; + } + fprintf(file, "sshd : ALL\n"); + fprintf(file, "ALL : localhost\n"); + fprintf(file, "ALL : %s/%s\n", netaddress, netmask); + fclose(file); + + sprintf(commandstring, "/bin/hostname %s.%s", hostname, domainname); + if (mysystem(commandstring)) + { + errorbox(ctr[TR_UNABLE_TO_SET_HOSTNAME]); + return 0; + } + + return 1; +} + +int handleisdn(void) +{ + char command[STRING_SIZE]; + sprintf(command, "/etc/rc.d/init.d/mISDN config"); + if (!runcommandwithstatus(command, ctr[TR_PROBING_ISDN])) + errorbox(ctr[TR_ERROR_PROBING_ISDN]); + // Need to write some lines that count the cards and say the names... + return 0; +} diff --git a/src/install+setup/setup/setup.h b/src/install+setup/setup/setup.h index f1b9129ed..e6a32a6a6 100644 --- a/src/install+setup/setup/setup.h +++ b/src/install+setup/setup/setup.h @@ -31,6 +31,7 @@ int handleadminpassword(void); /* misc.c */ int writehostsfiles(void); +int handleisdn(void); /* keymap.c */ int handlekeymap(void); diff --git a/src/patches/grub-0.97-disk_geometry-1.patch b/src/patches/grub-0.97-disk_geometry-1.patch new file mode 100644 index 000000000..e09686dd7 --- /dev/null +++ b/src/patches/grub-0.97-disk_geometry-1.patch @@ -0,0 +1,892 @@ +Submitted By: Jim Gifford +Date: 05-28-2006 +Initial Package Version: 0.97 +Upstream Status: Unknown +Origin: Fedora and Mandriva +Description: This patch fixes issues with disk geometry not being + detected properly. Part of this patch also fixes + gcc 4 compile errors, which are a part of the issue. + +diff -Naur grub-0.97.orig/configure grub-0.97/configure +--- grub-0.97.orig/configure 2005-05-07 19:48:12.000000000 -0700 ++++ grub-0.97/configure 2006-05-28 20:29:36.025466751 -0700 +@@ -3485,9 +3485,9 @@ + echo "$as_me:$LINENO: result: $size_flag" >&5 + echo "${ECHO_T}$size_flag" >&6 + if test "x$size_flag" = xyes; then +- STAGE2_CFLAGS="-Os" ++ STAGE2_CFLAGS="-Os -fno-strict-aliasing" + else +- STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops" ++ STAGE2_CFLAGS="-O2 -fno-strict-aliasing -fno-strength-reduce -fno-unroll-loops" + fi + # OpenBSD has a GCC extension for protecting applications from + # stack smashing attacks, but GRUB doesn't want this feature. +diff -Naur grub-0.97.orig/configure.ac grub-0.97/configure.ac +--- grub-0.97.orig/configure.ac 2005-05-07 19:36:03.000000000 -0700 ++++ grub-0.97/configure.ac 2006-05-28 20:28:41.538819726 -0700 +@@ -93,9 +93,9 @@ + CFLAGS=$saved_CFLAGS + ]) + if test "x$size_flag" = xyes; then +- STAGE2_CFLAGS="-Os" ++ STAGE2_CFLAGS="-Os -fno-strict-aliasing" + else +- STAGE2_CFLAGS="-O2 -fno-strength-reduce -fno-unroll-loops" ++ STAGE2_CFLAGS="-O2 -fno-strict-aliasing -fno-strength-reduce -fno-unroll-loops" + fi + # OpenBSD has a GCC extension for protecting applications from + # stack smashing attacks, but GRUB doesn't want this feature. +diff -Naur grub-0.97.orig/lib/device.c grub-0.97/lib/device.c +--- grub-0.97.orig/lib/device.c 2005-03-27 15:14:25.000000000 -0800 ++++ grub-0.97/lib/device.c 2006-05-28 20:34:03.546804777 -0700 +@@ -131,6 +131,152 @@ + #include + #include + ++#if defined(__linux__) ++/* The 2.6 kernel has removed all of the geometry handling for IDE drives ++ * that did fixups for LBA, etc. This means that the geometry we get ++ * with the ioctl has a good chance of being wrong. So, we get to ++ * also know about partition tables and try to read what the geometry ++ * is there. *grumble* Very closely based on code from cfdisk ++ */ ++static void get_kernel_geometry(int fd, long long *cyl, int *heads, int *sectors) { ++ struct hd_geometry hdg; ++ ++ if (ioctl (fd, HDIO_GETGEO, &hdg)) ++ return; ++ ++ *cyl = hdg.cylinders; ++ *heads = hdg.heads; ++ *sectors = hdg.sectors; ++} ++ ++struct partition { ++ unsigned char boot_ind; /* 0x80 - active */ ++ unsigned char head; /* starting head */ ++ unsigned char sector; /* starting sector */ ++ unsigned char cyl; /* starting cylinder */ ++ unsigned char sys_ind; /* What partition type */ ++ unsigned char end_head; /* end head */ ++ unsigned char end_sector; /* end sector */ ++ unsigned char end_cyl; /* end cylinder */ ++ unsigned char start4[4]; /* starting sector counting from 0 */ ++ unsigned char size4[4]; /* nr of sectors in partition */ ++}; ++ ++#define ALIGNMENT 2 ++typedef union { ++ struct { ++ unsigned char align[ALIGNMENT]; ++ unsigned char b[SECTOR_SIZE]; ++ } c; ++ struct { ++ unsigned char align[ALIGNMENT]; ++ unsigned char buffer[0x1BE]; ++ struct partition part[4]; ++ unsigned char magicflag[2]; ++ } p; ++} partition_table; ++ ++#define PART_TABLE_FLAG0 0x55 ++#define PART_TABLE_FLAG1 0xAA ++ ++static void ++get_partition_table_geometry(partition_table *bufp, long long *cyl, int *heads, ++ int *sectors) { ++ struct partition *p; ++ int i,h,s,hh,ss; ++ int first = 1; ++ int bad = 0; ++ ++ if (bufp->p.magicflag[0] != PART_TABLE_FLAG0 || ++ bufp->p.magicflag[1] != PART_TABLE_FLAG1) { ++ /* Matthew Wilcox: slightly friendlier version of ++ fatal(_("Bad signature on partition table"), 3); ++ */ ++ fprintf(stderr, "Unknown partition table signature\n"); ++ return; ++ } ++ ++ hh = ss = 0; ++ for (i=0; i<4; i++) { ++ p = &(bufp->p.part[i]); ++ if (p->sys_ind != 0) { ++ h = p->end_head + 1; ++ s = (p->end_sector & 077); ++ if (first) { ++ hh = h; ++ ss = s; ++ first = 0; ++ } else if (hh != h || ss != s) ++ bad = 1; ++ } ++ } ++ ++ if (!first && !bad) { ++ *heads = hh; ++ *sectors = ss; ++ } ++} ++ ++static long long my_lseek (unsigned int fd, long long offset, ++ unsigned int origin) ++{ ++#if defined(__linux__) && (!defined(__GLIBC__) || \ ++ ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))) ++ /* Maybe libc doesn't have large file support. */ ++ loff_t offset, result; ++ static int _llseek (uint filedes, ulong hi, ulong lo, ++ loff_t *res, uint wh); ++ _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo, ++ loff_t *, res, uint, wh); ++ ++ if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET) < 0) ++ return (long long) -1; ++ return result; ++#else ++ return lseek(fd, offset, SEEK_SET); ++#endif ++} ++ ++static void get_linux_geometry (int fd, struct geometry *geom) { ++ long long kern_cyl = 0; int kern_head = 0, kern_sectors = 0; ++ long long pt_cyl = 0; int pt_head = 0, pt_sectors = 0; ++ partition_table bufp; ++ char *buff, *buf_unaligned; ++ ++ buf_unaligned = malloc(sizeof(partition_table) + 4095); ++ buff = (char *) (((unsigned long)buf_unaligned + 4096 - 1) & ++ (~(4096-1))); ++ ++ get_kernel_geometry(fd, &kern_cyl, &kern_head, &kern_sectors); ++ ++ if (my_lseek (fd, 0*SECTOR_SIZE, SEEK_SET) < 0) { ++ fprintf(stderr, "Unable to seek"); ++ } ++ ++ if (read(fd, buff, SECTOR_SIZE) == SECTOR_SIZE) { ++ memcpy(bufp.c.b, buff, SECTOR_SIZE); ++ get_partition_table_geometry(&bufp, &pt_cyl, &pt_head, &pt_sectors); ++ } else { ++ fprintf(stderr, "Unable to read partition table: %s\n", strerror(errno)); ++ } ++ ++ if (pt_head && pt_sectors) { ++ int cyl_size; ++ ++ geom->heads = pt_head; ++ geom->sectors = pt_sectors; ++ cyl_size = pt_head * pt_sectors; ++ geom->cylinders = geom->total_sectors/cyl_size; ++ } else { ++ geom->heads = kern_head; ++ geom->sectors = kern_sectors; ++ geom->cylinders = kern_cyl; ++ } ++ ++ return; ++} ++#endif ++ + /* Get the geometry of a drive DRIVE. */ + void + get_drive_geometry (struct geometry *geom, char **map, int drive) +@@ -151,21 +297,16 @@ + #if defined(__linux__) + /* Linux */ + { +- struct hd_geometry hdg; + unsigned long nr; +- +- if (ioctl (fd, HDIO_GETGEO, &hdg)) +- goto fail; + + if (ioctl (fd, BLKGETSIZE, &nr)) + goto fail; + + /* Got the geometry, so save it. */ +- geom->cylinders = hdg.cylinders; +- geom->heads = hdg.heads; +- geom->sectors = hdg.sectors; + geom->total_sectors = nr; +- ++ get_linux_geometry(fd, geom); ++ if (!geom->heads && !geom->cylinders && !geom->sectors) ++ goto fail; + goto success; + } + +@@ -844,6 +985,7 @@ + { + char dev[PATH_MAX]; /* XXX */ + int fd; ++ off_t offset = (off_t) sector * (off_t) SECTOR_SIZE; + + if ((partition & 0x00FF00) != 0x00FF00) + { +@@ -870,35 +1012,13 @@ + errnum = ERR_NO_PART; + return 0; + } +- +-#if defined(__linux__) && (!defined(__GLIBC__) || \ +- ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))) +- /* Maybe libc doesn't have large file support. */ +- { +- loff_t offset, result; +- static int _llseek (uint filedes, ulong hi, ulong lo, +- loff_t *res, uint wh); +- _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo, +- loff_t *, res, uint, wh); + +- offset = (loff_t) sector * (loff_t) SECTOR_SIZE; +- if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET)) +- { +- errnum = ERR_DEV_VALUES; +- return 0; +- } +- } +-#else +- { +- off_t offset = (off_t) sector * (off_t) SECTOR_SIZE; + +- if (lseek (fd, offset, SEEK_SET) != offset) +- { +- errnum = ERR_DEV_VALUES; +- return 0; +- } +- } +-#endif ++ if (my_lseek(fd, offset, SEEK_SET) != offset) ++ { ++ errnum = ERR_DEV_VALUES; ++ return 0; ++ } + + if (write (fd, buf, size * SECTOR_SIZE) != (size * SECTOR_SIZE)) + { +diff -Naur grub-0.97.orig/stage2/Makefile.am grub-0.97/stage2/Makefile.am +--- grub-0.97.orig/stage2/Makefile.am 2005-02-02 12:37:35.000000000 -0800 ++++ grub-0.97/stage2/Makefile.am 2006-05-28 20:28:41.590818435 -0700 +@@ -24,7 +24,8 @@ + -DGRUB_UTIL=1 -DFSYS_EXT2FS=1 -DFSYS_FAT=1 -DFSYS_FFS=1 \ + -DFSYS_ISO9660=1 -DFSYS_JFS=1 -DFSYS_MINIX=1 -DFSYS_REISERFS=1 \ + -DFSYS_UFS2=1 -DFSYS_VSTAFS=1 -DFSYS_XFS=1 \ +- -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 ++ -DUSE_MD5_PASSWORDS=1 -DSUPPORT_SERIAL=1 -DSUPPORT_HERCULES=1 \ ++ -fno-strict-aliasing + + # Stage 2 and Stage 1.5's. + pkglibdir = $(libdir)/$(PACKAGE)/$(host_cpu)-$(host_vendor) +diff -Naur grub-0.97.orig/stage2/boot.c grub-0.97/stage2/boot.c +--- grub-0.97.orig/stage2/boot.c 2004-03-30 03:44:08.000000000 -0800 ++++ grub-0.97/stage2/boot.c 2006-05-28 20:33:30.123638792 -0700 +@@ -55,7 +55,7 @@ + pu; + /* presuming that MULTIBOOT_SEARCH is large enough to encompass an + executable header */ +- unsigned char buffer[MULTIBOOT_SEARCH]; ++ char buffer[MULTIBOOT_SEARCH]; + + /* sets the header pointer to point to the beginning of the + buffer by default */ +@@ -98,7 +98,7 @@ + /* ELF loading supported if multiboot, FreeBSD and NetBSD. */ + if ((type == KERNEL_TYPE_MULTIBOOT + || pu.elf->e_ident[EI_OSABI] == ELFOSABI_FREEBSD +- || grub_strcmp (pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0 ++ || grub_strcmp ((char *) pu.elf->e_ident + EI_BRAND, "FreeBSD") == 0 + || suggested_type == KERNEL_TYPE_NETBSD) + && len > sizeof (Elf32_Ehdr) + && BOOTABLE_I386_ELF ((*((Elf32_Ehdr *) buffer)))) +@@ -824,8 +824,12 @@ + moveto = (mbi.mem_upper + 0x400) << 10; + + moveto = (moveto - len) & 0xfffff000; ++#if 0 + max_addr = (lh->header == LINUX_MAGIC_SIGNATURE && lh->version >= 0x0203 + ? lh->initrd_addr_max : LINUX_INITRD_MAX_ADDRESS); ++#else ++ max_addr = LINUX_INITRD_MAX_ADDRESS; ++#endif + if (moveto + len >= max_addr) + moveto = (max_addr - len) & 0xfffff000; + +diff -Naur grub-0.97.orig/stage2/disk_io.c grub-0.97/stage2/disk_io.c +--- grub-0.97.orig/stage2/disk_io.c 2004-05-23 09:35:24.000000000 -0700 ++++ grub-0.97/stage2/disk_io.c 2006-05-28 20:28:41.582818634 -0700 +@@ -127,12 +127,19 @@ + int filepos; + int filemax; + +-static inline unsigned long +-log2 (unsigned long word) ++#define log2(n) ffz(~(n)) ++ ++/* include/asm-i386/bitops.h */ ++/* ++ * ffz = Find First Zero in word. Undefined if no zero exists, ++ * so code should check against ~0UL first.. ++ */ ++static __inline__ unsigned long ++ffz (unsigned long word) + { +- asm volatile ("bsfl %1,%0" +- : "=r" (word) +- : "r" (word)); ++ __asm__ ("bsfl %1,%0" ++: "=r" (word) ++: "r" (~word)); + return word; + } + +diff -Naur grub-0.97.orig/stage2/freebsd.h grub-0.97/stage2/freebsd.h +--- grub-0.97.orig/stage2/freebsd.h 2003-07-09 04:45:52.000000000 -0700 ++++ grub-0.97/stage2/freebsd.h 2006-05-28 20:28:41.582818634 -0700 +@@ -78,7 +78,7 @@ + struct bootinfo + { + unsigned int bi_version; +- unsigned char *bi_kernelname; ++ char *bi_kernelname; + struct nfs_diskless *bi_nfs_diskless; + /* End of fields that are always present. */ + #define bi_endcommon bi_n_bios_used +diff -Naur grub-0.97.orig/stage2/fsys_fat.c grub-0.97/stage2/fsys_fat.c +--- grub-0.97.orig/stage2/fsys_fat.c 2005-03-15 08:52:00.000000000 -0800 ++++ grub-0.97/stage2/fsys_fat.c 2006-05-28 20:28:41.582818634 -0700 +@@ -54,12 +54,19 @@ + + #define FAT_CACHE_SIZE 2048 + ++#define log2(n) ffz(~(n)) ++ ++/* include/asm-i386/bitops.h */ ++/* ++ * ffz = Find First Zero in word. Undefined if no zero exists, ++ * so code should check against ~0UL first.. ++ */ + static __inline__ unsigned long +-log2 (unsigned long word) ++ffz (unsigned long word) + { + __asm__ ("bsfl %1,%0" +- : "=r" (word) +- : "r" (word)); ++: "=r" (word) ++: "r" (~word)); + return word; + } + +diff -Naur grub-0.97.orig/stage2/fsys_iso9660.c grub-0.97/stage2/fsys_iso9660.c +--- grub-0.97.orig/stage2/fsys_iso9660.c 2004-05-11 05:11:19.000000000 -0700 ++++ grub-0.97/stage2/fsys_iso9660.c 2006-05-28 20:28:41.582818634 -0700 +@@ -55,13 +55,19 @@ + #define RRCONT_BUF ((unsigned char *)(FSYS_BUF + 6144)) + #define NAME_BUF ((unsigned char *)(FSYS_BUF + 8192)) + ++#define log2(n) ffz(~(n)) + +-static inline unsigned long +-log2 (unsigned long word) ++/* include/asm-i386/bitops.h */ ++/* ++ * ffz = Find First Zero in word. Undefined if no zero exists, ++ * so code should check against ~0UL first.. ++ */ ++static __inline__ unsigned long ++ffz (unsigned long word) + { +- asm volatile ("bsfl %1,%0" +- : "=r" (word) +- : "r" (word)); ++ __asm__ ("bsfl %1,%0" ++: "=r" (word) ++: "r" (~word)); + return word; + } + +@@ -120,7 +126,7 @@ + break; + /* check ISO_VD_PRIMARY and ISO_STANDARD_ID */ + if (PRIMDESC->type.l == ISO_VD_PRIMARY +- && !memcmp(PRIMDESC->id, ISO_STANDARD_ID, sizeof(PRIMDESC->id))) ++ && !memcmp((char *) PRIMDESC->id, ISO_STANDARD_ID, sizeof(PRIMDESC->id))) + { + ISO_SUPER->vol_sector = sector; + INODE->file_start = 0; +@@ -175,7 +181,7 @@ + for (; idr->length.l > 0; + idr = (struct iso_directory_record *)((char *)idr + idr->length.l) ) + { +- const char *name = idr->name; ++ const u_int8_t *name = idr->name; + unsigned int name_len = idr->name_len.l; + + file_type = (idr->flags.l & 2) ? ISO_DIRECTORY : ISO_REGULAR; +@@ -198,7 +204,7 @@ + rr_len = (idr->length.l - idr->name_len.l + - sizeof(struct iso_directory_record) + + sizeof(idr->name)); +- rr_ptr.ptr = ((unsigned char *)idr + idr->name_len.l ++ rr_ptr.ptr = ((char *)idr + idr->name_len.l + + sizeof(struct iso_directory_record) + - sizeof(idr->name)); + if (rr_ptr.i & 1) +@@ -331,9 +337,9 @@ + memcpy(NAME_BUF, name, name_len); + name = NAME_BUF; + } +- rr_ptr.ptr = RRCONT_BUF + ce_ptr->u.ce.offset.l; ++ rr_ptr.ptr = (char *) RRCONT_BUF + ce_ptr->u.ce.offset.l; + rr_len = ce_ptr->u.ce.size.l; +- if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, RRCONT_BUF)) ++ if (!iso9660_devread(ce_ptr->u.ce.extent.l, 0, ISO_SECTOR_SIZE, (char *) RRCONT_BUF)) + { + errnum = 0; /* this is not fatal. */ + break; +@@ -344,7 +350,7 @@ + + filemax = MAXINT; + if (name_len >= pathlen +- && !memcmp(name, dirname, pathlen)) ++ && !memcmp((char *) name, dirname, pathlen)) + { + if (dirname[pathlen] == '/' || !print_possibilities) + { +@@ -381,7 +387,7 @@ + print_possibilities = -print_possibilities; + memcpy(NAME_BUF, name, name_len); + NAME_BUF[name_len] = '\0'; +- print_a_completion (NAME_BUF); ++ print_a_completion ((char *) NAME_BUF); + #endif + } + } +diff -Naur grub-0.97.orig/stage2/fsys_reiserfs.c grub-0.97/stage2/fsys_reiserfs.c +--- grub-0.97.orig/stage2/fsys_reiserfs.c 2004-02-18 14:09:10.000000000 -0800 ++++ grub-0.97/stage2/fsys_reiserfs.c 2006-05-28 20:28:41.586818535 -0700 +@@ -365,13 +365,19 @@ + #define JOURNAL_START ((__u32 *) (INFO + 1)) + #define JOURNAL_END ((__u32 *) (FSYS_BUF + FSYS_BUFLEN)) + ++#define log2(n) ffz(~(n)) + ++/* include/asm-i386/bitops.h */ ++/* ++ * ffz = Find First Zero in word. Undefined if no zero exists, ++ * so code should check against ~0UL first.. ++ */ + static __inline__ unsigned long +-log2 (unsigned long word) ++ffz (unsigned long word) + { + __asm__ ("bsfl %1,%0" +- : "=r" (word) +- : "r" (word)); ++: "=r" (word) ++: "r" (~word)); + return word; + } + +diff -Naur grub-0.97.orig/stage2/fsys_vstafs.c grub-0.97/stage2/fsys_vstafs.c +--- grub-0.97.orig/stage2/fsys_vstafs.c 2003-07-09 04:45:53.000000000 -0700 ++++ grub-0.97/stage2/fsys_vstafs.c 2006-05-28 20:28:41.586818535 -0700 +@@ -186,35 +186,35 @@ + int + vstafs_read (char *addr, int len) + { +- struct alloc *a; ++ struct alloc *b; + int size, ret = 0, offset, curr_len = 0; +- int curr_ext; ++ int curr_exten; + char extent; + int ext_size; + char *curr_pos; + + get_file_info (f_sector); + size = FILE_INFO->len-VSTAFS_START_DATA; +- a = FILE_INFO->blocks; ++ b = FILE_INFO->blocks; + + if (filepos > 0) + { +- if (filepos < a[0].a_len * 512 - VSTAFS_START_DATA) ++ if (filepos < b[0].a_len * 512 - VSTAFS_START_DATA) + { + offset = filepos + VSTAFS_START_DATA; + extent = 0; +- curr_len = a[0].a_len * 512 - offset - filepos; ++ curr_len = b[0].a_len * 512 - offset - filepos; + } + else + { +- ext_size = a[0].a_len * 512 - VSTAFS_START_DATA; ++ ext_size = b[0].a_len * 512 - VSTAFS_START_DATA; + offset = filepos - ext_size; + extent = 1; + do + { + curr_len -= ext_size; + offset -= ext_size; +- ext_size = a[extent+1].a_len * 512; ++ ext_size = b[extent+1].a_len * 512; + } + while (extent < FILE_INFO->extents && offset>ext_size); + } +@@ -223,16 +223,16 @@ + { + offset = VSTAFS_START_DATA; + extent = 0; +- curr_len = a[0].a_len * 512 - offset; ++ curr_len = b[0].a_len * 512 - offset; + } + + curr_pos = addr; + if (curr_len > len) + curr_len = len; + +- for (curr_ext=extent; +- curr_ext < FILE_INFO->extents; +- curr_len = a[curr_ext].a_len * 512, curr_pos += curr_len, curr_ext++) ++ for (curr_exten = extent; ++ curr_exten < FILE_INFO->extents; ++ curr_len = b[curr_exten].a_len * 512, curr_pos += curr_len, curr_exten++) + { + ret += curr_len; + size -= curr_len; +@@ -242,7 +242,7 @@ + curr_len += size; + } + +- devread (a[curr_ext].a_start,offset, curr_len, curr_pos); ++ devread (b[curr_exten].a_start, offset, curr_len, curr_pos); + offset = 0; + } + +diff -Naur grub-0.97.orig/stage2/fsys_xfs.c grub-0.97/stage2/fsys_xfs.c +--- grub-0.97.orig/stage2/fsys_xfs.c 2005-05-07 19:15:55.000000000 -0700 ++++ grub-0.97/stage2/fsys_xfs.c 2006-05-28 20:28:41.586818535 -0700 +@@ -97,7 +97,7 @@ + return ino & XFS_INO_MASK(XFS_INO_OFFSET_BITS); + } + +-static inline __const__ xfs_uint16_t ++static inline __attribute__((const)) xfs_uint16_t + le16 (xfs_uint16_t x) + { + __asm__("xchgb %b0,%h0" \ +@@ -106,7 +106,7 @@ + return x; + } + +-static inline __const__ xfs_uint32_t ++static inline __attribute__((const)) xfs_uint32_t + le32 (xfs_uint32_t x) + { + #if 0 +@@ -122,7 +122,7 @@ + return x; + } + +-static inline __const__ xfs_uint64_t ++static inline __attribute__((const)) xfs_uint64_t + le64 (xfs_uint64_t x) + { + xfs_uint32_t h = x >> 32; +@@ -368,7 +368,7 @@ + default: + namelen = sfe->namelen; + *ino = sf_ino ((char *)sfe, namelen); +- name = sfe->name; ++ name = (char *) sfe->name; + sfe = (xfs_dir2_sf_entry_t *) + ((char *)sfe + namelen + 11 - xfs.i8param); + } +diff -Naur grub-0.97.orig/stage2/gunzip.c grub-0.97/stage2/gunzip.c +--- grub-0.97.orig/stage2/gunzip.c 2003-07-09 04:45:53.000000000 -0700 ++++ grub-0.97/stage2/gunzip.c 2006-05-28 20:28:41.586818535 -0700 +@@ -277,7 +277,7 @@ + * is a compressed file, and simply mark it as such. + */ + if (no_decompression +- || grub_read (buf, 10) != 10 ++ || grub_read ((char *) buf, 10) != 10 + || ((*((unsigned short *) buf) != GZIP_HDR_LE) + && (*((unsigned short *) buf) != OLD_GZIP_HDR_LE))) + { +@@ -293,7 +293,7 @@ + if (buf[2] != DEFLATED + || (buf[3] & UNSUPP_FLAGS) + || ((buf[3] & EXTRA_FIELD) +- && (grub_read (buf, 2) != 2 ++ && (grub_read ((char *) buf, 2) != 2 + || bad_field (*((unsigned short *) buf)))) + || ((buf[3] & ORIG_NAME) && bad_field (-1)) + || ((buf[3] & COMMENT) && bad_field (-1))) +@@ -308,7 +308,7 @@ + + filepos = filemax - 8; + +- if (grub_read (buf, 8) != 8) ++ if (grub_read ((char *) buf, 8) != 8) + { + if (! errnum) + errnum = ERR_BAD_GZIP_HEADER; +@@ -485,8 +485,8 @@ + + #define INBUFSIZ 0x2000 + +-static uch inbuf[INBUFSIZ]; +-static int bufloc; ++static unsigned char inbuf[INBUFSIZ]; ++static int bufloc; + + static int + get_byte (void) +@@ -494,7 +494,7 @@ + if (filepos == gzip_data_offset || bufloc == INBUFSIZ) + { + bufloc = 0; +- grub_read (inbuf, INBUFSIZ); ++ grub_read ((char *) inbuf, INBUFSIZ); + } + + return inbuf[bufloc++]; +@@ -925,7 +925,7 @@ + unsigned m; /* mask for bit lengths table */ + unsigned n; /* number of lengths to get */ + unsigned nb; /* number of bit length codes */ +- unsigned nl; /* number of literal/length codes */ ++ unsigned nc; /* number of literal/length codes */ + unsigned nd; /* number of distance codes */ + unsigned ll[286 + 30]; /* literal/length and distance code lengths */ + register ulg b; /* bit buffer */ +@@ -937,7 +937,7 @@ + + /* read in table lengths */ + NEEDBITS (5); +- nl = 257 + ((unsigned) b & 0x1f); /* number of literal/length codes */ ++ nc = 257 + ((unsigned) b & 0x1f); /* number of literal/length codes */ + DUMPBITS (5); + NEEDBITS (5); + nd = 1 + ((unsigned) b & 0x1f); /* number of distance codes */ +@@ -945,7 +945,7 @@ + NEEDBITS (4); + nb = 4 + ((unsigned) b & 0xf); /* number of bit length codes */ + DUMPBITS (4); +- if (nl > 286 || nd > 30) ++ if (nc > 286 || nd > 30) + { + errnum = ERR_BAD_GZIP_DATA; + return; +@@ -970,7 +970,7 @@ + } + + /* read in literal and distance code lengths */ +- n = nl + nd; ++ n = nc + nd; + m = mask_bits[bl]; + i = l = 0; + while ((unsigned) i < n) +@@ -1034,7 +1034,7 @@ + + /* build the decoding tables for literal/length and distance codes */ + bl = lbits; +- if ((i = huft_build (ll, nl, 257, cplens, cplext, &tl, &bl)) != 0) ++ if ((i = huft_build (ll, nc, 257, cplens, cplext, &tl, &bl)) != 0) + { + #if 0 + if (i == 1) +@@ -1045,7 +1045,7 @@ + return; + } + bd = dbits; +- if ((i = huft_build (ll + nl, nd, 0, cpdist, cpdext, &td, &bd)) != 0) ++ if ((i = huft_build (ll + nc, nd, 0, cpdist, cpdext, &td, &bd)) != 0) + { + #if 0 + if (i == 1) +diff -Naur grub-0.97.orig/stage2/md5.c grub-0.97/stage2/md5.c +--- grub-0.97.orig/stage2/md5.c 2003-07-09 04:45:53.000000000 -0700 ++++ grub-0.97/stage2/md5.c 2006-05-28 20:28:41.590818435 -0700 +@@ -166,7 +166,7 @@ + inputlen -= 64 - buflen; + while (inputlen >= 64) + { +- md5_transform (input); ++ md5_transform ((unsigned char *) input); + input += 64; + inputlen -= 64; + } +@@ -211,7 +211,7 @@ + char *p; + int saltlen; + int i, n; +- unsigned char alt_result[16]; ++ char alt_result[16]; + unsigned char *digest; + + if (check) +diff -Naur grub-0.97.orig/stage2/start_eltorito.S grub-0.97/stage2/start_eltorito.S +--- grub-0.97.orig/stage2/start_eltorito.S 2004-03-27 08:14:20.000000000 -0800 ++++ grub-0.97/stage2/start_eltorito.S 2006-05-28 20:31:17.770936712 -0700 +@@ -40,9 +40,9 @@ + #define ABS(x) (x-_start+BOOTSEC_LOCATION) + + #ifdef STAGE1_5 +-# define STAGE_ADDR 0x2000 ++# define STAGE_ADDR 0x2200 + #else +-# define STAGE_ADDR 0x8000 ++# define STAGE_ADDR 0x8200 + #endif /* STAGE1_5 */ + + /* Print message string */ +@@ -71,12 +71,14 @@ + . = _start + 8 /* Pad to file offset 8 */ + + /* This table gets filled in by mkisofs using the +- -boot-info-table option */ +-bi_pvd: .long 0xDEADBEEF /* LBA of primary volume descript */ +-bi_file: .long 0xDEADBEEF /* LBA of boot file */ +-bi_length: .long 0xDEADBEEF /* Length of boot file */ +-bi_csum: .long 0xDEADBEEF /* Checksum of boot file */ +-bi_reserved: .space (10*4) /* Reserved */ ++ -boot-info-table option If not, the values in this ++ table are default values that we can use to get us ++ what we need, at least under a certain set of assumptions. */ ++bi_pvd: .long 16 /* LBA of primary volume descript */ ++bi_file: .long 0 /* LBA of boot file */ ++bi_length: .long 0xDEADBEEF /* Length of boot file */ ++bi_csum: .long 0xDEADBEEF /* Checksum of boot file */ ++bi_reserved: .space (10*4) /* Reserved */ + + real_start: + xor %ax, %ax +@@ -92,10 +94,28 @@ + /* save drive reference first thing! */ + mov %dl, ABS(BootDrive) + +- /* print a notification message on the screen */ +- MSG(notification_string) ++ /* check if machine support IBM/MS int 13h extensions */ ++ mov $0x41, %ah ++ mov $0x55AA, %bx ++ int $0x13 ++ jnc load_image ++ ++ /* bios doesn't support int 13h extensions, print error messages */ ++ MSG(int13_error_string1) ++ MSG(notification_done) ++ MSG(int13_error_string2) ++ MSG(notification_done) ++ MSG(int13_error_string3) ++ MSG(notification_done) ++ /* even when bios says that it doesn't support int 13h ++ extensions, do not stop here and try to load image anyway, ++ because some bioses says that there isn't support for ++ extended functions but have the needed extended read function ++ (int 13h, function AH=42h) */ + + load_image: ++ /* print a notification message on the screen */ ++ MSG(notification_string) + /* Set up boot file sector, size, load address */ + mov ABS(bi_length), %eax + add $(ISO_SECTOR_SIZE-1), %eax +@@ -105,6 +125,8 @@ + mov %bx, %es + xor %bx, %bx + mov ABS(bi_file), %eax ++ inc %eax /* do not reload the first sector (this code) */ ++ dec %bp /* this way we have more room for code in stage1 */ + call getlinsec + mov %ds, %ax + mov %ax, %es +@@ -115,7 +137,7 @@ + mov $ABS(firstlist - BOOTSEC_LISTSIZE), %si + mov (%si), %ebp + mov ABS(BootDrive), %dl /* this makes sure %dl is our "boot" drive */ +- ljmp $0, $(STAGE_ADDR+SECTOR_SIZE) /* jump to main() in asm.S */ ++ ljmp $0, $(STAGE_ADDR) /* jump to main() in asm.S */ + + /* go here when you need to stop the machine hard after an error condition */ + stop: jmp stop +@@ -171,11 +193,11 @@ + */ + xint13: + movb $6, ABS(RetryCount) +- pushal + .try: ++ pushal + int $0x13 + jc 1f +- add $(8*4), %sp /* Clean up stack */ ++ popal /* Clean up stack */ + ret + 1: + mov %ah, %dl /* Save error code */ +@@ -276,6 +298,10 @@ + + read_error_string: .string "Read error 0x" + ++int13_error_string1: .string "Support for IBM/MS INT 13h extensions not found" ++int13_error_string2: .string "GRUB cannot be loaded if int 13h/function AH=42h isn't present" ++int13_error_string3: .string "Trying to load stage 2 anyway..." ++ + /* + * EBIOS disk address packet + */ +@@ -306,7 +332,8 @@ + .word 0 + .word 0 + +- . = _start + SECTOR_SIZE - BOOTSEC_LISTSIZE ++ /* size of the code we can place between main body and fixed top location */ ++ . = _start + 1536 - BOOTSEC_LISTSIZE + + /* fill the first data listing with the default */ + blocklist_default_start:/* this is the sector start parameter, in logical +@@ -321,6 +348,12 @@ + #endif + blocklist_default_seg: /* this is the segment of the starting address + to load the data into */ +- .word (STAGE_ADDR + SECTOR_SIZE) >> 4 ++ .word (STAGE_ADDR) >> 4 + + firstlist: /* this label has to be after the list data!!! */ ++ ++ /* this is a workaround to allow more code to be added in stage1, ++ it allows more code to be added for this stage, but for this ++ we can't reload the first sector. So we have to align the code ++ to ISO_SECTOR_SIZE. */ ++ . = _start + ISO_SECTOR_SIZE +diff -Naur grub-0.97.orig/util/grub-install.in grub-0.97/util/grub-install.in +--- grub-0.97.orig/util/grub-install.in 2004-07-24 11:57:31.000000000 -0700 ++++ grub-0.97/util/grub-install.in 2006-05-28 20:30:31.484088268 -0700 +@@ -336,6 +336,10 @@ + # Create a safe temporary file. + test -n "$mklog" && log_file=`$mklog` + ++ # Before all invocations of the grub shell, call sync to make sure ++ # the raw device is in sync with any bufferring in filesystems. ++ sync ++ + $grub_shell --batch $no_floppy --device-map=$device_map <$log_file + quit + EOF +@@ -450,6 +454,10 @@ + # Create a safe temporary file. + test -n "$mklog" && log_file=`$mklog` + ++# Before all invocations of the grub shell, call sync to make sure ++# the raw device is in sync with any bufferring in filesystems. ++sync ++ + # Now perform the installation. + $grub_shell --batch $no_floppy --device-map=$device_map <$log_file + root $root_drive diff --git a/src/patches/grub-gfxmenu-v8.diff b/src/patches/grub-gfxmenu-v8.diff deleted file mode 100644 index 6c4a429dc..000000000 --- a/src/patches/grub-gfxmenu-v8.diff +++ /dev/null @@ -1,994 +0,0 @@ ---- docs/grub.texi -+++ docs/grub.texi -@@ -2118,6 +2118,7 @@ - * default:: Set the default entry - * fallback:: Set the fallback entry - * hiddenmenu:: Hide the menu interface -+* gfxmenu:: Use graphical menu interface - * timeout:: Set the timeout - * title:: Start a menu entry - @end menu -@@ -2150,6 +2151,15 @@ - @end deffn - - -+@node gfxmenu -+@subsection gfxmenu -+ -+@deffn Command gfxmenu file -+Use the graphical menu interface. The graphics data are taken from -+@var{file} and must be created using 'mkbootmsg' from the gfxboot package. -+@end deffn -+ -+ - @node hiddenmenu - @subsection hiddenmenu - ---- grub/asmstub.c -+++ grub/asmstub.c -@@ -498,6 +498,32 @@ - return 0; - } - -+/* graphical menu functions . */ -+int -+gfx_init (gfx_data_t *gfx_data) -+{ -+ return 0; -+} -+ -+int -+gfx_done (gfx_data_t *gfx_data) -+{ -+ return 0; -+} -+ -+int -+gfx_input (gfx_data_t *gfx_data, int *menu_entry) -+{ -+ return 0; -+} -+ -+int -+gfx_setup_menu (gfx_data_t *gfx_data) -+{ -+ return 0; -+} -+ -+ - /* low-level timing info */ - int - getrtsecs (void) ---- stage2/asm.S -+++ stage2/asm.S -@@ -1614,6 +1614,286 @@ - popl %ebp - ret - -+ -+/* -+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ * -+ * graphical menu functions -+ * -+ */ -+ -+/* -+ * int gfx_init (gfx_data_t *gfx_data) -+ * -+ * init gfx things -+ * -+ * return vales: -+ * 0: ok -+ * 1: failed -+ * sets gfx_data->ok -+ */ -+ -+ENTRY(gfx_init) -+ pushl %ebp -+ movl %esp, %ebp -+ -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ -+ movl 8(%ebp),%edx -+ movl %edx,%edi -+ leal gfx_ofs_sys_cfg(%edx),%esi -+ andl $0xf,%edi -+ shrl $4,%edx -+ -+ pushl %ebp -+ -+ call EXT_C(prot_to_real) -+ .code16 -+ -+ pushw %ds -+ movw %dx,%ds -+ -+ lcall *gfx_ofs_jmp_table + 4 * 0 (%di) -+ -+ sbbl %ebx,%ebx -+ negl %ebx -+ -+ popw %ds -+ -+ DATA32 call EXT_C(real_to_prot) -+ .code32 -+ -+ popl %ebp -+ -+ movl %ebx,%eax -+ xorl $1,%ebx -+ movl 8(%ebp),%edx -+ movl %ebx,gfx_ofs_ok(%edx) -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ -+ popl %ebp -+ ret -+ -+ -+/* -+ * int gfx_done (gfx_data_t *gfx_data) -+ * -+ * shut down gfx things -+ * -+ * return vales: -+ * always 0 -+ * sets gfx_data->ok -+ */ -+ -+ENTRY(gfx_done) -+ pushl %ebp -+ movl %esp, %ebp -+ -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ -+ movl 8(%ebp),%edx -+ movl %edx,%ebx -+ andl $0xf,%ebx -+ shrl $4,%edx -+ -+ pushl %ebp -+ -+ call EXT_C(prot_to_real) -+ .code16 -+ -+ pushw %ds -+ -+ movw %dx,%ds -+ -+ lcall *gfx_ofs_jmp_table + 4 * 1 (%bx) -+ -+ popw %ds -+ -+ DATA32 call EXT_C(real_to_prot) -+ .code32 -+ -+ popl %ebp -+ -+ xorl %eax,%eax -+ movl 8(%ebp),%edx -+ movl %eax,gfx_ofs_ok(%edx) -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ -+ popl %ebp -+ ret -+ -+ -+/* -+ * int gfx_input (gfx_data_t *gfx_data, int *menu_entry) -+ * -+ * let user enter a command line -+ * -+ * uses gfx_data->cmdline as buffer -+ * -+ * return values: -+ * 1: abort -+ * 2: boot -+ * menu_entry: selected entry -+ */ -+ -+ENTRY(gfx_input) -+ pushl %ebp -+ movl %esp, %ebp -+ -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ -+ movl 8(%ebp),%edx -+ movl %edx,%ebx -+ leal gfx_ofs_sys_cfg(%edx),%esi -+ andl $0xf,%ebx -+ shrl $4,%edx -+ -+ pushl %ebp -+ -+ call EXT_C(prot_to_real) -+ .code16 -+ -+ pushw %ds -+ -+ movw %dx,%ds -+ -+ movl gfx_ofs_cmdline(%bx),%edi -+ movl gfx_ofs_cmdline_len(%bx),%ecx -+ movl gfx_ofs_timeout(%bx),%eax -+ imull $18,%eax -+ -+ lcall *gfx_ofs_jmp_table + 4 * 2 (%bx) -+ -+ movl %eax,%ecx -+ -+ popw %ds -+ -+ DATA32 call EXT_C(real_to_prot) -+ .code32 -+ -+ popl %ebp -+ -+ movl 12(%ebp),%edx -+ movl %ebx,(%edx) -+ -+ movl %ecx,%eax -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ -+ popl %ebp -+ ret -+ -+ -+/* -+ * int gfx_setup_menu (gfx_data_t *gfx_data) -+ * -+ * draw boot menu -+ * -+ * return values: -+ * always 0 -+ */ -+ -+/* menu entry descriptor */ -+#define menu_entries 0 -+#define menu_default 2 /* seg:ofs */ -+#define menu_ent_list 6 /* seg:ofs */ -+#define menu_ent_size 10 -+#define menu_arg_list 12 /* seg:ofs */ -+#define menu_arg_size 16 -+#define sizeof_menu_desc 18 -+ -+ENTRY(gfx_setup_menu) -+ pushl %ebp -+ movl %esp, %ebp -+ -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ -+ movl 8(%ebp),%edx -+ movl %edx,%ebx -+ andl $0xf,%ebx -+ shrl $4,%edx -+ -+ call EXT_C(prot_to_real) -+ .code16 -+ -+ pushw %ds -+ -+ movw %dx,%ds -+ shll $4,%edx -+ -+ subw $sizeof_menu_desc,%sp -+ movw %esp,%ebp -+ -+ movl gfx_ofs_menu_entries(%bx),%eax -+ movw %ax,menu_entries(%bp) -+ -+ movl gfx_ofs_menu_default_entry(%bx),%eax -+ subl %edx,%eax -+ movw %ax,menu_default(%bp) -+ movw %ds,menu_default+2(%bp) -+ -+ movl gfx_ofs_menu_list(%bx),%eax -+ subl %edx,%eax -+ movw %ax,menu_ent_list(%bp) -+ movw %ds,menu_ent_list+2(%bp) -+ -+ movl gfx_ofs_menu_entry_len(%bx),%eax -+ movw %ax,menu_ent_size(%bp) -+ -+ movl gfx_ofs_args_list(%bx),%eax -+ subl %edx,%eax -+ movw %ax,menu_arg_list(%bp) -+ movw %ds,menu_arg_list+2(%bp) -+ -+ movl gfx_ofs_args_entry_len(%bx),%eax -+ movw %ax,menu_arg_size(%bp) -+ -+ movl %ss,%esi -+ shll $4,%esi -+ addl %ebp,%esi -+ -+ lcall %ds: *gfx_ofs_jmp_table + 4 * 3 (%bx) -+ -+ addw $sizeof_menu_desc,%sp -+ -+ popw %ds -+ -+ DATA32 call EXT_C(real_to_prot) -+ .code32 -+ -+ xorl %eax,%eax -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ -+ popl %ebp -+ ret -+ -+ -+/* -+ * -+ * end graphics stuff -+ * -+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+ */ -+ - - /* - * gateA20(int linear) ---- stage2/builtins.c -+++ stage2/builtins.c -@@ -63,6 +63,8 @@ - int fallback_entries[MAX_FALLBACK_ENTRIES]; - /* The number of current entry. */ - int current_entryno; -+/* graphics file */ -+char graphics_file[64]; - /* The address for Multiboot command-line buffer. */ - static char *mb_cmdline; - /* The password. */ -@@ -1351,6 +1353,26 @@ - }; - - -+/* graphics */ -+static int -+gfxmenu_func (char *arg, int flags) -+{ -+ memmove(graphics_file, arg, sizeof graphics_file - 1); -+ graphics_file[sizeof graphics_file - 1] = 0; -+ -+ return 0; -+} -+ -+static struct builtin builtin_gfxmenu = -+{ -+ "gfxmenu", -+ gfxmenu_func, -+ BUILTIN_MENU | BUILTIN_HELP_LIST, -+ "gfxmenu FILE", -+ "Use the graphical menu from FILE." -+}; -+ -+ - /* geometry */ - static int - geometry_func (char *arg, int flags) -@@ -4874,6 +4896,7 @@ - &builtin_find, - &builtin_fstest, - &builtin_geometry, -+ &builtin_gfxmenu, - &builtin_halt, - &builtin_help, - &builtin_hiddenmenu, ---- stage2/shared.h -+++ stage2/shared.h -@@ -374,6 +374,22 @@ - #endif /* WITHOUT_LIBC_STUBS */ - - -+/* see typedef gfx_data_t below */ -+#define gfx_ofs_ok 0x00 -+#define gfx_ofs_code_seg 0x04 -+#define gfx_ofs_jmp_table 0x08 -+#define gfx_ofs_sys_cfg 0x38 -+#define gfx_ofs_cmdline 0x6c -+#define gfx_ofs_cmdline_len 0x70 -+#define gfx_ofs_menu_list 0x74 -+#define gfx_ofs_menu_default_entry 0x78 -+#define gfx_ofs_menu_entries 0x7c -+#define gfx_ofs_menu_entry_len 0x80 -+#define gfx_ofs_args_list 0x84 -+#define gfx_ofs_args_entry_len 0x88 -+#define gfx_ofs_timeout 0x8c -+ -+ - #ifndef ASM_FILE - /* - * Below this should be ONLY defines and other constructs for C code. -@@ -595,6 +611,38 @@ - extern int default_entry; - extern int current_entryno; - -+ -+/* -+ * graphics menu stuff -+ * -+ * Note: gfx_data and all data referred to in it must lie within a 64k area. -+ */ -+typedef struct { -+ unsigned ok; /* set while we're in graphics mode */ -+ unsigned code_seg; /* code segment of binary graphics code */ -+ unsigned jmp_table[12]; /* link to graphics functions */ -+ unsigned char sys_cfg[52]; /* sys_cfg[0]: identifies boot loader (grub == 2) */ -+ char *cmdline; /* command line returned by gfx_input() */ -+ unsigned cmdline_len; /* length of the above */ -+ char *menu_list; /* list of menu entries, each of fixed length (menu_entry_len) */ -+ char *menu_default_entry; /* the default entry */ -+ unsigned menu_entries; /* number of entries in menu_list */ -+ unsigned menu_entry_len; /* one entry */ -+ char *args_list; /* same structure as menu_list, menu_entries entries */ -+ unsigned args_entry_len; /* one entry */ -+ unsigned timeout; /* in seconds (0: no timeout) */ -+} __attribute__ ((packed)) gfx_data_t; -+ -+extern gfx_data_t *graphics_data; -+ -+/* pointer to graphics image data */ -+extern char graphics_file[64]; -+ -+int gfx_init(gfx_data_t *gfx_data); -+int gfx_done(gfx_data_t *gfx_data); -+int gfx_input(gfx_data_t *gfx_data, int *menu_entry); -+int gfx_setup_menu(gfx_data_t *gfx_data); -+ - /* The constants for password types. */ - typedef enum - { ---- stage2/stage2.c -+++ stage2/stage2.c -@@ -22,6 +22,8 @@ - - grub_jmp_buf restart_env; - -+gfx_data_t *graphics_data; -+ - #if defined(PRESET_MENU_STRING) || defined(SUPPORT_DISKLESS) - - # if defined(PRESET_MENU_STRING) -@@ -310,6 +312,12 @@ - - if (! auth && password) - { -+ if (*graphics_file) -+ { -+ printf ("\ -+ WARNING: graphical menu doesn\'t work\ -+ in conjunction with the password feature\n" ); -+ } - printf ("\ - Press enter to boot the selected OS or \'p\' to enter a\n\ - password to unlock the next set of features."); -@@ -753,6 +761,493 @@ - } - - -+ -+#if 0 -+/* for debugging */ -+static void hexdump(unsigned char *buf, unsigned len) -+{ -+ int i, j = 0; -+ char s[17]; -+ unsigned addr = (unsigned) buf; -+ -+ s[16] = 0; -+ while(len--) { -+ i = buf[j]; -+ i = i & 0xff; -+ s[j & 15] = (i >= 0x20 && i <= 0x7e) ? i : '.'; -+ if(!(j & 15)) { -+ printf("%x ", j + addr); -+ } -+ if(!(j & 7) && (j & 15)) printf(" "); -+ /* stupid grub_printf */ -+ printf("%x", (i >> 4) & 0x0f); -+ printf("%x ", i & 0x0f); -+ if(!(++j & 15)) { -+ printf(" %s\n", s); -+ } -+ } -+ -+ if(j & 15) { -+ s[j & 15] = 0; -+ if(!(j & 8)) printf(" "); -+ i = 1 + 3 * (16 - (j & 15)); -+ while(i--) printf(" "); -+ printf("%s\n", s); -+ } -+} -+#endif -+ -+ -+/* kernel + (grub-)module options */ -+#define GFX_CMD_BUF_SIZE 512 -+ -+/* command line separator char */ -+#define GFX_CMD_SEP 1 -+ -+/* -+ * Go through config entry and find kernel args, if any. -+ * Put things into buf and return it. -+ */ -+static char *get_kernel_args(char *cfg, char *buf) -+{ -+ int i, j; -+ char *s, *t = "", *p, *t2; -+ -+ *(p = buf) = 0; -+ -+ for(j = 0; ; j++) { -+ s = get_entry(cfg, j, 0); -+ if(!*s) break; -+ if( -+ (!memcmp(s, "kernel", 6) || !memcmp(s, "module", 6)) && -+ (s[6] == ' ' || s[6] == '\t') -+ ) { -+ t = skip_to(0, s); -+ t2 = s[0] == 'm' ? strstr(t, "initrd") : NULL; -+ if(*t) t = skip_to(0, t); -+ if(t2 && t2 < t) break; /* module is likely a normal initrd -> skip */ -+ i = strlen(t); -+ if(p - buf + i > GFX_CMD_BUF_SIZE - 2) break; -+ *p++ = GFX_CMD_SEP; -+ strcpy(p, t); -+ p += i; -+ -+ continue; -+ } -+ } -+ -+ if(*buf) buf++; /* skip initial separator char */ -+ -+ return buf; -+} -+ -+ -+/* -+ * Check header and return code start offset. -+ */ -+static unsigned magic_ok(unsigned char *buf) -+{ -+ if( -+ *(unsigned *) buf == 0x0b2d97f00 && /* magic id */ -+ (buf[4] == 8) /* version 8 */ -+ ) { -+ return *(unsigned *) (buf + 8); -+ } -+ -+ return 0; -+} -+ -+ -+/* -+ * Search cpio archive for gfx file. -+ */ -+static unsigned find_file(unsigned char *buf, unsigned len, unsigned *gfx_file_start, unsigned *file_len) -+{ -+ unsigned i, fname_len, code_start = 0; -+ -+ *gfx_file_start = 0; -+ -+ for(i = 0; i < len;) { -+ if((len - i) >= 0x1a && (buf[i] + (buf[i + 1] << 8)) == 0x71c7) { -+ fname_len = *(unsigned short *) (buf + i + 20); -+ *file_len = *(unsigned short *) (buf + i + 24) + (*(unsigned short *) (buf + i + 22) << 16); -+ i += 26 + fname_len; -+ i = ((i + 1) & ~1); -+ if((code_start = magic_ok(buf + i))) { -+ *gfx_file_start = i; -+ return code_start; -+ } -+ i += *file_len; -+ i = ((i + 1) & ~1); -+ } -+ else { -+ break; -+ } -+ } -+ -+ return code_start; -+} -+ -+static inline unsigned char * stack_ptr(void) -+{ -+ unsigned char * u; -+ -+ asm("movl %%esp, %0" : "=r" (u)); -+ -+ return u; -+} -+ -+static void sleep(int delay) -+{ -+ int tick, last_tick = currticks(); -+ -+ delay *= 18; -+ -+ while(delay--) { -+ while((tick = currticks()) == last_tick) { } -+ last_tick = tick; -+ } -+} -+ -+static void wait_for_key() -+{ -+ printf("Press a key to continue..."); -+ getkey(); -+ printf("\r \r"); -+} -+ -+ -+/* -+ * Leave that much space on the heap. Everything else goes to the graphics -+ * functions. -+ * -+ * 0x2000 is _not_ enough -+ */ -+#define MIN_HEAP_SIZE 0x4000 -+#define MIN_GFX_FREE 0x1000 -+ -+#define SC_BOOTLOADER 0 -+#define SC_FAILSAFE 3 -+#define SC_SYSCONFIG_SIZE 4 -+#define SC_BOOTLOADER_SEG 8 -+#define SC_XMEM_0 24 -+#define SC_XMEM_1 26 -+#define SC_XMEM_2 28 -+#define SC_XMEM_3 30 -+#define SC_FILE 32 -+#define SC_ARCHIVE_START 36 -+#define SC_ARCHIVE_END 40 -+#define SC_MEM0_START 44 -+#define SC_MEM0_END 48 -+ -+/* -+ * Does normally not return. -+ */ -+static void -+run_graphics_menu (char *menu_entries, char *config_entries, int num_entries, -+ char *heap, int entryno) -+{ -+ unsigned char *buf, *buf_ext; -+ unsigned buf_size, buf_ext_size, code_start, file_start; -+ char *s, *t, *t2, *cfg, *new_config, *p; -+ char *saved_heap; -+ int i, j, max_len, gfx_file_size, verbose; -+ int selected_entry; -+ gfx_data_t *gfx_data; -+ char *cmd_buf; -+ unsigned mem0_start, mem0_end, file_len; -+ -+ /* -+ * check gfx_data_t struct offsets for consistency; gcc will optimize away -+ * the whole block -+ */ -+ -+ /* dummy function to make ld fail */ -+ { -+ extern void wrong_struct_size(void); -+ #define gfx_ofs_check(a) if(gfx_ofs_##a != (char *) &gfx_data->a - (char *) gfx_data) wrong_struct_size(); -+ gfx_ofs_check(ok); -+ gfx_ofs_check(code_seg); -+ gfx_ofs_check(jmp_table); -+ gfx_ofs_check(sys_cfg); -+ gfx_ofs_check(cmdline); -+ gfx_ofs_check(cmdline_len); -+ gfx_ofs_check(menu_list); -+ gfx_ofs_check(menu_default_entry); -+ gfx_ofs_check(menu_entries); -+ gfx_ofs_check(menu_entry_len); -+ gfx_ofs_check(args_list); -+ gfx_ofs_check(args_entry_len); -+ gfx_ofs_check(timeout); -+ #undef gfx_ofs_check -+ } -+ -+ if(!num_entries) return; -+ -+ graphics_data = gfx_data = (gfx_data_t *) heap; -+ heap += sizeof *gfx_data; -+ memset(gfx_data, 0, sizeof *gfx_data); -+ -+ gfx_data->sys_cfg[SC_BOOTLOADER] = 2; /* bootloader: grub */ -+ gfx_data->sys_cfg[SC_SYSCONFIG_SIZE] = 52; /* config data size */ -+ *(unsigned short *) (gfx_data->sys_cfg + SC_BOOTLOADER_SEG) = (unsigned) gfx_data >> 4; /* segment */ -+ gfx_data->sys_cfg[SC_XMEM_0] = 0x21; /* 1MB @ 2MB */ -+ gfx_data->sys_cfg[SC_XMEM_1] = 0x41; /* 1MB @ 4MB */ -+ verbose = (*(unsigned char *) 0x417) & 3 ? 1 : 0; /* SHIFT pressed */ -+ gfx_data->sys_cfg[SC_FAILSAFE] = verbose; -+ -+ gfx_data->timeout = grub_timeout >= 0 ? grub_timeout : 0; -+ -+ -+ /* setup command line edit buffer */ -+ -+ gfx_data->cmdline_len = 256; -+ -+ gfx_data->cmdline = heap; -+ heap += gfx_data->cmdline_len; -+ memset(gfx_data->cmdline, 0, gfx_data->cmdline_len); -+ -+ cmd_buf = heap; -+ heap += GFX_CMD_BUF_SIZE; -+ -+ /* setup menu entries */ -+ -+ for(i = max_len = 0; i < num_entries; i++) { -+ j = strlen(get_entry(menu_entries, i, 0)); -+ if(j > max_len) max_len = j; -+ } -+ -+ if(!max_len) return; -+ -+ gfx_data->menu_entry_len = max_len + 1; -+ gfx_data->menu_entries = num_entries; -+ -+ gfx_data->menu_list = heap; -+ heap += gfx_data->menu_entry_len * gfx_data->menu_entries; -+ -+ memset(gfx_data->menu_list, 0, gfx_data->menu_entry_len * gfx_data->menu_entries); -+ -+ for(i = 0; i < (int) gfx_data->menu_entries; i++) { -+ strcpy(gfx_data->menu_list + i * gfx_data->menu_entry_len, get_entry(menu_entries, i, 0)); -+ } -+ -+ gfx_data->menu_default_entry = gfx_data->menu_list + entryno * gfx_data->menu_entry_len; -+ -+ -+ /* setup list of kernel args */ -+ -+ for(i = max_len = 0; i < num_entries; i++) { -+ s = get_kernel_args(get_entry(config_entries, i, 1), cmd_buf); -+ j = strlen(s); -+ if(j > max_len) max_len = j; -+ } -+ -+ gfx_data->args_entry_len = max_len + 1; -+ -+ gfx_data->args_list = heap; -+ heap += gfx_data->args_entry_len * gfx_data->menu_entries; -+ -+ memset(gfx_data->args_list, 0, gfx_data->args_entry_len * gfx_data->menu_entries); -+ -+ for(i = 0; i < (int) gfx_data->menu_entries; i++) { -+ strcpy(gfx_data->args_list + i* gfx_data->args_entry_len, get_kernel_args(get_entry(config_entries, i, 1), cmd_buf)); -+ } -+ -+ -+ /* go back here when we no longer need the graphics data */ -+ saved_heap = heap; -+ -+ -+ /* get memory area to be used by graphics functions */ -+ -+ /* use 1MB starting at 2MB as file buffer */ -+ buf_ext = (unsigned char *) (2 << 20); -+ buf_ext_size = 1 << 20; -+ -+ /* must be 16-byte aligned */ -+ buf = (unsigned char *) (((unsigned) heap + 0xf) & ~0xf); -+ -+ buf_size = stack_ptr() - buf - MIN_HEAP_SIZE; -+ buf_size &= ~0xf; -+ -+ mem0_start = (unsigned) buf; -+ mem0_end = mem0_start + buf_size; -+ -+ if(verbose) { -+ printf("low memory 0x%x - 0x%x (%d bytes)\n", mem0_start, mem0_end, buf_size); -+ wait_for_key(); -+ } -+ -+ heap += buf_size; -+ -+ /* read the file */ -+ -+ if(!grub_open(graphics_file)) { -+ printf("%s: file not found\n", graphics_file); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ gfx_file_size = grub_read(buf_ext, buf_ext_size); -+ -+ grub_close(); -+ -+ if(gfx_file_size <= 0) { -+ printf("%s: read error\n", graphics_file); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ if(verbose) { -+ printf("%s: %d bytes (%d bytes left)\n", graphics_file, gfx_file_size, buf_ext_size - gfx_file_size); -+ wait_for_key(); -+ } -+ -+ /* locate file inside cpio archive */ -+ if(!(code_start = find_file(buf_ext, gfx_file_size, &file_start, &file_len))) { -+ printf("%s: invalid file format\n", graphics_file); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ if(verbose) { -+ printf("init: start 0x%x, len %d; code offset 0x%x\n", file_start, file_len, code_start); -+ wait_for_key(); -+ } -+ -+ if(file_len - code_start + MIN_GFX_FREE > buf_size) { -+ printf("not enough free memory: %d extra bytes need\n", file_len - code_start + MIN_GFX_FREE - buf_size); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ memcpy((void *) buf, (void *) (buf_ext + file_start + code_start), file_len - code_start); -+ -+ mem0_start += file_len - code_start; -+ mem0_start = (mem0_start + 3) & ~3; /* align */ -+ -+ /* init interface to graphics functions */ -+ -+ *(unsigned *) (gfx_data->sys_cfg + SC_FILE) = (unsigned) buf_ext + file_start; -+ *(unsigned *) (gfx_data->sys_cfg + SC_ARCHIVE_START) = (unsigned) buf_ext; -+ *(unsigned *) (gfx_data->sys_cfg + SC_ARCHIVE_END) = (unsigned) buf_ext + gfx_file_size; -+ *(unsigned *) (gfx_data->sys_cfg + SC_MEM0_START) = mem0_start; -+ *(unsigned *) (gfx_data->sys_cfg + SC_MEM0_END) = mem0_end; -+ -+ gfx_data->code_seg = (unsigned) buf >> 4; -+ -+ if(verbose) { -+ printf("init 0x%x, archive 0x%x - 0x%x, low mem 0x%x - 0x%x\ncode seg 0x%x\n", -+ (unsigned) buf_ext + file_start, -+ (unsigned) buf_ext, (unsigned) buf_ext + gfx_file_size, -+ mem0_start, mem0_end, gfx_data->code_seg -+ ); -+ wait_for_key(); -+ } -+ -+ for(i = 0; (unsigned) i < sizeof gfx_data->jmp_table / sizeof *gfx_data->jmp_table; i++) { -+ gfx_data->jmp_table[i] = (gfx_data->code_seg << 16) + ((unsigned short *) buf)[i]; -+ } -+ -+ if(verbose) { -+ for(i = 0; i < 12; i++) { -+ printf("%d: 0x%x\n", i, gfx_data->jmp_table[i]); -+ } -+ -+ for(i = 0; i < gfx_data->menu_entries; i++) { -+ printf("\"%s\" -- \"%s\"\n", -+ gfx_data->menu_list + i * gfx_data->menu_entry_len, -+ gfx_data->args_list + i * gfx_data->args_entry_len -+ ); -+ } -+ -+ printf("default: \"%s\"\n", gfx_data->menu_default_entry); -+ wait_for_key(); -+ } -+ -+ /* switch to graphics mode */ -+ -+ if(gfx_init(gfx_data)) { -+ printf("graphics initialization failed\n"); -+ sleep(5); -+ heap = saved_heap; -+ return; -+ } -+ -+ gfx_setup_menu(gfx_data); -+ -+ i = gfx_input(gfx_data, &selected_entry); -+ -+ /* ESC -> show text menu */ -+ if(i == 1) { -+ gfx_done(gfx_data); -+ grub_timeout = -1; -+ -+ heap = saved_heap; -+ return; -+ } -+ -+ gfx_done(gfx_data); -+ -+ heap = saved_heap; /* free most of the graphics data */ -+ -+ // printf("cmdline: >%s<, entry = %d\n", gfx_data->cmdline, selected_entry); -+ -+ if(selected_entry < 0 || selected_entry > num_entries) return; -+ -+ -+ /* create new config with modified kernel option */ -+ -+ cfg = get_entry(config_entries, selected_entry, 1); -+ -+ new_config = heap; -+ -+ for(p = gfx_data->cmdline, i = 0; ; i++) { -+ s = get_entry(cfg, i, 0); -+ if(!*s) { -+ if(!i) *heap++ = 0; -+ *heap++ = 0; -+ break; -+ } -+ /* note: must match get_kernel_args() */ -+ if( -+ (!memcmp(s, "kernel", 6) || !memcmp(s, "module", 6)) && -+ (s[6] == ' ' || s[6] == '\t') -+ ) { -+ t = skip_to(0, s); -+ t2 = s[0] == 'm' ? strstr(t, "initrd") : NULL; -+ if(*t) t = skip_to(0, t); -+ if(t2 && t2 < t) { /* module is likely a normal initrd -> skip */ -+ strcpy(heap, s); -+ heap += strlen(s) + 1; -+ continue; -+ } -+ memmove(heap, s, t - s); -+ heap += t - s; -+ *heap++ = ' '; -+ while(*p && *p != GFX_CMD_SEP) *heap++ = *p++; -+ *heap++ = 0; -+ if(*p == GFX_CMD_SEP) p++; -+ } -+ else { -+ strcpy(heap, s); -+ heap += strlen(s) + 1; -+ } -+ } -+ -+ *heap++ = 0; -+ -+ // hexdump(new_config, heap - new_config); -+ // getkey(); -+ -+ run_script(new_config, heap); -+} -+ -+ - static int - get_line_from_config (char *cmdline, int maxlen, int read_from_file) - { -@@ -1062,9 +1557,12 @@ - } - else - { -- /* Run menu interface. */ -- run_menu (menu_entries, config_entries, num_entries, -- menu_entries + menu_len, default_entry); -+ if (*graphics_file && !password && show_menu && grub_timeout) -+ { -+ run_graphics_menu(menu_entries, config_entries, num_entries,menu_entries + menu_len, default_entry); -+ } -+ /* Run menu interface. */ -+ run_menu (menu_entries, config_entries, num_entries, menu_entries + menu_len, default_entry); - } - } - }