]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/commitdiff
Neuer Installer eingefügt...
authorms <ms@ea5c0bd1-69bd-2848-81d8-4f18e57aeed8>
Thu, 16 Feb 2006 21:18:00 +0000 (21:18 +0000)
committerms <ms@ea5c0bd1-69bd-2848-81d8-4f18e57aeed8>
Thu, 16 Feb 2006 21:18:00 +0000 (21:18 +0000)
git-svn-id: http://svn.ipfire.org/svn/ipfire/1.4/source@37 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8

15 files changed:
src/install+setup/install/cdrom.c
src/install+setup/install/config.c
src/install+setup/install/ide.c
src/install+setup/install/install.h
src/install+setup/install/install2.c
src/install+setup/install/main.c
src/install+setup/install/net.c
src/install+setup/install/nic.c
src/install+setup/install/pcmcia.c
src/install+setup/install/pcmcia.h
src/install+setup/install/probescsi.sh
src/install+setup/install/scsi.c
src/install+setup/install/upgrade-v12-v13.c
src/install+setup/install/upgrade-v130-v140.c
src/install+setup/install/usb.c

index eb21c8601a1ce8befeda1ca06b0504e377eb71a3..f0510e92f72e205b4fcf19c53ef67336e4b25f86 100644 (file)
@@ -1,36 +1,36 @@
-/* SmoothWall install program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * CDROM menu. Get "misc" driver name etc. \r
- *\r
- * $Id: cdrom.c,v 1.6.2.1 2004/04/14 22:05:39 gespinasse Exp $\r
- *\r
- */\r
-\r
-#include "install.h"\r
-\r
-extern FILE *flog;\r
-extern char *mylog;\r
-\r
-extern char **ctr;\r
-\r
-/* Ejects the CDROM.  returns 0 for failure, 1 for success. */\r
-int ejectcdrom(char *dev)\r
-{\r
-       int fd;\r
-\r
-       if ((fd = open(dev, O_RDONLY|O_NONBLOCK)) == -1)\r
-               return 0;\r
-       \r
-       if (ioctl(fd, CDROMEJECT) == -1)\r
-       {\r
-               close(fd);\r
-               return 0;\r
-       }\r
-       close(fd);\r
-       \r
-       return 1;\r
-}\r
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * CDROM menu. Get "misc" driver name etc. 
+ *
+ * $Id: cdrom.c,v 1.6.2.1 2004/04/14 22:05:39 gespinasse Exp $
+ *
+ */
+
+#include "install.h"
+
+extern FILE *flog;
+extern char *mylog;
+
+extern char **ctr;
+
+/* Ejects the CDROM.  returns 0 for failure, 1 for success. */
+int ejectcdrom(char *dev)
+{
+       int fd;
+
+       if ((fd = open(dev, O_RDONLY|O_NONBLOCK)) == -1)
+               return 0;
+       
+       if (ioctl(fd, CDROMEJECT) == -1)
+       {
+               close(fd);
+               return 0;
+       }
+       close(fd);
+       
+       return 1;
+}
index bd9bea2855fcb3f375cf493973ba27ef063fe440..89cfa5921c37800aec106b277dd09c99551799b1 100644 (file)
-/* SmoothWall install program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * Write the config and get password stuff.\r
- * \r
- * $Id: config.c,v 1.6.2.3 2005/12/07 20:42:48 franck78 Exp $\r
- * \r
- */\r
-\r
-#include "install.h"\r
-extern char **ctr;     // text translation table\r
-\r
-/* called to write out all config files using the keyvalue interface. */\r
-int write_disk_configs(struct devparams *dp)\r
-{\r
-       char devnode[STRING_SIZE];\r
-       char partition[STRING_SIZE];\r
-       char *messages[5] = {   NULL,\r
-                               ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK1],\r
-                               ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK2],\r
-                               ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK3],\r
-                               ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK4] \r
-                       };\r
-       /* dev node links. */\r
-       sprintf(devnode, "%s", dp->devnode_disk_run);\r
-       if (symlink(devnode, "/harddisk/dev/harddisk"))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK]);\r
-               return 0;\r
-       }\r
-       \r
-       int j;\r
-       for (j=1; j<5; j++) {\r
-               sprintf(devnode, "%s%d", dp->devnode_part_run,j);\r
-               sprintf(partition,"/harddisk/dev/harddisk%d",j);\r
-               if (symlink(devnode, partition))\r
-               {\r
-                       errorbox( messages[j] );\r
-                       return 0;\r
-               }\r
-       }\r
-\r
-       /* Add /dev/root symlink linking to the root filesystem to \r
-        * keep updfstab happy */\r
-       sprintf(devnode, "%s4", dp->devnode_part_run);\r
-       if (symlink(devnode, "/harddisk/dev/root"))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_ROOT]);\r
-               return 0;\r
-       }\r
-\r
-       return 1;\r
-}\r
-\r
-int write_lang_configs( char *lang)\r
-{\r
-       struct keyvalue *kv = initkeyvalues();\r
-       \r
-       /* default stuff for main/settings. */\r
-       replacekeyvalue(kv, "LANGUAGE", lang);\r
-       replacekeyvalue(kv, "HOSTNAME", SNAME);\r
-       writekeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings");\r
-       freekeyvalues(kv);\r
-       \r
-       return 1;\r
-}\r
-\r
-int write_ethernet_configs(struct keyvalue *ethernetkv)\r
-{\r
-       /* Write out the network settings we got from a few mins ago. */\r
-       writekeyvalues(ethernetkv, "/harddisk" CONFIG_ROOT "/ethernet/settings");\r
-       return 1;\r
-}\r
-\r
-/* Taken from the cdrom one. */\r
-int getpassword(char *password, char *text)\r
-{\r
-       char *values[] = {      NULL, NULL, NULL };     /* pointers for the values. */\r
-       struct newtWinEntry entries[] =\r
-       { \r
-               { ctr[TR_PASSWORD_PROMPT], &values[0], 2 },\r
-               { ctr[TR_AGAIN_PROMPT], &values[1], 2 },\r
-               { NULL, NULL, 0 }\r
-       };\r
-       char title[STRING_SIZE];\r
-       int rc;\r
-       int done;\r
-       \r
-       do\r
-       {\r
-               done = 1;\r
-               sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
-               rc = newtWinEntries(title, text,\r
-                       50, 5, 5, 20, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
-               \r
-               if (rc != 2)\r
-               {\r
-                       if (strlen(values[0]) == 0 || strlen(values[1]) == 0)\r
-                       {\r
-                               errorbox(ctr[TR_PASSWORD_CANNOT_BE_BLANK]);\r
-                               done = 0;\r
-                               strcpy(values[0], "");\r
-                               strcpy(values[1], "");                          \r
-                       }\r
-                       else if (strcmp(values[0], values[1]) != 0)\r
-                       {\r
-                               errorbox(ctr[TR_PASSWORDS_DO_NOT_MATCH]);\r
-                               done = 0;\r
-                               strcpy(values[0], "");\r
-                               strcpy(values[1], "");                                  \r
-                       }\r
-               }\r
-       }\r
-       while (!done);\r
-\r
-       strncpy(password, values[0], STRING_SIZE);\r
-\r
-       if (values[0]) free(values[0]);\r
-       if (values[1]) free(values[1]);\r
-\r
-       return rc;\r
-}\r
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Write the config and get password stuff.
+ * 
+ * $Id: config.c,v 1.6.2.3 2005/12/07 20:42:48 franck78 Exp $
+ * 
+ */
+
+#include "install.h"
+extern char **ctr;     // text translation table
+
+/* called to write out all config files using the keyvalue interface. */
+int write_disk_configs(struct devparams *dp)
+{
+       char devnode[STRING_SIZE];
+       char partition[STRING_SIZE];
+       char *messages[5] = {   NULL,
+                               ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK1],
+                               ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK2],
+                               ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK3],
+                               ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK4] 
+                       };
+       /* dev node links. */
+       sprintf(devnode, "%s", dp->devnode_disk_run);
+       if (symlink(devnode, "/harddisk/dev/harddisk"))
+       {
+               errorbox(ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK]);
+               return 0;
+       }
+       
+       int j;
+       for (j=1; j<5; j++) {
+               sprintf(devnode, "%s%d", dp->devnode_part_run,j);
+               sprintf(partition,"/harddisk/dev/harddisk%d",j);
+               if (symlink(devnode, partition))
+               {
+                       errorbox( messages[j] );
+                       return 0;
+               }
+       }
+
+       /* Add /dev/root symlink linking to the root filesystem to 
+        * keep updfstab happy */
+       sprintf(devnode, "%s4", dp->devnode_part_run);
+       if (symlink(devnode, "/harddisk/dev/root"))
+       {
+               errorbox(ctr[TR_UNABLE_TO_MAKE_SYMLINK_DEV_ROOT]);
+               return 0;
+       }
+
+       return 1;
+}
+
+int write_lang_configs( char *lang)
+{
+       struct keyvalue *kv = initkeyvalues();
+       
+       /* default stuff for main/settings. */
+       replacekeyvalue(kv, "LANGUAGE", lang);
+       replacekeyvalue(kv, "HOSTNAME", SNAME);
+       writekeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings");
+       freekeyvalues(kv);
+       
+       return 1;
+}
+
+int write_ethernet_configs(struct keyvalue *ethernetkv)
+{
+       /* Write out the network settings we got from a few mins ago. */
+       writekeyvalues(ethernetkv, "/harddisk" CONFIG_ROOT "/ethernet/settings");
+       return 1;
+}
+
+/* Taken from the cdrom one. */
+int getpassword(char *password, char *text)
+{
+       char *values[] = {      NULL, NULL, NULL };     /* pointers for the values. */
+       struct newtWinEntry entries[] =
+       { 
+               { ctr[TR_PASSWORD_PROMPT], &values[0], 2 },
+               { ctr[TR_AGAIN_PROMPT], &values[1], 2 },
+               { NULL, NULL, 0 }
+       };
+       char title[STRING_SIZE];
+       int rc;
+       int done;
+       
+       do
+       {
+               done = 1;
+               sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);
+               rc = newtWinEntries(title, text,
+                       50, 5, 5, 20, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);
+               
+               if (rc != 2)
+               {
+                       if (strlen(values[0]) == 0 || strlen(values[1]) == 0)
+                       {
+                               errorbox(ctr[TR_PASSWORD_CANNOT_BE_BLANK]);
+                               done = 0;
+                               strcpy(values[0], "");
+                               strcpy(values[1], "");                          
+                       }
+                       else if (strcmp(values[0], values[1]) != 0)
+                       {
+                               errorbox(ctr[TR_PASSWORDS_DO_NOT_MATCH]);
+                               done = 0;
+                               strcpy(values[0], "");
+                               strcpy(values[1], "");                                  
+                       }
+               }
+       }
+       while (!done);
+
+       strncpy(password, values[0], STRING_SIZE);
+
+       if (values[0]) free(values[0]);
+       if (values[1]) free(values[1]);
+
+       return rc;
+}
index 05e4ee748e53983483652673a5a0463468ef7337..dfde3a983f9d9d81cd04742c70cf2a1064512239 100644 (file)
@@ -1,61 +1,61 @@
-/* SmoothWall install program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * Contains some functs for scanning /proc for ide info on CDROMS and\r
- * harddisks.\r
- * \r
- * $Id: ide.c,v 1.4 2003/12/11 11:25:53 riddles Exp $\r
- * \r
- */\r
-\r
-#include "install.h"\r
-\r
-/* checkide().  Scans the named drive letter and returns the IDE_??? type. */\r
-int checkide(char letter)\r
-{\r
-       FILE *f = NULL;\r
-       char filename[STRING_SIZE];\r
-       char buffer[STRING_SIZE];\r
-       \r
-       sprintf(filename, "/proc/ide/hd%c/media", letter);\r
-       \r
-       if (!(f = fopen(filename, "r")))\r
-               return IDE_EMPTY;\r
-               \r
-       if (!(fgets(buffer, STRING_SIZE, f)))\r
-       {\r
-               printf("Couldn't read from %s\n", filename);\r
-               fclose(f);\r
-               return IDE_EMPTY;\r
-       }\r
-               \r
-       fclose(f);\r
-       \r
-       stripnl(buffer);\r
-       \r
-       if (strcmp(buffer, "cdrom") == 0)\r
-               return IDE_CDROM;\r
-       else if (strcmp(buffer, "disk") == 0)\r
-               return IDE_HD;\r
-       else\r
-               return IDE_UNKNOWN;\r
-}\r
-\r
-/* findidetype().  Finds the first ide deveice of the given IDE_?? type. */\r
-char findidetype(int type)\r
-{\r
-       char letter;\r
-       \r
-       for (letter = 'a'; letter <= 'z'; letter++)\r
-       {\r
-               if ((checkide(letter)) == type)\r
-               {\r
-                       return letter;\r
-               }\r
-       }\r
-       return '\0';\r
-}\r
-\r
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Contains some functs for scanning /proc for ide info on CDROMS and
+ * harddisks.
+ * 
+ * $Id: ide.c,v 1.4 2003/12/11 11:25:53 riddles Exp $
+ * 
+ */
+
+#include "install.h"
+
+/* checkide().  Scans the named drive letter and returns the IDE_??? type. */
+int checkide(char letter)
+{
+       FILE *f = NULL;
+       char filename[STRING_SIZE];
+       char buffer[STRING_SIZE];
+       
+       sprintf(filename, "/proc/ide/hd%c/media", letter);
+       
+       if (!(f = fopen(filename, "r")))
+               return IDE_EMPTY;
+               
+       if (!(fgets(buffer, STRING_SIZE, f)))
+       {
+               printf("Couldn't read from %s\n", filename);
+               fclose(f);
+               return IDE_EMPTY;
+       }
+               
+       fclose(f);
+       
+       stripnl(buffer);
+       
+       if (strcmp(buffer, "cdrom") == 0)
+               return IDE_CDROM;
+       else if (strcmp(buffer, "disk") == 0)
+               return IDE_HD;
+       else
+               return IDE_UNKNOWN;
+}
+
+/* findidetype().  Finds the first ide deveice of the given IDE_?? type. */
+char findidetype(int type)
+{
+       char letter;
+       
+       for (letter = 'a'; letter <= 'z'; letter++)
+       {
+               if ((checkide(letter)) == type)
+               {
+                       return letter;
+               }
+       }
+       return '\0';
+}
+
index a58304942cf50187f9eee7fec50b7d7013c6c745..c04984fb5303d5fe175d8f6276514f5b068560e3 100644 (file)
@@ -1,92 +1,92 @@
-/* SmoothWall install program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * Main include file.\r
- * \r
- * $Id: install.h,v 1.10.2.4 2006/01/11 01:01:38 franck78 Exp $\r
- * \r
- */\r
-\r
-#include "../libsmooth/libsmooth.h"\r
-\r
-#define IDE_EMPTY 0\r
-#define IDE_CDROM 1\r
-#define IDE_HD 2\r
-#define IDE_UNKNOWN 3\r
-\r
-/* CDROMS and harddisks. */\r
-struct devparams\r
-{\r
-       char devnode_disk[30];          // when single partition is addressed\r
-       char devnode_part[30];          // when the RAID partition is addressed\r
-       char devnode_disk_run[30];      // the same dev but after installation \r
-       char devnode_part_run[30];\r
-       char modulename[STRING_SIZE];\r
-       char options[STRING_SIZE];\r
-//     int module;\r
-};\r
-\r
-/* ide.c */\r
-int checkide(char letter);\r
-char findidetype(int type);\r
-\r
-/* cdrom.c */\r
-int ejectcdrom(char *dev);\r
-\r
-/* nic.c */\r
-int networkmenu(struct keyvalue *ethernetkv);\r
-\r
-/* net.c */\r
-int checktarball(char *);\r
-\r
-/* config.c */\r
-int write_disk_configs(struct devparams *dp);\r
-int write_lang_configs( char *lang);\r
-int write_ethernet_configs(struct keyvalue *ethernetkv);\r
-\r
-/* pcmcia.c */\r
-char * initialize_pcmcia (void);\r
-\r
-/* upgrade_v12_v13.c */\r
-int upgrade_v12_v13();\r
-\r
-/* upgrade_v130_v131.c */\r
-int upgrade_v130_v140();\r
-\r
-/* usb.c */\r
-int initialize_usb();\r
-int write_usb_modules_conf();\r
-int checkusb (char *partition);\r
-\r
-/* scsi.c */\r
-int try_scsi(char *dev);\r
-int get_boot(char *dev);\r
-\r
-/*main.c */\r
-int modprobe (char *mod);\r
-int rmmod (char *mod);\r
-\r
-extern char *bz_tr[];\r
-extern char *cs_tr[];\r
-extern char *da_tr[];\r
-extern char *en_tr[];\r
-extern char *es_tr[];\r
-extern char *fi_tr[];\r
-extern char *fr_tr[];\r
-extern char *hu_tr[];\r
-extern char *la_tr[];\r
-extern char *nl_tr[];\r
-extern char *de_tr[];\r
-extern char *tr_tr[];\r
-extern char *it_tr[];\r
-extern char *el_tr[];\r
-extern char *pl_tr[];\r
-extern char *pt_tr[];\r
-extern char *sk_tr[];\r
-extern char *so_tr[];\r
-extern char *sv_tr[];\r
-extern char *no_tr[];\r
-extern char *vi_tr[];\r
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Main include file.
+ * 
+ * $Id: install.h,v 1.10.2.4 2006/01/11 01:01:38 franck78 Exp $
+ * 
+ */
+
+#include "../libsmooth/libsmooth.h"
+
+#define IDE_EMPTY 0
+#define IDE_CDROM 1
+#define IDE_HD 2
+#define IDE_UNKNOWN 3
+
+/* CDROMS and harddisks. */
+struct devparams
+{
+       char devnode_disk[30];          // when single partition is addressed
+       char devnode_part[30];          // when the RAID partition is addressed
+       char devnode_disk_run[30];      // the same dev but after installation 
+       char devnode_part_run[30];
+       char modulename[STRING_SIZE];
+       char options[STRING_SIZE];
+//     int module;
+};
+
+/* ide.c */
+int checkide(char letter);
+char findidetype(int type);
+
+/* cdrom.c */
+int ejectcdrom(char *dev);
+
+/* nic.c */
+int networkmenu(struct keyvalue *ethernetkv);
+
+/* net.c */
+int checktarball(char *);
+
+/* config.c */
+int write_disk_configs(struct devparams *dp);
+int write_lang_configs( char *lang);
+int write_ethernet_configs(struct keyvalue *ethernetkv);
+
+/* pcmcia.c */
+char * initialize_pcmcia (void);
+
+/* upgrade_v12_v13.c */
+int upgrade_v12_v13();
+
+/* upgrade_v130_v131.c */
+int upgrade_v130_v140();
+
+/* usb.c */
+int initialize_usb();
+int write_usb_modules_conf();
+int checkusb (char *partition);
+
+/* scsi.c */
+int try_scsi(char *dev);
+int get_boot(char *dev);
+
+/*main.c */
+int modprobe (char *mod);
+int rmmod (char *mod);
+
+extern char *bz_tr[];
+extern char *cs_tr[];
+extern char *da_tr[];
+extern char *en_tr[];
+extern char *es_tr[];
+extern char *fi_tr[];
+extern char *fr_tr[];
+extern char *hu_tr[];
+extern char *la_tr[];
+extern char *nl_tr[];
+extern char *de_tr[];
+extern char *tr_tr[];
+extern char *it_tr[];
+extern char *el_tr[];
+extern char *pl_tr[];
+extern char *pt_tr[];
+extern char *sk_tr[];
+extern char *so_tr[];
+extern char *sv_tr[];
+extern char *no_tr[];
+extern char *vi_tr[];
index 18ffc97a1ce8646fedf18818ec06579a750d3a36..b724c9e02884e2d3d5548dea1f8d2dc56be564e8 100644 (file)
-/* IPCop install2 program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * (c) Franck Bourdonnec, 2006\r
- * Contains update/restore code\r
- * \r
- * $Id: install2.c,v 1.1.2.3 2006/01/31 00:51:50 franck78 Exp $\r
- * \r
- */\r
-#include "install.h"\r
-\r
-FILE *flog = NULL;\r
-char *mylog;\r
-char **ctr;\r
-\r
-/* \r
-    To include a translated string in the final installer, you must reference\r
-    it here with a simplr comment. This save a lot a space in the installer\r
-*/\r
-\r
-/* TR_BUILDING_INITRD */\r
-/* TR_HELPLINE */\r
-/* TR_SKIP */\r
-/* TR_RESTORE_CONFIGURATION */\r
-/* TR_RESTORE */\r
-/* TR_OK */\r
-/* TR_CANCEL */\r
-/* TR_ERROR */\r
-/* TR_INSTALLING_FILES */\r
-/* TR_FAILED_TO_FIND */\r
-/* TR_UNABLE_TO_INSTALL_FILES */\r
-/* TR_LOADING_PCMCIA */\r
-\r
-//libsmooth\r
-/* TR_INTERFACE */\r
-/* TR_ENTER_THE_IP_ADDRESS_INFORMATION */\r
-/* TR_STATIC */\r
-/* TR_DHCP_HOSTNAME */\r
-/* TR_IP_ADDRESS_PROMPT */\r
-/* TR_NETMASK_PROMPT */\r
-/* TR_INVALID_FIELDS */\r
-/* TR_IP_ADDRESS_CR */\r
-/* TR_NETWORK_MASK_CR */\r
-/* TR_DHCP_HOSTNAME_CR */\r
-/* TR_LOOKING_FOR_NIC */\r
-/* TR_MANUAL */\r
-/* TR_SELECT_NETWORK_DRIVER */\r
-/* TR_SELECT_NETWORK_DRIVER_LONG */\r
-/* TR_UNABLE_TO_LOAD_DRIVER_MODULE */\r
-/* TR_THIS_DRIVER_MODULE_IS_ALREADY_LOADED */\r
-/* TR_MODULE_PARAMETERS */\r
-/* TR_LOADING_MODULE */\r
-/* TR_MODULE_NAME_CANNOT_BE_BLANK */\r
-\r
-//upgrade 120\r
-/* TR_UNABLE_TO_OPEN_SETTINGS_FILE */\r
-/* TR_DOMAINNAME */\r
-/* TR_ENTER_DOMAINNAME */\r
-/* TR_DOMAINNAME_CANNOT_CONTAIN_SPACES */\r
-/* TR_UNABLE_TO_MOUNT_PROC_FILESYSTEM */\r
-/* TR_UNABLE_TO_WRITE_ETC_FSTAB */\r
-\r
-// dir to find files, chrooted or not...\r
-#define TMP_EXTRACT_CH "/tmp/ipcop"\r
-#define TMP_EXTRACT "/harddisk" TMP_EXTRACT_CH\r
-#define MOUNT_BACKUP_CH "/mnt/usb"\r
-#define MOUNT_BACKUP "/harddisk" MOUNT_BACKUP_CH\r
-/*\r
-    return 0 when dev contains a backup set\r
-    leave dev mounted\r
-*/\r
-int try_mount (char *dev, char *testfile) {\r
-       char commandstring[STRING_SIZE];\r
-       mysystem("/bin/umount " MOUNT_BACKUP);\r
-       sprintf(commandstring, "/bin/mount -t vfat -o ro %s " MOUNT_BACKUP, dev);\r
-       mysystem(commandstring);\r
-\r
-       /*verify it's what we want */\r
-       sprintf(commandstring, MOUNT_BACKUP "/%s.dat", testfile);\r
-       FILE *handle = fopen(commandstring, "r");\r
-       if (handle == NULL) {\r
-               return 1;   /* bad disk ! */\r
-       }\r
-       fclose(handle);\r
-       \r
-       handle = fopen(MOUNT_BACKUP "/backup.key", "r");\r
-       if (handle == NULL) {\r
-               return 1;   /* bad disk ! */\r
-       }\r
-       fclose(handle);\r
-       return 0; //success\r
-}\r
-\r
-/* try to mount usb device until backup.tgz is found except the \r
-    destination device (scsi names are identical with usb key)\r
-    check "sda sdb sdc sdd"\r
-*/\r
-int mountbackup (char *testfile, char *destination_device) {\r
-       char sourcedev[30];\r
-       char i,j;\r
-       for (i = 'a'; i < 'e'; i++) {\r
-               sprintf (sourcedev,"/dev/sd%c ",i);\r
-               if (strcmp (destination_device, sourcedev) != 0) {\r
-                       if (!try_mount (sourcedev, testfile)) return 0;\r
-               }\r
-               for (j = '1'; j < '5'; j++) {\r
-                       sourcedev[8] = j;\r
-                       if (strcmp (destination_device, sourcedev) != 0) {\r
-                               if (!try_mount (sourcedev, testfile)) return 0;\r
-                       }\r
-               }\r
-       }\r
-       return 1;\r
-}\r
-\r
-int floppy_locate() {\r
-       /* Temporarily mount /proc under /harddisk/proc,\r
-           run updfstab to locate the floppy, and unmount /harddisk/proc\r
-           again.  This should be run each time the user tries to restore\r
-           so it can properly detect removable devices */\r
-       if (mysystem("/bin/mount -n -t proc /proc /harddisk/proc")) {\r
-               errorbox(ctr[TR_UNABLE_TO_MOUNT_PROC_FILESYSTEM]);\r
-               return 1;\r
-       }\r
-       if (mysystem("/bin/chroot /harddisk /usr/sbin/updfstab")) {\r
-               errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_FSTAB]);\r
-               return 1;\r
-       }\r
-       mysystem("/bin/umount /harddisk/proc");\r
-       return 0;\r
-}\r
-\r
-/* Check the SQUID acl file exists, if not use our 1.4 copy */\r
-void fixup_squidacl() {\r
-       FILE *aclreadfile;\r
-       if ((aclreadfile = fopen ("/harddisk" CONFIG_ROOT "/proxy/acl", "r"))) {\r
-               unlink ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4");\r
-               fclose(aclreadfile);\r
-       } else {\r
-               rename ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4",\r
-                       "/harddisk" CONFIG_ROOT "/proxy/acl");\r
-       }\r
-       chown  ("/harddisk" CONFIG_ROOT "/proxy/acl", 99, 99);\r
-}\r
-/* if we detected SCSI then fixup */\r
-void fixup_initrd() {\r
-       FILE *handle;\r
-       char line[STRING_SIZE];\r
-       char commandstring[STRING_SIZE];\r
-       \r
-        if (!(handle = fopen("/scsidriver", "r"))) \r
-           return;\r
-\r
-       char *driver;\r
-               fgets(line, STRING_SIZE-1, handle);\r
-       fclose(handle);\r
-       line[strlen(line) - 1] = 0;\r
-       driver = strtok(line, ".");\r
-       fprintf(flog, "Detected SCSI driver %s\n", driver);\r
-       if (!strlen(driver) > 1) \r
-               return;\r
-               \r
-       fprintf(flog, "Fixing up ipcoprd.img\n");\r
-       mysystem("/bin/chroot /harddisk /sbin/modprobe loop");\r
-       mkdir("/harddisk/initrd", S_IRWXU|S_IRWXG|S_IRWXO);\r
-       sprintf(commandstring, "/bin/chroot /harddisk /sbin/mkinitrd"\r
-                               " --with=scsi_mod --with=%s --with=sd_mod"\r
-                               " --with=sr_mod --with=libata"\r
-                               " --with=ataraid /boot/ipcoprd.img "KERNEL_VERSION,\r
-                               driver );\r
-       runcommandwithstatus(commandstring, ctr[TR_BUILDING_INITRD]);\r
-#ifdef __i386__\r
-       sprintf(commandstring, "/bin/chroot /harddisk /sbin/mkinitrd"\r
-                               " --with=scsi_mod --with=%s --with=sd_mod"\r
-                               " --with=sr_mod --with=libata"\r
-                               " --with=ataraid /boot/ipcoprd-smp.img "KERNEL_VERSION"-smp",\r
-                               driver );\r
-       runcommandwithstatus(commandstring, ctr[TR_BUILDING_INITRD]);\r
-       mysystem("/bin/chroot /harddisk /bin/mv /boot/grub/scsigrub.conf /boot/grub/grub.conf");\r
-#endif\r
-#ifdef __alpha__\r
-       runcommandwithstatus("/bin/chroot /harddisk /bin/mv /boot/etc/scsiaboot.conf /boot/etc/aboot.conf", ctr[TR_BUILDING_INITRD]);\r
-#endif\r
-}\r
-/* when backup is ready in tmpdir, move files to definitive location */\r
-void do_copy_files(int upgrade_level) {\r
-       mysystem("/bin/chroot /harddisk /bin/cp -af "TMP_EXTRACT_CH"/. /");\r
-       /* Upgrade necessary files from v1.2 to v1.3 to v1.4 */\r
-       switch (upgrade_level) {\r
-       case 1:\r
-               upgrade_v12_v13();\r
-               upgrade_v130_v140();\r
-       case 2: //some 1.4 files format changed\r
-               //between 1.4.0 & 1.4.11  If possible de determine backup/version\r
-               //the update code should go here\r
-       }\r
-}\r
-\r
-int main(int argc, char *argv[]) {\r
-#define LANG argv[1]\r
-#define DEST_DEV argv[2]\r
-#define WGET argv[3]\r
-\r
-#ifdef LANG_EN_ONLY\r
-        char **langtrs[] = { en_tr, NULL };\r
-#else\r
-       char **langtrs[] = { bz_tr, cs_tr, da_tr, de_tr, en_tr, es_tr, fr_tr, el_tr, it_tr, la_tr, hu_tr, nl_tr, no_tr, pl_tr, pt_tr, sk_tr, so_tr, fi_tr, sv_tr, tr_tr, vi_tr, NULL };\r
-#endif\r
-       char message[1000];\r
-       char title[STRING_SIZE];\r
-       char commandstring[STRING_SIZE];\r
-\r
-       setlocale (LC_ALL, ""); \r
-       /* Log file/terminal stuff. */\r
-       mylog = "/dev/tty2";\r
-       ctr = langtrs[ atoi(LANG) ];\r
-\r
-       if (!(flog = fopen(mylog, "w+")))\r
-       {\r
-               printf("Couldn't open log terminal\n");\r
-               return 0;\r
-       }\r
-       fprintf(flog, "Install2 program started.\n");\r
-       newtInit();\r
-       newtCls();\r
-       strcpy (title, NAME " v" VERSION " - " SLOGAN);\r
-       newtDrawRootText(14, 0, title);\r
-       newtPushHelpLine(ctr[TR_HELPLINE]);\r
-/*\r
-       // build now the device node\r
-       runcommandwithstatus("echo 'cd /dev; ./make_devices'>/harddisk/X;" \r
-                                   "chroot /harddisk chmod +x /X;"\r
-                                   "chroot /harddisk /X;"\r
-                                   "chroot /harddisk rm /X"                                \r
-                                   , ctr[TR_INSTALLING_FILES]);\r
-*/\r
-       /* working dirs... */\r
-       mkdir(MOUNT_BACKUP, S_IRWXU|S_IRWXG|S_IRWXO);\r
-\r
-       //create the GUI screen and objects\r
-       newtComponent form, header, labelfile, labelkey, file, key, radio0, radio1, radio2, radio3, radio4, ok;\r
-\r
-       newtCenteredWindow (55,20,ctr[TR_RESTORE]);\r
-       form = newtForm (NULL, NULL,0);\r
-\r
-       sprintf(message, ctr[TR_RESTORE_CONFIGURATION], NAME);\r
-       header = newtTextboxReflowed (2,1,message,51,0,0,0);\r
-       newtFormAddComponent(form, header);\r
-\r
-        // The four method of restauration\r
-        int start1=1, start2=0, start3=0, start4=0;\r
-        radio1 = newtRadiobutton (17, 5, ctr[TR_SKIP], start1, NULL);\r
-        radio2 = newtRadiobutton (17, 6, "Floppy (legacy)", start2, radio1);\r
-        radio3 = newtRadiobutton (17, 7, "Usb-storage/CDROM", start3, radio2);\r
-        if (strcmp(WGET,"none"))\r
-            radio4 = newtRadiobutton (17, 8, "HTTP/FTP", start4, radio3);\r
-       else\r
-            radio4 = NULL;\r
-        newtFormAddComponents(form, radio1, radio2, radio3, radio4, NULL);\r
-\r
-        // The optionnal filename for 'backup'\r
-        labelfile=newtTextbox(12, 10, 35, 1, 0);\r
-        newtTextboxSetText (labelfile, "Filename");\r
-       newtFormAddComponent(form, labelfile);\r
-        char *filevalue;\r
-        char fileinit[STRING_SIZE] = "backup";\r
-        file = newtEntry (17, 11, fileinit, 20, &filevalue, 0);\r
-       newtFormAddComponent(form, file);\r
-\r
-        // The optionnal password for the key\r
-        labelkey=newtTextbox(12, 13, 35, 1, 0);\r
-        newtTextboxSetText (labelkey, "Backup key password");\r
-       newtFormAddComponent(form, labelkey);\r
-        char *keyvalue;\r
-        char keyinit[STRING_SIZE] = "";\r
-        key = newtEntry (17, 14, keyinit, 20, &keyvalue, 0);\r
-       newtFormAddComponent(form, key);\r
-\r
-        // The OK button\r
-       ok=newtButton (23, 16, ctr[TR_OK]);\r
-       newtFormAddComponent(form, ok);\r
-\r
-       /* loop until succeeds or user skips out */\r
-       int retcode = -1;\r
-       while ( retcode<0 ) {\r
-\r
-           // run the windows\r
-           struct newtExitStruct reponse;\r
-           newtFormRun (form, &reponse);\r
-           radio0 = newtRadioGetCurrent(radio1);\r
-            int radio;\r
-            radio = radio0 == radio1 ? 1 : radio0 == radio2 ? 2 :  radio0 == radio3 ? 3 : radio0 == radio4 ? 4 : 0;\r
-            strcpy(keyinit,keyvalue);  //reuse actual value\r
-            strcpy(fileinit,filevalue);\r
-\r
-           if (radio==1) {\r
-                   retcode = 1;        // no restore: nothing special\r
-                   break;              // out of the while loop\r
-           }\r
-\r
-           mkdir(TMP_EXTRACT, S_IRWXU|S_IRWXG|S_IRWXO);\r
-           statuswindow(45, 4, title, ctr[TR_INSTALLING_FILES]);\r
-           switch (radio) {\r
-           case 4:     // network\r
-                   sprintf(commandstring,"/bin/wget -P " TMP_EXTRACT " %s/%s.dat", WGET, filevalue);\r
-                   mysystem (commandstring);\r
-                   sprintf(commandstring,"/bin/wget -P " TMP_EXTRACT " %s/%s.key", WGET, filevalue);\r
-                   if (mysystem (commandstring)) {\r
-                           errorbox(ctr[TR_FAILED_TO_FIND]);\r
-                           break;\r
-                   };\r
-                   goto COMMON;\r
-           case 3:     // normal backup\r
-                   if (mountbackup( filevalue, DEST_DEV )) {\r
-                           errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);//mess=no device with backup found\r
-                           break;\r
-                   };\r
-                   // link files to a COMMON location\r
-                   sprintf (commandstring, "chroot /harddisk ln -s "MOUNT_BACKUP_CH"/%s.dat " TMP_EXTRACT_CH "/%s.dat", filevalue, filevalue);\r
-                   mysystem (commandstring);\r
-                   sprintf (commandstring, "chroot /harddisk ln -s "MOUNT_BACKUP_CH"/%s.key " TMP_EXTRACT_CH "/%s.key", filevalue, filevalue);\r
-                   mysystem (commandstring);\r
-\r
-       COMMON:     // DECRYPT THE TARBALL\r
-                   // Copy the key to a new location because we decrypt it!    \r
-                   if (strcmp(keyvalue, "")) { // password provided: decrypt the key\r
-                           sprintf(commandstring,   "/bin/chroot /harddisk /usr/bin/openssl enc"\r
-                                                   " -a -d -aes256 -salt"\r
-                                                   " -pass pass:%s"\r
-                                                   " -in " TMP_EXTRACT_CH "/%s.key"\r
-                                                   " -out " TMP_EXTRACT_CH "/__tmp.key",\r
-                                                   keyvalue, filevalue);\r
-                   } else {                    //just copy to new name\r
-                           sprintf(commandstring,  "/bin/chroot /harddisk cp"\r
-                                                   " " TMP_EXTRACT_CH "/%s.key"\r
-                                                   " " TMP_EXTRACT_CH "/__tmp.key",\r
-                                                   filevalue);\r
-                   }\r
-                   mysystem (commandstring);\r
-\r
-                   sprintf(commandstring,  "/bin/chroot /harddisk /usr/bin/openssl des3"\r
-                                           " -d -salt"\r
-                                           " -in " TMP_EXTRACT_CH "/%s.dat"\r
-                                           " -out " TMP_EXTRACT_CH "/backup.tgz"\r
-                                           " -kfile " TMP_EXTRACT_CH "/__tmp.key",\r
-                                           filevalue);\r
-\r
-                   if (mysystem (commandstring)) {\r
-                           errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);//mess=decrypt error:invalid key?\r
-                           break;\r
-                   }\r
-                   strcpy(commandstring,   "/bin/chroot /harddisk /bin/tar"\r
-                                           " -X " CONFIG_ROOT "/backup/exclude.system"\r
-                                           " -C " TMP_EXTRACT_CH\r
-                                           " -xzf " TMP_EXTRACT_CH "/backup.tgz");\r
-\r
-                   if (mysystem(commandstring)) {\r
-                           errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);\r
-                           break;\r
-                   }\r
-                   sprintf(commandstring, TMP_EXTRACT "/%s.dat", filevalue);\r
-                   unlink(commandstring ); //dont need them anymore\r
-                   unlink( TMP_EXTRACT "/backup.tgz");\r
-                   sprintf(commandstring, TMP_EXTRACT "/%s.key", filevalue);\r
-                   unlink(commandstring );\r
-                   unlink( TMP_EXTRACT "/__tmp.key");\r
-\r
-                   /* Now copy to correct location */\r
-                   do_copy_files(0);\r
-                   retcode = 0; /* successfully restored */\r
-                   break;\r
-           case 2:\r
-                   // diskette change\r
-                   if (floppy_locate()) {\r
-                           retcode = 2; // this an error!\r
-                           break;\r
-                   }\r
-\r
-                   /* Always extract to /tmp/ipcop for temporary extraction\r
-                      just in case floppy fails.\r
-                      try a compressed backup first because it's quicker to fail.\r
-                      In exclude.system, files name must be without leading / or \r
-                      on extraction, name will never match\r
-                   */\r
-                   sprintf(commandstring,\r
-                    "/bin/chroot /harddisk /bin/tar -X " CONFIG_ROOT "/backup/exclude.system -C "TMP_EXTRACT_CH" -xvzf /dev/floppy > %s 2> /dev/null", mylog);\r
-                   if (system(commandstring)) {\r
-                   /* if it's not compressed, try uncompressed first before failing*/\r
-                       sprintf(commandstring,\r
-                    "/bin/chroot /harddisk /bin/tar -X " CONFIG_ROOT "/backup/exclude.system -C "TMP_EXTRACT_CH" -xvf /dev/floppy > %s 2> /dev/null", mylog);\r
-                       if (system(commandstring)) {\r
-                           /* command failed trying to read from floppy */\r
-                           errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);\r
-                           break;\r
-                       } \r
-                   }\r
-                   /* Now copy to correct location */\r
-                   do_copy_files(1);\r
-                   retcode = 0; /* successfully restored */\r
-           }//switch\r
-           /* remove possible badly restored files */\r
-           mysystem("/bin/chroot /harddisk /bin/rm -rf " TMP_EXTRACT_CH );\r
-           newtPopWindow(); // close windows\r
-       }//while\r
-        newtFormDestroy(form);\r
-\r
-       /* cleanup */\r
-       mysystem("/bin/umount " MOUNT_BACKUP);\r
-       mysystem("/bin/chroot /harddisk /bin/rmdir " MOUNT_BACKUP_CH);\r
-\r
-       /* others operations moved from install to install2 */\r
-       fixup_squidacl();\r
-       fixup_initrd();\r
-\r
-       fprintf(flog, "Install2 program ended.\n");\r
-       fflush(flog);\r
-       fclose(flog);\r
-       newtFinished();\r
-       return retcode;\r
-}\r
-\r
+/* IPCop install2 program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * (c) Franck Bourdonnec, 2006
+ * Contains update/restore code
+ * 
+ * $Id: install2.c,v 1.1.2.5 2006/02/10 06:53:57 gespinasse Exp $
+ * 
+ */
+#include "install.h"
+
+FILE *flog = NULL;
+char *mylog;
+char **ctr;
+
+/* 
+    To include a translated string in the final installer, you must reference
+    it here with a simplr comment. This save a lot a space in the installer
+*/
+
+/* TR_BUILDING_INITRD */
+/* TR_HELPLINE */
+/* TR_SKIP */
+/* TR_RESTORE_CONFIGURATION */
+/* TR_RESTORE */
+/* TR_OK */
+/* TR_CANCEL */
+/* TR_ERROR */
+/* TR_INSTALLING_FILES */
+/* TR_FAILED_TO_FIND */
+/* TR_UNABLE_TO_INSTALL_FILES */
+/* TR_LOADING_PCMCIA */
+
+//libsmooth
+/* TR_INTERFACE */
+/* TR_ENTER_THE_IP_ADDRESS_INFORMATION */
+/* TR_STATIC */
+/* TR_DHCP_HOSTNAME */
+/* TR_IP_ADDRESS_PROMPT */
+/* TR_NETMASK_PROMPT */
+/* TR_INVALID_FIELDS */
+/* TR_IP_ADDRESS_CR */
+/* TR_NETWORK_MASK_CR */
+/* TR_DHCP_HOSTNAME_CR */
+/* TR_LOOKING_FOR_NIC */
+/* TR_MANUAL */
+/* TR_SELECT_NETWORK_DRIVER */
+/* TR_SELECT_NETWORK_DRIVER_LONG */
+/* TR_UNABLE_TO_LOAD_DRIVER_MODULE */
+/* TR_THIS_DRIVER_MODULE_IS_ALREADY_LOADED */
+/* TR_MODULE_PARAMETERS */
+/* TR_LOADING_MODULE */
+/* TR_MODULE_NAME_CANNOT_BE_BLANK */
+
+//upgrade 120
+/* TR_UNABLE_TO_OPEN_SETTINGS_FILE */
+/* TR_DOMAINNAME */
+/* TR_ENTER_DOMAINNAME */
+/* TR_DOMAINNAME_CANNOT_CONTAIN_SPACES */
+/* TR_UNABLE_TO_MOUNT_PROC_FILESYSTEM */
+/* TR_UNABLE_TO_WRITE_ETC_FSTAB */
+
+// dir to find files, chrooted or not...
+#define TMP_EXTRACT_CH "/tmp/ipcop"
+#define TMP_EXTRACT "/harddisk" TMP_EXTRACT_CH
+#define MOUNT_BACKUP_CH "/mnt/usb"
+#define MOUNT_BACKUP "/harddisk" MOUNT_BACKUP_CH
+/*
+    return 0 when dev contains a backup set
+    leave dev mounted
+*/
+int try_mount (char *dev, char *testfile) {
+       char commandstring[STRING_SIZE];
+       mysystem("/bin/umount " MOUNT_BACKUP);
+       sprintf(commandstring, "/bin/mount -t vfat -o ro %s " MOUNT_BACKUP, dev);
+       mysystem(commandstring);
+
+       /*verify it's what we want */
+       sprintf(commandstring, MOUNT_BACKUP "/%s.dat", testfile);
+       FILE *handle = fopen(commandstring, "r");
+       if (handle == NULL) {
+               return 1;   /* bad disk ! */
+       }
+       fclose(handle);
+       
+       handle = fopen(MOUNT_BACKUP "/backup.key", "r");
+       if (handle == NULL) {
+               return 1;   /* bad disk ! */
+       }
+       fclose(handle);
+       return 0; //success
+}
+
+/* try to mount usb device until backup.tgz is found except the 
+    destination device (scsi names are identical with usb key)
+    check "sda sdb sdc sdd"
+*/
+int mountbackup (char *testfile, char *destination_device) {
+       char sourcedev[30];
+       char i,j;
+       for (i = 'a'; i < 'e'; i++) {
+               sprintf (sourcedev,"/dev/sd%c ",i);
+               if (strcmp (destination_device, sourcedev) != 0) {
+                       if (!try_mount (sourcedev, testfile)) return 0;
+               }
+               for (j = '1'; j < '5'; j++) {
+                       sourcedev[8] = j;
+                       if (strcmp (destination_device, sourcedev) != 0) {
+                               if (!try_mount (sourcedev, testfile)) return 0;
+                       }
+               }
+       }
+       return 1;
+}
+
+int floppy_locate() {
+       /* Temporarily mount /proc under /harddisk/proc,
+          run updfstab to locate the floppy, and unmount /harddisk/proc
+          again.  This should be run each time the user tries to restore
+          so it can properly detect removable devices */
+       if (mysystem("/bin/mount -n -t proc /proc /harddisk/proc")) {
+               errorbox(ctr[TR_UNABLE_TO_MOUNT_PROC_FILESYSTEM]);
+               return 1;
+       }
+       if (mysystem("/bin/chroot /harddisk /usr/sbin/updfstab")) {
+               errorbox(ctr[TR_UNABLE_TO_WRITE_ETC_FSTAB]);
+               return 1;
+       }
+       mysystem("/bin/umount /harddisk/proc");
+       return 0;
+}
+
+/* Check the SQUID acl file exists, if not use our 1.4 copy */
+void fixup_squidacl() {
+       FILE *aclreadfile;
+       if ((aclreadfile = fopen ("/harddisk" CONFIG_ROOT "/proxy/acl", "r"))) {
+               unlink ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4");
+               fclose(aclreadfile);
+       } else {
+               rename ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4",
+                       "/harddisk" CONFIG_ROOT "/proxy/acl");
+       }
+       chown  ("/harddisk" CONFIG_ROOT "/proxy/acl", 99, 99);
+}
+/* if we detected SCSI then fixup */
+void fixup_initrd() {
+       FILE *handle;
+       char line[STRING_SIZE];
+       char commandstring[STRING_SIZE];
+       
+       if (!(handle = fopen("/scsidriver", "r"))) 
+           return;
+
+       char *driver;
+       fgets(line, STRING_SIZE-1, handle);
+       fclose(handle);
+       line[strlen(line) - 1] = 0;
+       driver = strtok(line, ".");
+       fprintf(flog, "Detected SCSI driver %s\n", driver);
+       if (!strlen(driver) > 1) 
+               return;
+               
+       fprintf(flog, "Fixing up ipcoprd.img\n");
+       mysystem("/bin/chroot /harddisk /sbin/modprobe loop");
+       mkdir("/harddisk/initrd", S_IRWXU|S_IRWXG|S_IRWXO);
+       sprintf(commandstring, "/bin/chroot /harddisk /sbin/mkinitrd"
+                               " --with=scsi_mod --with=%s --with=sd_mod"
+                               " --with=sr_mod --with=libata"
+                               " --with=ataraid /boot/ipcoprd.img "KERNEL_VERSION,
+                               driver );
+       runcommandwithstatus(commandstring, ctr[TR_BUILDING_INITRD]);
+#ifdef __i386__
+       sprintf(commandstring, "/bin/chroot /harddisk /sbin/mkinitrd"
+                               " --with=scsi_mod --with=%s --with=sd_mod"
+                               " --with=sr_mod --with=libata"
+                               " --with=ataraid /boot/ipcoprd-smp.img "KERNEL_VERSION"-smp",
+                               driver );
+       runcommandwithstatus(commandstring, ctr[TR_BUILDING_INITRD]);
+       mysystem("/bin/chroot /harddisk /bin/mv /boot/grub/scsigrub.conf /boot/grub/grub.conf");
+#endif
+#ifdef __alpha__
+       runcommandwithstatus("/bin/chroot /harddisk /bin/mv /boot/etc/scsiaboot.conf /boot/etc/aboot.conf", ctr[TR_BUILDING_INITRD]);
+#endif
+}
+/* when backup is ready in tmpdir, move files to definitive location */
+void do_copy_files() {
+       mysystem("/bin/chroot /harddisk /bin/cp -af "TMP_EXTRACT_CH"/. /");
+       /* Upgrade necessary files from v1.2 to v1.3 to v1.4 */
+       upgrade_v12_v13();
+       upgrade_v130_v140();
+       /* Upgrade configuration files starting from 1.4.11 */
+       mysystem("/bin/chroot /harddisk /usr/local/bin/upgrade");
+}
+
+int main(int argc, char *argv[]) {
+#define LANG argv[1]
+#define DEST_DEV argv[2]
+#define WGET argv[3]
+
+#ifdef LANG_EN_ONLY
+       char **langtrs[] = { en_tr, NULL };
+#else
+       char **langtrs[] = { bz_tr, cs_tr, da_tr, de_tr, en_tr, es_tr, fr_tr, el_tr, it_tr, la_tr, hu_tr, nl_tr, no_tr, pl_tr, pt_tr, sk_tr, so_tr, fi_tr, sv_tr, tr_tr, vi_tr, NULL };
+#endif
+       char message[1000];
+       char title[STRING_SIZE];
+       char commandstring[STRING_SIZE];
+
+       setlocale (LC_ALL, ""); 
+       /* Log file/terminal stuff. */
+       mylog = "/dev/tty2";
+       ctr = langtrs[ atoi(LANG) ];
+
+       if (!(flog = fopen(mylog, "w+")))
+       {
+               printf("Couldn't open log terminal\n");
+               return 0;
+       }
+       fprintf(flog, "Install2 program started.\n");
+       newtInit();
+       newtCls();
+       strcpy (title, NAME " v" VERSION " - " SLOGAN);
+       newtDrawRootText(14, 0, title);
+       newtPushHelpLine(ctr[TR_HELPLINE]);
+
+       /* working dirs... */
+       mkdir(MOUNT_BACKUP, S_IRWXU|S_IRWXG|S_IRWXO);
+
+       //create the GUI screen and objects
+       newtComponent form, header, labelfile, labelkey, file, key, radio0, radio1, radio2, radio3, radio4, ok;
+
+       newtCenteredWindow (55,20,ctr[TR_RESTORE]);
+       form = newtForm (NULL, NULL,0);
+
+       sprintf(message, ctr[TR_RESTORE_CONFIGURATION], NAME);
+       header = newtTextboxReflowed (2,1,message,51,0,0,0);
+       newtFormAddComponent(form, header);
+
+       // The four method of restauration
+       int start1=1, start2=0, start3=0, start4=0;
+       radio1 = newtRadiobutton (17, 5, ctr[TR_SKIP], start1, NULL);
+       radio2 = newtRadiobutton (17, 6, "Floppy (legacy)", start2, radio1);
+       radio3 = newtRadiobutton (17, 7, "Usb-storage/CDROM", start3, radio2);
+       if (strcmp(WGET,"none"))
+           radio4 = newtRadiobutton (17, 8, "HTTP/FTP", start4, radio3);
+       else
+           radio4 = NULL;
+       newtFormAddComponents(form, radio1, radio2, radio3, radio4, NULL);
+
+       // The optionnal filename for 'backup'
+       labelfile=newtTextbox(12, 10, 35, 1, 0);
+       newtTextboxSetText (labelfile, "Filename");
+       newtFormAddComponent(form, labelfile);
+       char *filevalue;
+       char fileinit[STRING_SIZE] = "backup";
+       file = newtEntry (17, 11, fileinit, 20, &filevalue, 0);
+       newtFormAddComponent(form, file);
+
+       // The optionnal password for the key
+       labelkey=newtTextbox(12, 13, 35, 1, 0);
+       newtTextboxSetText (labelkey, "Backup key password");
+       newtFormAddComponent(form, labelkey);
+       char *keyvalue;
+       char keyinit[STRING_SIZE] = "";
+       key = newtEntry (17, 14, keyinit, 20, &keyvalue, 0);
+       newtFormAddComponent(form, key);
+
+       // The OK button
+       ok=newtButton (23, 16, ctr[TR_OK]);
+       newtFormAddComponent(form, ok);
+
+       /* loop until succeeds or user skips out */
+       int retcode = -1;
+       while ( retcode<0 ) {
+
+           // run the windows
+           struct newtExitStruct reponse;
+           newtFormRun (form, &reponse);
+           radio0 = newtRadioGetCurrent(radio1);
+           int radio;
+           radio = radio0 == radio1 ? 1 : radio0 == radio2 ? 2 :  radio0 == radio3 ? 3 : radio0 == radio4 ? 4 : 0;
+           strcpy(keyinit,keyvalue);   //reuse actual value
+           strcpy(fileinit,filevalue);
+
+           if (radio==1) {
+                   retcode = 1;        // no restore: nothing special
+                   break;              // out of the while loop
+           }
+
+           mkdir(TMP_EXTRACT, S_IRWXU|S_IRWXG|S_IRWXO);
+           statuswindow(45, 4, title, ctr[TR_INSTALLING_FILES]);
+           switch (radio) {
+           case 4:     // network
+                   sprintf(commandstring,"/bin/wget -P " TMP_EXTRACT " %s/%s.dat", WGET, filevalue);
+                   mysystem (commandstring);
+                   sprintf(commandstring,"/bin/wget -P " TMP_EXTRACT " %s/%s.key", WGET, filevalue);
+                   if (mysystem (commandstring)) {
+                           errorbox(ctr[TR_FAILED_TO_FIND]);
+                           break;
+                   };
+                   goto COMMON;
+           case 3:     // normal backup
+                   if (mountbackup( filevalue, DEST_DEV )) {
+                           errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);//mess=no device with backup found
+                           break;
+                   };
+                   // link files to a COMMON location
+                   sprintf (commandstring, "chroot /harddisk ln -s "MOUNT_BACKUP_CH"/%s.dat " TMP_EXTRACT_CH "/%s.dat", filevalue, filevalue);
+                   mysystem (commandstring);
+                   sprintf (commandstring, "chroot /harddisk ln -s "MOUNT_BACKUP_CH"/%s.key " TMP_EXTRACT_CH "/%s.key", filevalue, filevalue);
+                   mysystem (commandstring);
+
+       COMMON:     // DECRYPT THE TARBALL
+                   // Copy the key to a new location because we decrypt it!    
+                   if (strcmp(keyvalue, "")) { // password provided: decrypt the key
+                           sprintf(commandstring,   "/bin/chroot /harddisk /usr/bin/openssl enc"
+                                                   " -a -d -aes256 -salt"
+                                                   " -pass pass:%s"
+                                                   " -in " TMP_EXTRACT_CH "/%s.key"
+                                                   " -out " TMP_EXTRACT_CH "/__tmp.key",
+                                                   keyvalue, filevalue);
+                   } else {                    //just copy to new name
+                           sprintf(commandstring,  "/bin/chroot /harddisk cp"
+                                                   " " TMP_EXTRACT_CH "/%s.key"
+                                                   " " TMP_EXTRACT_CH "/__tmp.key",
+                                                   filevalue);
+                   }
+                   mysystem (commandstring);
+
+                   sprintf(commandstring,  "/bin/chroot /harddisk /usr/bin/openssl des3"
+                                           " -d -salt"
+                                           " -in " TMP_EXTRACT_CH "/%s.dat"
+                                           " -out " TMP_EXTRACT_CH "/backup.tgz"
+                                           " -kfile " TMP_EXTRACT_CH "/__tmp.key",
+                                           filevalue);
+
+                   if (mysystem (commandstring)) {
+                           errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);//mess=decrypt error:invalid key?
+                           break;
+                   }
+                   strcpy(commandstring,   "/bin/chroot /harddisk /bin/tar"
+                                           " -X " CONFIG_ROOT "/backup/exclude.system"
+                                           " -C " TMP_EXTRACT_CH
+                                           " -xzf " TMP_EXTRACT_CH "/backup.tgz");
+
+                   if (mysystem(commandstring)) {
+                           errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);
+                           break;
+                   }
+                   sprintf(commandstring, TMP_EXTRACT "/%s.dat", filevalue);
+                   unlink(commandstring ); //dont need them anymore
+                   unlink( TMP_EXTRACT "/backup.tgz");
+                   sprintf(commandstring, TMP_EXTRACT "/%s.key", filevalue);
+                   unlink(commandstring );
+                   unlink( TMP_EXTRACT "/__tmp.key");
+
+                   /* Now copy to correct location */
+                   do_copy_files();
+                   retcode = 0; /* successfully restored */
+                   break;
+           case 2:
+                   // diskette change
+                   if (floppy_locate()) {
+                           retcode = 2; // this an error!
+                           break;
+                   }
+
+                   /* Always extract to /tmp/ipcop for temporary extraction
+                      just in case floppy fails.
+                      try a compressed backup first because it's quicker to fail.
+                      In exclude.system, files name must be without leading / or 
+                      on extraction, name will never match
+                   */
+                   sprintf(commandstring,
+                    "/bin/chroot /harddisk /bin/tar -X " CONFIG_ROOT "/backup/exclude.system -C "TMP_EXTRACT_CH" -xvzf /dev/floppy > %s 2> /dev/null", mylog);
+                   if (system(commandstring)) {
+                   /* if it's not compressed, try uncompressed first before failing*/
+                       sprintf(commandstring,
+                    "/bin/chroot /harddisk /bin/tar -X " CONFIG_ROOT "/backup/exclude.system -C "TMP_EXTRACT_CH" -xvf /dev/floppy > %s 2> /dev/null", mylog);
+                       if (system(commandstring)) {
+                           /* command failed trying to read from floppy */
+                           errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);
+                           break;
+                       } 
+                   }
+                   /* Now copy to correct location */
+                   do_copy_files();
+                   retcode = 0; /* successfully restored */
+           }//switch
+           /* remove possible badly restored files */
+           mysystem("/bin/chroot /harddisk /bin/rm -rf " TMP_EXTRACT_CH );
+           newtPopWindow(); // close windows
+       }//while
+       newtFormDestroy(form);
+
+       /* cleanup */
+       mysystem("/bin/umount " MOUNT_BACKUP);
+       mysystem("/bin/chroot /harddisk /bin/rmdir " MOUNT_BACKUP_CH);
+
+       /* others operations moved from install to install2 */
+       fixup_squidacl();
+       fixup_initrd();
+
+       fprintf(flog, "Install2 program ended.\n");
+       fflush(flog);
+       fclose(flog);
+       newtFinished();
+       return retcode;
+}
+
index e3d9772a714b174aae5963cc388a818dcceac8d1..4b17e2e182bb89c8235522bc61dafa1f8446ecc2 100644 (file)
-/* SmoothWall install program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * Contains main entry point, and misc functions.\r
- * \r
- * $Id: main.c,v 1.63.2.64 2006/01/11 01:01:38 franck78 Exp $\r
- * \r
- */\r
-#include "install.h"\r
-\r
-#define CDROM_INSTALL 0\r
-#define URL_INSTALL 1\r
-\r
-int raid_disk = 0;\r
-FILE *flog = NULL;\r
-char *mylog;\r
-char **ctr;\r
-\r
-char *pcmcia = NULL;\r
-extern char url[STRING_SIZE];\r
-\r
-/* \r
-    To include a translated string in the final installer, you must reference\r
-    it here with a simplr comment. This save a lot a space in the installer\r
-*/\r
-/* TR_WELCOME */\r
-/* TR_HELPLINE */\r
-/* TR_OK */\r
-/* TR_ERROR */\r
-/* TR_SELECT_INSTALLATION_MEDIA_LONG */\r
-/* TR_SELECT_INSTALLATION_MEDIA */\r
-/* TR_CANCEL */\r
-/* TR_INSERT_FLOPPY */\r
-/* TR_INSTALLATION_CANCELED */\r
-/* TR_EXTRACTING_MODULES */\r
-/* TR_UNABLE_TO_EXTRACT_MODULES */\r
-/* TR_LOADING_PCMCIA */\r
-/* TR_PROBING_SCSI */\r
-/* TR_NO_CDROM */\r
-/* TR_INSERT_CDROM */\r
-/* TR_USB_KEY_VFAT_ERR */\r
-/* TR_NETWORK_SETUP_FAILED */\r
-/* TR_NO_IPCOP_TARBALL_FOUND */\r
-/* TR_NO_SCSI_IMAGE_FOUND */\r
-/* TR_INSTALLING_FILES */\r
-/* TR_UNABLE_TO_INSTALL_FILES */\r
-/* TR_NO_HARDDISK */\r
-/* TR_PREPARE_HARDDISK */\r
-/* TR_DISK_TOO_SMALL */\r
-/* TR_CONTINUE_NO_SWAP */\r
-/* TR_PARTITIONING_DISK */\r
-/* TR_UNABLE_TO_PARTITION */\r
-/* TR_MAKING_BOOT_FILESYSTEM */\r
-/* TR_UNABLE_TO_MAKE_BOOT_FILESYSTEM */\r
-/* TR_MAKING_LOG_FILESYSTEM */\r
-/* TR_UNABLE_TO_MAKE_LOG_FILESYSTEM */\r
-/* TR_MAKING_ROOT_FILESYSTEM */\r
-/* TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM */\r
-/* TR_MOUNTING_ROOT_FILESYSTEM */\r
-/* TR_UNABLE_TO_MOUNT_ROOT_FILESYSTEM */\r
-/* TR_MAKING_SWAPSPACE */\r
-/* TR_UNABLE_TO_MAKE_SWAPSPACE */\r
-/* TR_MOUNTING_SWAP_PARTITION */\r
-/* TR_UNABLE_TO_MOUNT_SWAP_PARTITION */\r
-/* TR_MOUNTING_BOOT_FILESYSTEM */\r
-/* TR_UNABLE_TO_MOUNT_BOOT_FILESYSTEM */\r
-/* TR_MOUNTING_LOG_FILESYSTEM */\r
-/* TR_UNABLE_TO_MOUNT_LOG_FILESYSTEM */\r
-/* TR_ERROR_WRITING_CONFIG */\r
-/* TR_INSTALLING_GRUB */\r
-/* TR_UNABLE_TO_INSTALL_GRUB */\r
-/* TR_UNABLE_TO_UNMOUNT_CDROM */\r
-/* TR_UNABLE_TO_EJECT_CDROM */\r
-/* TR_CONGRATULATIONS_LONG */\r
-/* TR_CONGRATULATIONS */\r
-/* TR_PRESS_OK_TO_REBOOT */\r
-\r
-// in nic.c\r
-/* TR_CONFIGURE_NETWORKING */\r
-/* TR_PROBE */\r
-/* TR_SELECT */\r
-/* TR_CONFIGURE_NETWORKING_LONG */\r
-/* TR_PROBE_FAILED */\r
-/* TR_FOUND_NIC */\r
-/* TR_INTERFACE_FAILED_TO_COME_UP */\r
-\r
-//netc.c\r
-/* TR_CHECKING */\r
-/* TR_FAILED_TO_FIND */\r
-/* TR_ENTER_URL */\r
-\r
-//setup.c\r
-/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK1 */\r
-/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK2 */\r
-/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK3 */\r
-/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK4 */\r
-/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK */\r
-/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_ROOT */\r
-/* TR_PASSWORD_PROMPT */\r
-/* TR_AGAIN_PROMPT */\r
-/* TR_PASSWORD_CANNOT_BE_BLANK */\r
-/* TR_PASSWORDS_DO_NOT_MATCH */\r
-\r
-//libsmooth\r
-/* TR_INTERFACE */\r
-/* TR_ENTER_THE_IP_ADDRESS_INFORMATION */\r
-/* TR_STATIC */\r
-/* TR_DHCP_HOSTNAME */\r
-/* TR_IP_ADDRESS_PROMPT */\r
-/* TR_NETMASK_PROMPT */\r
-/* TR_INVALID_FIELDS */\r
-/* TR_IP_ADDRESS_CR */\r
-/* TR_NETWORK_MASK_CR */\r
-/* TR_DHCP_HOSTNAME_CR */\r
-/* TR_LOOKING_FOR_NIC */\r
-/* TR_MANUAL */\r
-/* TR_SELECT_NETWORK_DRIVER */\r
-/* TR_SELECT_NETWORK_DRIVER_LONG */\r
-/* TR_UNABLE_TO_LOAD_DRIVER_MODULE */\r
-/* TR_THIS_DRIVER_MODULE_IS_ALREADY_LOADED */\r
-/* TR_MODULE_PARAMETERS */\r
-/* TR_LOADING_MODULE */\r
-/* TR_MODULE_NAME_CANNOT_BE_BLANK */\r
-\r
-\r
-int main(int argc, char *argv[])\r
-{\r
-#ifdef LANG_EN_ONLY\r
-        char *langnames[] = { "English", NULL };\r
-        char *shortlangnames[] = { "en", NULL };\r
-        char **langtrs[] = { en_tr, NULL };\r
-#else\r
-       char *langnames[] = { "Brasil", "Cestina", "Dansk", "Deutsch", "English", "Español", "Français", "Hellenic", "Italiano", "Spanish Latino", "Magyar", "Nederlands", "Norsk", "Polski", "Português", "Slovak", "Soomali", "Suomi", "Svenska", "Türkçe", "Tieng Viet", NULL };\r
-       char *shortlangnames[] = { "bz", "cs", "da", "de", "en", "es", "fr", "el", "it", "la", "hu", "nl", "no", "pl", "pt", "sk", "so", "fi", "sv", "tr", "vi", NULL };\r
-       char **langtrs[] = { bz_tr, cs_tr, da_tr, de_tr, en_tr, es_tr, fr_tr, el_tr, it_tr, la_tr, hu_tr, nl_tr, no_tr, pl_tr, pt_tr, sk_tr, so_tr, fi_tr, sv_tr, tr_tr, vi_tr, NULL };\r
-#endif\r
-       char hdletter, cdletter;\r
-       char harddrive[5], cdromdrive[5];       /* Device holder. */\r
-       struct devparams hdparams, cdromparams; /* Params for CDROM and HD */\r
-       int cdmounted = 0;              /* Loop flag for inserting a cd. */ \r
-       int rc;\r
-       char commandstring[STRING_SIZE];\r
-       char *installtypes[] = { "CDROM/USB-KEY", "HTTP/FTP", NULL };\r
-       int installtype = CDROM_INSTALL; \r
-       char insertmessage[STRING_SIZE];\r
-       char insertdevnode[STRING_SIZE];\r
-       int choice;\r
-       char shortlangname[10];\r
-       char message[1000];\r
-       char title[STRING_SIZE];\r
-       int allok = 0;\r
-       int no_restore=0;\r
-       int unmount_before=0;\r
-       struct keyvalue *ethernetkv = initkeyvalues();\r
-       FILE *handle, *cmdfile;\r
-       char line[STRING_SIZE];\r
-       char string[STRING_SIZE];\r
-       int maximum_free = 0, current_free;\r
-       int memory = 0;\r
-       int log_partition, boot_partition, root_partition, swap_file;\r
-       int scsi_disk = 0;\r
-       int pcmcia_disk = 0;\r
-       int pcmcia_cdrom = 0;\r
-       int scsi_cdrom = 0;\r
-       int ide_cdrom = 0;\r
-       int fdisk = 0;\r
-       int usb_cdrom = 0;\r
-\r
-       setlocale (LC_ALL, "");\r
-       sethostname(SNAME, 10);\r
-       \r
-       memset(&hdparams, 0, sizeof(struct devparams));\r
-       memset(&cdromparams, 0, sizeof(struct devparams));\r
-\r
-       /* Log file/terminal stuff. */\r
-       if (argc >= 2)\r
-       {               \r
-               if (!(flog = fopen(argv[1], "w+")))\r
-                       return 0;\r
-       }\r
-       else\r
-               return 0;\r
-       \r
-       mylog = argv[1];\r
-       \r
-       fprintf(flog, "Install program started.\n");\r
-               \r
-       newtInit();\r
-       newtCls();\r
-\r
-       /* Do usb detection first for usb keyboard */\r
-       if (! (cmdfile = fopen("/proc/cmdline", "r")))\r
-       {\r
-               fprintf(flog, "Couldn't open commandline: /proc/cmdline\n");\r
-       } else {\r
-               fgets(line, STRING_SIZE, cmdfile);\r
-               if (strstr (line, "fdisk") != NULL) {\r
-                       fprintf(flog, "Manual FDISK selected.\n");\r
-                       fdisk = 1;\r
-               }\r
-               if (strstr (line, "nopcmcia") == NULL) {\r
-                       fprintf(flog, "Initializing PCMCIA controllers.\n");\r
-                       pcmcia = initialize_pcmcia();\r
-                       if (pcmcia) {\r
-                               fprintf (flog, "Detected PCMCIA Controller: %s.\n", pcmcia);\r
-                               sprintf(commandstring, "/sbin/modprobe %s", pcmcia);\r
-                               mysystem("/sbin/modprobe pcmcia_core");\r
-                               mysystem(commandstring);\r
-                               mysystem("/sbin/modprobe ds");\r
-                               /* pcmcia netcard drivers are not available from Boot floppy,\r
-                                * they will be loaded from Drivers floppy later */\r
-                       } else {\r
-                               fprintf (flog, "Detected No PCMCIA Controller.\n");\r
-                       }\r
-               } else {\r
-                       fprintf(flog, "Skipping PCMCIA detection.\n");\r
-               }\r
-               if (strstr (line, "nousb") == NULL) {\r
-                       fprintf(flog, "Initializing USB controllers.\n");\r
-                       initialize_usb();\r
-               } else {\r
-                       fprintf(flog, "Skipping USB detection.\n");\r
-               }\r
-       }\r
-       \r
-       /* English is the default */\r
-       for (choice = 0; langnames[choice]; choice++)\r
-       {\r
-               if (strcmp(langnames[choice], "English") == 0)\r
-                       break;\r
-       }\r
-       if (!langnames[choice])\r
-               goto EXIT;\r
-\r
-#ifdef LANG_EN_ONLY\r
-       /* No need to ask.  "choice" already has the index for English */\r
-#else\r
-       rc = newtWinMenu("Language selection",\r
-               "Select the language you wish to use for the " NAME ".", 50, 5, 5, 8,\r
-               langnames, &choice, "Ok", NULL);\r
-#endif\r
-       ctr = langtrs[choice];\r
-       strcpy(shortlangname, shortlangnames[choice]);\r
-       if (strcmp(shortlangname, "el") == 0)\r
-               mysystem("/bin/setfont iso07u-16");\r
-       else if (strcmp(shortlangname, "pt") == 0)\r
-               mysystem("/bin/setfont lat1-16");\r
-       else if (strcmp(shortlangname, "bz") == 0)\r
-               mysystem("/bin/setfont lat1-16");\r
-       else if (strcmp(shortlangname, "cs") == 0)\r
-               mysystem("/bin/setfont lat2-16");\r
-       else if (strcmp(shortlangname, "hu") == 0)\r
-               mysystem("/bin/setfont lat2-16");\r
-       else if (strcmp(shortlangname, "pl") == 0)\r
-               mysystem("/bin/setfont lat2-16");\r
-       else if (strcmp(shortlangname, "sk") == 0)\r
-               mysystem("/bin/setfont lat2-16");\r
-       else if (strcmp(shortlangname, "tr") == 0)\r
-               mysystem("/bin/setfont lat5-16");\r
-       else if (strcmp(shortlangname, "vi") == 0)\r
-               mysystem("/bin/setfont viscii10-8x16");\r
-       else\r
-               mysystem("/bin/setfont lat0-16");\r
-\r
-       /* need this for reading from formatted device */\r
-       modprobe("vfat");\r
-\r
-       newtDrawRootText(14, 0, NAME " v" VERSION " - " SLOGAN );\r
-       newtPushHelpLine(ctr[TR_HELPLINE]);\r
-\r
-       snprintf(message, STRING_SIZE, ctr[TR_WELCOME], NAME);\r
-       snprintf (title, STRING_SIZE, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
-       newtWinMessage(title, ctr[TR_OK], message);\r
-\r
-       snprintf(message,STRING_SIZE, ctr[TR_SELECT_INSTALLATION_MEDIA_LONG], NAME);\r
-       rc = newtWinMenu(ctr[TR_SELECT_INSTALLATION_MEDIA], message,\r
-               50, 5, 5, 6, installtypes, &installtype, ctr[TR_OK],\r
-               ctr[TR_CANCEL], NULL);\r
-\r
-       if (rc == 2)\r
-               goto EXIT;\r
-\r
-       if (installtype == CDROM_INSTALL)  // CD or USB-key\r
-       {\r
-\r
-               /* try usb key in superfloppy format only */\r
-               if (checkusb("sda")) {\r
-                       sprintf(cdromdrive, "sda");\r
-                       usb_cdrom = 1;\r
-                       goto FOUND_SOURCE;\r
-               }\r
-               if (checkusb("sdb")) {\r
-                       sprintf(cdromdrive, "sdb");\r
-                       usb_cdrom = 1;\r
-                       goto FOUND_SOURCE;\r
-               }\r
-\r
-               /* look for an IDE CDROM. */\r
-               if ((cdletter = findidetype(IDE_CDROM)))\r
-               {\r
-                       sprintf(cdromdrive, "hd%c", cdletter);\r
-                       ide_cdrom = 1;\r
-                       goto FOUND_SOURCE;\r
-               }\r
-\r
-               /* If we have a USB attached CDROM then it will\r
-                * have already appeared at /dev/scd0, so we\r
-                * try to access it first, before asking for the\r
-                * SCSI drivers disk.\r
-                */\r
-               if (try_scsi("scd0")) {\r
-                       sprintf(cdromdrive, "scd0");\r
-                       scsi_cdrom = 1;\r
-                       goto FOUND_SOURCE;\r
-               }\r
-\r
-               /* ask for supplemental  SCSI driver */\r
-               snprintf(insertmessage, STRING_SIZE, ctr[TR_INSERT_FLOPPY], NAME" SCSI");\r
-               if (newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], insertmessage) != 1)\r
-               {\r
-                       errorbox(ctr[TR_INSTALLATION_CANCELED]);\r
-                       goto EXIT;\r
-               }\r
-\r
-               /* extract new modules */\r
-               if (runcommandwithstatus("/bin/tar -C / -xvzf /dev/floppy", ctr[TR_EXTRACTING_MODULES]))\r
-               {\r
-                       errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);\r
-                       goto EXIT;\r
-               }\r
-               /* and load PCMCIA */\r
-               if (pcmcia)\r
-               {\r
-                       /* trying to support SCSI pcmcia :-) */\r
-                       runcommandwithstatus("cardmgr -o -c /etc/pcmcia/scsi",\r
-                               ctr[TR_LOADING_PCMCIA]);\r
-                       if (try_scsi("scd0")) {\r
-                               sprintf(cdromdrive, "scd0");\r
-                               pcmcia_cdrom = 1;\r
-                               goto FOUND_SOURCE;\r
-                       }\r
-               }\r
-\r
-               /* try loading all SCSI modules with default options */\r
-               /* Should expand this to allow options later though */\r
-               runcommandwithstatus("/bin/probescsi.sh", ctr[TR_PROBING_SCSI]);\r
-\r
-               /* If it fails, give up. */\r
-               if (try_scsi("scd0")) {\r
-                       sprintf(cdromdrive, "scd0");\r
-                       scsi_cdrom = 1;\r
-                       goto FOUND_SOURCE;\r
-               }\r
-\r
-               /* Unable to find a valid source, give up */\r
-               errorbox(ctr[TR_NO_CDROM]);\r
-               goto EXIT;\r
-\r
-               FOUND_SOURCE:\r
-               sprintf(cdromparams.devnode_disk, "/dev/%s", cdromdrive);\r
-//             cdromparams.module = 0;\r
-\r
-               snprintf(insertmessage,STRING_SIZE ,ctr[TR_INSERT_CDROM], NAME);\r
-               strcpy (insertdevnode, cdromparams.devnode_disk);\r
-       }\r
-       else    /* don't understand why this follows... */\r
-       {\r
-               /* If we've done a PXE boot, we can skip the Drivers floppy,\r
-                * as we've already got the modules in our instroot.gz */\r
-               if (!(handle = fopen("/CDROMBOOT", "r"))) {\r
-                       snprintf(insertmessage, STRING_SIZE-12, ctr[TR_INSERT_FLOPPY], NAME);\r
-                       strcpy (insertdevnode , "/dev/floppy");\r
-               } else {\r
-                       fclose(handle);\r
-                       cdmounted = 1;\r
-                       unmount_before = 1;\r
-               }\r
-       }\r
-\r
-       /* Try to mount /cdrom with the device discovered */\r
-       if (scsi_cdrom || ide_cdrom || usb_cdrom) {\r
-               snprintf(commandstring, STRING_SIZE, "/bin/mount -o ro %s /cdrom", insertdevnode);\r
-               int skip_dialog = 1;\r
-               int sd_test = 0;\r
-               while (!cdmounted)\r
-               {\r
-                       /* for usb-key, we have to try sda then sda1. The key cannot be unpluged */\r
-                       if (sd_test == 1) { //change to sda1\r
-                               sprintf(commandstring, "/bin/mount -o ro %s1 /cdrom", insertdevnode);\r
-                       }\r
-                       if (sd_test == 2) { //the key do not contains a vfat file system\r
-                               errorbox(ctr[TR_USB_KEY_VFAT_ERR]);\r
-                               goto EXIT;\r
-                       }\r
-                       if (usb_cdrom) sd_test++;       // next USB test\r
-                       \r
-                       if (!skip_dialog && !usb_cdrom) {\r
-                           rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], insertmessage);\r
-                           if (rc != 1)\r
-                           {\r
-                               errorbox(ctr[TR_INSTALLATION_CANCELED]);\r
-                               goto EXIT;\r
-                           }\r
-                       }\r
-                       skip_dialog = 0;\r
-                       if (mysystem(commandstring))\r
-                           continue; //mount failed, try again\r
-\r
-                       /*verify it's what we want */\r
-                       handle = fopen ("/cdrom/" SNAME "-" VERSION ".tgz", "r");\r
-                       if (handle == NULL) {\r
-                               mysystem ("/bin/umount /cdrom");\r
-                               continue;   /* bad disk ! */\r
-                       }\r
-\r
-                       fclose (handle);\r
-                               cdmounted = 1;\r
-                       /* If we've booted from CDROM, then\r
-                        * we've already got the drivers,\r
-                        * so we can skip this unpack. */\r
-                       if ((handle = fopen("/CDROMBOOT", "r"))) {\r
-                               fclose(handle);\r
-                               break;  /* ok we go everything */\r
-                       }\r
-                       /* unpack drivers */\r
-                       if (runcommandwithprogress(60, 4, title,\r
-                                               "/bin/tar -C / -xvzf /cdrom/images/drivers-"VERSION".img",\r
-                                               175, ctr[TR_EXTRACTING_MODULES]))\r
-                       {\r
-                               errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);\r
-                               goto EXIT;\r
-                       }\r
-               }\r
-       } else { /* no cd device were discovered,  ask second diskette */\r
-               sprintf(commandstring, "/bin/tar -C / -xvzf /dev/floppy");\r
-               while (!cdmounted)\r
-               {\r
-                       rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], insertmessage);\r
-                       if (rc != 1)\r
-                       {\r
-                               errorbox(ctr[TR_INSTALLATION_CANCELED]);\r
-                               goto EXIT;\r
-                       }\r
-                       if (runcommandwithprogress(60, 4, title, \r
-                               commandstring,\r
-                               175, ctr[TR_EXTRACTING_MODULES]))\r
-                       {\r
-#if 0 /* disable this, so we allow for people putting in the wrong disk */\r
-                               errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);\r
-                               goto EXIT;\r
-#endif\r
-                       }\r
-                       else\r
-                       {\r
-                               handle = fopen ("/bin/mke2fs", "r");\r
-                               if (handle != NULL) {\r
-                                       fclose (handle);\r
-                                               cdmounted = 1;\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
-       /* PCMCIA controller is already detected\r
-        * On Boot floppy, we didn't have the PCMCIA drivers\r
-        * so load them now because they are installed from Drivers. */\r
-       if (!(handle = fopen("/CDROMBOOT", "r"))) {\r
-               if (strstr (line, "nopcmcia") == NULL) {\r
-                       fprintf(flog,"Floppy boot detected, loading PCMCIA drivers.\n");\r
-                       if (pcmcia) {\r
-                               fprintf (flog, "Detected PCMCIA Controller: %s.\n", pcmcia);\r
-                               sprintf(commandstring, "/sbin/modprobe %s", pcmcia);\r
-                               mysystem("/sbin/modprobe pcmcia_core");\r
-                               mysystem(commandstring);\r
-                               mysystem("/sbin/modprobe ds");\r
-                       } else {\r
-                               fprintf (flog, "Detected No PCMCIA Controller.\n");\r
-                       }\r
-               } else {\r
-                       fprintf(flog, "Skipping PCMCIA detection.\n");\r
-               }\r
-               if (strstr (line, "nousb") == NULL) {\r
-                       fprintf(flog, "Initializing USB controllers.\n");\r
-                       initialize_usb();\r
-               } else {\r
-                       fprintf(flog, "Skipping USB detection.\n");\r
-               }\r
-       } else\r
-               fclose(handle);\r
-\r
-       /* Configure the network now! */\r
-       if (installtype == URL_INSTALL)\r
-       {\r
-               /* Network driver and params. */\r
-               if (!(networkmenu(ethernetkv)))\r
-               {\r
-                       errorbox(ctr[TR_NETWORK_SETUP_FAILED]);\r
-                       goto EXIT;\r
-               }\r
-\r
-               /* Check for ipcop-<VERSION>.tgz */\r
-               if (!(checktarball(SNAME "-" VERSION ".tgz")))\r
-               {\r
-                       errorbox(ctr[TR_NO_IPCOP_TARBALL_FOUND]);\r
-                       goto EXIT;\r
-               }\r
-       }\r
-\r
-       /* Get device for the HD.  This has to succeed. */\r
-       /* first try an IDE disk */\r
-       if ((hdletter = findidetype(IDE_HD)))\r
-       {\r
-               sprintf(harddrive, "hd%c", hdletter);\r
-               goto FOUND_DESTINATION;\r
-       }\r
-       /* unpack SCSI driver if not done during CD detection */\r
-       if (installtype == URL_INSTALL)\r
-       {\r
-               /* If we've done a PXE boot, we can skip the SCSI\r
-                * floppy as we've already got the modules in our \r
-                * instroot.gz */\r
-               if (!(handle = fopen("/CDROMBOOT", "r"))) \r
-               {\r
-                       /* search img where it is on a mounted loop iso */\r
-                       if (!(checktarball("images/scsidrv-"VERSION".img")))\r
-                       {\r
-                               /* Couldn't find the SCSI drivers on the URL page,\r
-                                * so after 3 failed attempts, ask the user for the\r
-                                * SCSI drivers floppy disk. */\r
-                               errorbox(ctr[TR_NO_SCSI_IMAGE_FOUND]);\r
-                               snprintf(insertmessage, STRING_SIZE, ctr[TR_INSERT_FLOPPY], NAME" SCSI");\r
-                               rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], insertmessage);\r
-                               if (rc != 1)\r
-                               {\r
-                                       errorbox(ctr[TR_INSTALLATION_CANCELED]);\r
-                                       goto EXIT;\r
-                               }\r
-\r
-                               if (runcommandwithstatus("/bin/tar -C / -xvzf /dev/floppy", ctr[TR_EXTRACTING_MODULES]))\r
-                               {\r
-                                       errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);\r
-                                       goto EXIT;\r
-                               }\r
-                       } else {\r
-                               /* unpack... THIS DO NOT WORK BECAUSE var "string" is empty*/\r
-                               snprintf(commandstring, STRING_SIZE,\r
-                                       "/bin/wget -O - %s/%s | /bin/tar -C / -xvzf -",\r
-                                       url, string);\r
-                               if (runcommandwithprogress(60, 4, title, commandstring,\r
-                                       4500, ctr[TR_INSTALLING_FILES]))\r
-                               {\r
-                                       errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);\r
-                                       goto EXIT;\r
-                               }\r
-                       }\r
-               } else\r
-                       fclose(handle);\r
-       } else {  /* cdrom/usb install, install SCSI id not done */\r
-               if (ide_cdrom) {\r
-                       if (runcommandwithstatus("/bin/tar -C / -xvzf /cdrom/images/scsidrv-"VERSION".img", ctr[TR_EXTRACTING_MODULES]))\r
-                       {\r
-                               errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);\r
-                               goto EXIT;\r
-                       }\r
-               }\r
-       }\r
-\r
-       /* load SCSI/pcmcia drivers if not done during CD detection */\r
-       if (!scsi_cdrom) {\r
-#if 0 /* not yet */\r
-               if (pcmcia)\r
-               {\r
-                       /* trying to support SCSI pcmcia :-) */\r
-                       runcommandwithstatus("cardmgr -o -c /etc/pcmcia/scsi", \r
-                               ctr[TR_LOADING_PCMCIA]);\r
-                       if (try_scsi(usb_cdrom ? "sdb":"sda")) {\r
-                               scsi_disk = 1;\r
-                               pcmcia_disk = 1;\r
-                       }\r
-                       if (checkusb("sdb") && try_scsi("sdc")) {\r
-                               scsi_disk = 1;\r
-                               pcmcia_disk = 1;\r
-                       }\r
-               }\r
-#endif\r
-               /* try loading all SCSI modules with default options */\r
-               /* Should expand this to allow options later though */\r
-               if (!pcmcia_disk)\r
-                       runcommandwithstatus("/bin/probescsi.sh",\r
-                               ctr[TR_PROBING_SCSI]);\r
-       }\r
-       /* Now try to find destination device...        \r
-          Need to clean this up at some point\r
-          scsi disk is sdb/sdc when sda/sdb is used for usb-key\r
-          if scsi-disk is is sdd or more, it is not discovered\r
-       */\r
-       if (try_scsi(usb_cdrom ? "sdb":"sda")) {\r
-               scsi_disk = 1;\r
-               sprintf(harddrive, usb_cdrom ? "sdb":"sda");\r
-               goto FOUND_DESTINATION;\r
-       }\r
-       if (checkusb("sdb") && try_scsi("sdc")) {\r
-               scsi_disk = 1;\r
-               sprintf(harddrive, "sdc");\r
-               goto FOUND_DESTINATION;\r
-       }\r
-       if (try_scsi("ida/c0d0")) {\r
-               raid_disk = 1;\r
-               sprintf(harddrive, "ida/c0d0");\r
-               goto FOUND_DESTINATION;\r
-       }\r
-       if (try_scsi("cciss/c0d0")) {\r
-               raid_disk = 1;\r
-               sprintf(harddrive, "cciss/c0d0");\r
-               goto FOUND_DESTINATION;\r
-       }\r
-       if (try_scsi("rd/c0d0")) {\r
-               raid_disk = 1;\r
-               sprintf(harddrive, "rd/c0d0");\r
-               goto FOUND_DESTINATION;\r
-       }\r
-       if (try_scsi("ataraid/d0")) {\r
-               raid_disk = 1;\r
-               sprintf(harddrive, "ataraid/d0");\r
-               goto FOUND_DESTINATION;\r
-       }\r
-       /* nothing worked, give up */\r
-       errorbox(ctr[TR_NO_HARDDISK]);\r
-       goto EXIT;\r
-\r
-       FOUND_DESTINATION:\r
-       /* Make the hdparms struct and print the contents.\r
-          With USB-KEY install and SCSI disk, while installing, the disk\r
-          is named 'sdb,sdc,...' (following keys)\r
-          On reboot, it will become 'sda'\r
-          To avoid many test, all names are built in the struct.\r
-       */\r
-       sprintf(hdparams.devnode_disk, "/dev/%s", harddrive);\r
-       /* Address the partition or raid partition (eg dev/sda or /dev/sdap1 */\r
-       sprintf(hdparams.devnode_part, "/dev/%s%s", harddrive,raid_disk ? "p" : "");\r
-       /* now the names after the machine is booted. Today only scsi is affected \r
-           and we only install on the first scsi disk.\r
-       */\r
-       {   char tmp[30];\r
-           strcpy(tmp, scsi_disk ? "sda" : harddrive);\r
-           sprintf(hdparams.devnode_disk_run, "/dev/%s", tmp);\r
-           sprintf(hdparams.devnode_part_run, "/dev/%s%s", tmp, raid_disk ? "p" : "");\r
-       }\r
-\r
-       rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL],\r
-               ctr[TR_PREPARE_HARDDISK], hdparams.devnode_disk_run);\r
-       if (rc != 1)\r
-               goto EXIT;\r
-\r
-       /* Calculate amount of memory in machine */\r
-        if ((handle = fopen("/proc/meminfo", "r")))\r
-        {\r
-            while (fgets(line, STRING_SIZE-1, handle)) {\r
-                if (sscanf (line, "MemTotal: %s kB", string)) {\r
-                    memory = atoi(string) / 1024 ;\r
-                }\r
-            }\r
-            fclose(handle);\r
-        }\r
-\r
-       /* Partition, mkswp, mkfs.\r
-        * before partitioning, first determine the sizes of each\r
-        * partition.  In order to do that we need to know the size of\r
-        * the disk. \r
-        */\r
-       /* Don't use mysystem here so we can redirect output */\r
-       sprintf(commandstring, "/bin/sfdisk -s /dev/%s > /disksize 2> /dev/null", harddrive);\r
-       system(commandstring);\r
-\r
-       /* Calculate amount of disk space */\r
-        if ((handle = fopen("/disksize", "r")))\r
-        {\r
-               fgets(line, STRING_SIZE-1, handle);\r
-               if (sscanf (line, "%s", string)) {\r
-                       maximum_free = atoi(string) / 1024;\r
-               }\r
-               fclose(handle);\r
-        }\r
-       \r
-       fprintf(flog, "maximum_free = %d, memory = %d", maximum_free, memory);\r
-       \r
-       /* If you need more than this, you should really add physical memory */\r
-       /* Minimum: 192 = 64 real + 128 swap */\r
-       swap_file = memory < 64 ? 2 * memory : 192 - memory ;\r
-       swap_file = swap_file < 32 ? 32 : swap_file ;\r
-\r
-       if (maximum_free < 135 + swap_file )\r
-       {\r
-               if (maximum_free < 135) {\r
-                       errorbox(ctr[TR_DISK_TOO_SMALL]);\r
-                       goto EXIT;\r
-               }\r
-\r
-               rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], ctr[TR_CONTINUE_NO_SWAP]);\r
-               if (rc != 1)\r
-                       goto EXIT;\r
-               swap_file = 0;\r
-       }\r
-\r
-       boot_partition = 8; /* in MB */\r
-       current_free = maximum_free - boot_partition - swap_file;\r
-\r
-       /* Give more place for add-on, extend root to 25% of current_free, upper limit to 8 gigas */\r
-       root_partition = current_free / 4 ;\r
-       root_partition = root_partition > 8192 ? 8192 : root_partition ;\r
-       root_partition = current_free < 860 ? 235 : root_partition;\r
-       root_partition = current_free < 380 ? 110 : root_partition;\r
-\r
-       current_free = current_free - root_partition;\r
-       root_partition = root_partition + swap_file;\r
-\r
-       log_partition = current_free;\r
-\r
-       fprintf(flog, "boot = %d, swap = %d, mylog = %d, root = %d\n",\r
-               boot_partition, swap_file, log_partition, root_partition);\r
-\r
-#ifdef __alpha__\r
-       fdisk = 1;\r
-#endif\r
-\r
-       if (fdisk) {\r
-               rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], "NOW FDISK");\r
-               if (rc != 1)\r
-                       goto EXIT;\r
-       } else {\r
-#ifdef __i386__\r
-               handle = fopen("/tmp/partitiontable", "w");\r
-\r
-               fprintf(handle, ",%d,83,*\n,%d,83,\n,0,0,\n,,83,\n",\r
-                       boot_partition, log_partition);\r
-\r
-               fclose(handle);         \r
-\r
-               sprintf(commandstring, "/bin/sfdisk -uM %s < /tmp/partitiontable", hdparams.devnode_disk);\r
-               if (runcommandwithstatus(commandstring, ctr[TR_PARTITIONING_DISK]))\r
-               {\r
-                       errorbox(ctr[TR_UNABLE_TO_PARTITION]);\r
-                       goto EXIT;\r
-               }\r
-#endif\r
-       }\r
-       /* create filesystem boot partition 1 */\r
-       sprintf(commandstring, "/bin/mke2fs -m 0 -j %s1", hdparams.devnode_part);\r
-       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_BOOT_FILESYSTEM]))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_MAKE_BOOT_FILESYSTEM]);\r
-               goto EXIT;\r
-       }\r
-\r
-       /* create filesystem log partition 2 */\r
-       sprintf(commandstring, "/bin/mke2fs -j %s2", hdparams.devnode_part);\r
-       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_LOG_FILESYSTEM]))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_MAKE_LOG_FILESYSTEM]);\r
-               goto EXIT;\r
-       }\r
-\r
-       /* create filesystem root partition 4 */\r
-       sprintf(commandstring, "/bin/mke2fs -m 1 -j %s4", hdparams.devnode_part);\r
-       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_ROOT_FILESYSTEM]))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM]);\r
-               goto EXIT;\r
-       }\r
-\r
-       /* Mount root on partition 4 */\r
-       sprintf(commandstring, "/sbin/mount -t ext2 %s4 /harddisk", hdparams.devnode_part);\r
-       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_ROOT_FILESYSTEM]))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_MOUNT_ROOT_FILESYSTEM]);\r
-               goto EXIT;\r
-       }\r
-       mkdir("/harddisk/boot", S_IRWXU|S_IRWXG|S_IRWXO);\r
-       mkdir("/harddisk/var", S_IRWXU|S_IRWXG|S_IRWXO);        \r
-       mkdir("/harddisk/var/log", S_IRWXU|S_IRWXG|S_IRWXO);\r
-\r
-       /* Make,mount swapfile */\r
-       if (swap_file) {\r
-               sprintf(commandstring, "/bin/dd if=/dev/zero of=/harddisk/swapfile bs=1024k count=%d", swap_file);\r
-               if (runcommandwithstatus(commandstring, ctr[TR_MAKING_SWAPSPACE]))\r
-               {\r
-                       errorbox(ctr[TR_UNABLE_TO_MAKE_SWAPSPACE]);\r
-                       goto EXIT;\r
-               }\r
-               if (runcommandwithstatus("/bin/mkswap /harddisk/swapfile", ctr[TR_MAKING_SWAPSPACE]))\r
-               {\r
-                       errorbox(ctr[TR_UNABLE_TO_MAKE_SWAPSPACE]);\r
-                       goto EXIT;\r
-               }\r
-               if (runcommandwithstatus("/bin/swapon /harddisk/swapfile", ctr[TR_MOUNTING_SWAP_PARTITION]))\r
-               {\r
-                       errorbox(ctr[TR_UNABLE_TO_MOUNT_SWAP_PARTITION]);\r
-                       goto EXIT;\r
-               }\r
-       }\r
-\r
-       /* Mount boot on partition 1 */\r
-       sprintf(commandstring, "/sbin/mount -t ext2 %s1 /harddisk/boot", hdparams.devnode_part);\r
-       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_BOOT_FILESYSTEM]))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_MOUNT_BOOT_FILESYSTEM]);\r
-               goto EXIT;\r
-       }\r
-\r
-       /* Mount log on partition 2 */\r
-       sprintf(commandstring, "/sbin/mount -t ext2 %s2 /harddisk/var/log", hdparams.devnode_part);\r
-       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_LOG_FILESYSTEM]))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_MOUNT_LOG_FILESYSTEM]);\r
-               goto EXIT;\r
-       }\r
-       \r
-       /* Either use tarball from cdrom or download. */\r
-       if (installtype == CDROM_INSTALL)\r
-               snprintf(commandstring, STRING_SIZE, \r
-                       "/bin/tar -C /harddisk -xvzf /cdrom/" SNAME "-" VERSION ".tgz");\r
-       else\r
-               snprintf(commandstring, STRING_SIZE, \r
-                       "/bin/wget -O - %s/" SNAME "-" VERSION ".tgz | /bin/tar -C /harddisk -xvzf -", url);\r
-       \r
-       if (runcommandwithprogress(60, 4, title, commandstring, 4600,\r
-               ctr[TR_INSTALLING_FILES]))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);\r
-               goto EXIT;\r
-       }\r
-       \r
-       /* Save USB controller type to modules.conf */\r
-       write_usb_modules_conf();\r
-\r
-       /* touch the modules.dep files */\r
-       mysystem("/bin/chroot /harddisk /bin/touch /lib/modules/"KERNEL_VERSION"/modules.dep");\r
-#ifdef __i386__\r
-       mysystem("/bin/chroot /harddisk /bin/touch /lib/modules/"KERNEL_VERSION"-smp/modules.dep");\r
-#endif\r
-\r
-       /* Rename uname */\r
-       rename ("/harddisk/bin/uname.bak", "/harddisk/bin/uname");\r
-\r
-       /* Write PCMCIA Config */\r
-       if (pcmcia) {\r
-               handle = fopen("/harddisk/etc/modules.conf", "a");\r
-               if (handle != NULL) {\r
-                       fprintf (handle, "# PCMCIA Settings\n");\r
-                       fprintf (handle, "alias pcmcia-controller %s\n", pcmcia);\r
-                       fclose(handle);\r
-               }\r
-       }\r
-\r
-       handle = fopen("/harddisk/etc/pcmcia.conf", "w");\r
-       if (handle != NULL) {\r
-               if (pcmcia) {\r
-                       fprintf (handle, "PCMCIA=yes\n");\r
-                       fprintf (handle, "PCIC=%s\n", pcmcia);\r
-               } else {\r
-                       fprintf (handle, "PCMCIA=no\n");\r
-                       fprintf (handle, "PCIC=\n");\r
-               }\r
-               fprintf (handle, "CARDMGR_OPTS=\n");\r
-               fprintf (handle, "SCHEME=\n");\r
-               fclose(handle);\r
-       }\r
-\r
-       /* *always* write disk configuration */\r
-       if (!(write_disk_configs(&hdparams))){\r
-               errorbox(ctr[TR_ERROR_WRITING_CONFIG]);\r
-               goto EXIT;\r
-       }\r
-\r
-       /*  \r
-         Allow the user to restore their configuration from a floppy.\r
-         It uses tar.  If the tar fails for any reason, show user an\r
-         error and go back to the restore/skip question. This gives\r
-         the user the chance to have another go. */\r
-         \r
-       /* Program is outside install to save space on floppy \r
-       */\r
-       fprintf(flog, "Passing control to install2.\n");        \r
-       fflush(flog);\r
-       //newtSuspend();\r
-       /* pass needed parameter for install 2 by position\r
-           choice: index of langage selected\r
-           devnode_disk: to prevent unmounting of it\r
-           url: if network, allow restaure from it\r
-       */\r
-       sprintf(commandstring, "/harddisk/usr/local/bin/install2 %d %s %s",\r
-               choice,\r
-               strlen(cdromparams.devnode_disk ) ? cdromparams.devnode_disk : "none",\r
-               strlen(url) ? url : "none"\r
-              );\r
-       no_restore = system(commandstring);\r
-       //newtResume();\r
-       \r
-       /*  if we installed from CD ROM then we didn't set up the\r
-           network interface yet.  Therefore, set up Network\r
-           driver and params just before we need them.\r
-       */\r
-       if (no_restore && (installtype == CDROM_INSTALL)) {  \r
-               if (!(networkmenu(ethernetkv))){\r
-                       errorbox(ctr[TR_NETWORK_SETUP_FAILED]);\r
-                       goto EXIT;\r
-               }\r
-       }\r
-\r
-       /* Build cache lang file */\r
-       mysystem("/bin/chroot /harddisk /usr/bin/perl -e \"require '" CONFIG_ROOT "/lang.pl'; &Lang::BuildCacheLang\"");\r
-       \r
-       /* write ethernet and lang configs only if they have not\r
-           been restored from floppy already. */\r
-       if (no_restore) {\r
-               if (!write_ethernet_configs(ethernetkv)||\r
-                   !write_lang_configs(shortlangname))  {\r
-                       errorbox(ctr[TR_ERROR_WRITING_CONFIG]);\r
-                       goto EXIT;\r
-               }\r
-       }\r
-\r
-\r
-#if 0 /* not yet */\r
-       if (pcmcia_disk)\r
-       {\r
-               fprintf(flog, "Detected SCSI driver PCMCIA\n");\r
-               fprintf(flog, "Fixing up ipcoprd.img\n");\r
-               mysystem("/bin/chroot /harddisk /sbin/modprobe loop");\r
-               mkdir("/harddisk/initrd", S_IRWXU|S_IRWXG|S_IRWXO);\r
-               mysystem("/bin/chroot /harddisk /sbin/pcinitrd -r "KERNEL_VERSION" /boot/ipcoprd.img");\r
-#ifdef __i386__\r
-               mysystem("/bin/chroot /harddisk /bin/mv /boot/grub/scsigrub.conf /boot/grub/grub.conf");\r
-#endif\r
-#ifdef __alpha__\r
-               mysystem("/bin/chroot /harddisk /bin/mv /boot/etc/scsiaboot.conf /boot/etc/aboot.conf");\r
-#endif\r
-       }\r
-#endif\r
-\r
-#ifdef __i386__\r
-       // to verify: with USB-key grubbatch install on sdb and boot sda....\r
-       replace( "/harddisk/boot/grub/grubbatch", "DEVICE", hdparams.devnode_disk);\r
-       /* restore permissions */\r
-       chmod("/harddisk/boot/grub/grubbatch", S_IXUSR | S_IRUSR | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH);\r
-\r
-       sprintf(string, "root=%s4", hdparams.devnode_part_run);\r
-       replace( "/harddisk/boot/grub/grub.conf", "root=ROOT", string);\r
-\r
-       mysystem("/bin/chroot /harddisk /bin/mount -n -t proc none /proc");\r
-\r
-       if (runcommandwithstatus("/bin/chroot /harddisk /boot/grub/grubbatch", ctr[TR_INSTALLING_GRUB]))\r
-       {\r
-               errorbox(ctr[TR_UNABLE_TO_INSTALL_GRUB]);\r
-               goto EXIT;\r
-       }\r
-       mysystem("/bin/chroot /harddisk /bin/umount -n /proc");\r
-#endif\r
-#ifdef __alpha__\r
-       sprintf(commandstring, "/bin/chroot /harddisk /sbin/swriteboot -f3 %s /boot/bootlx", hdparams.devnode_disk);\r
-       mysystem(commandstring);\r
-       sprintf(commandstring, "/bin/chroot /harddisk /sbin/abootconf %s 1", hdparams.devnode_disk_run);\r
-       mysystem(commandstring);\r
-       sprintf(string, "root=%s4", hdparams.devnode_part_run);\r
-       replace( "/harddisk/boot/etc/aboot.conf", "root=ROOT", string);\r
-#endif\r
-\r
-       /* unmounting happens everywhere because there are places\r
-          which require device is to be unmounted under certain\r
-          circumstances.  This is the last place we can unmount\r
-          anything and still succeed.\r
-       */\r
-\r
-       if (!unmount_before && !usb_cdrom && installtype == CDROM_INSTALL){\r
-               if (mysystem("/sbin/umount /cdrom"))\r
-               {\r
-                       errorbox(ctr[TR_UNABLE_TO_UNMOUNT_CDROM]);\r
-                       goto EXIT;\r
-               }\r
-       }\r
-\r
-       if ((installtype == CDROM_INSTALL) && !usb_cdrom)\r
-       {\r
-               if (!(ejectcdrom(cdromparams.devnode_disk)))\r
-               {\r
-                       errorbox(ctr[TR_UNABLE_TO_EJECT_CDROM]);\r
-                       // goto EXIT;\r
-               }\r
-       }\r
-\r
-       snprintf(message, STRING_SIZE, ctr[TR_CONGRATULATIONS_LONG],\r
-               NAME, SNAME, SNAME, NAME, NAME, NAME);\r
-       newtWinMessage(ctr[TR_CONGRATULATIONS], ctr[TR_OK], message);\r
-       \r
-       allok = 1;\r
-\r
-EXIT:\r
-       fprintf(flog, "Install program ended.\n");\r
-       fflush(flog);\r
-       fclose(flog);\r
-\r
-       if (!allok)\r
-               newtWinMessage(title, ctr[TR_OK], ctr[TR_PRESS_OK_TO_REBOOT]);  \r
-\r
-       newtFinished();\r
-\r
-       freekeyvalues(ethernetkv);\r
-       //no more needed\r
-       mysystem("/bin/chroot /harddisk /bin/rm /usr/local/bin/install2");\r
-\r
-       /* run setup only if config not restored from floppy already. */\r
-       if (allok && no_restore)\r
-       {\r
-               /* /proc is needed by the module checker.  We have to mount it\r
-                * so it can be seen by setup, which is run chrooted. */\r
-               if (system("/sbin/mount proc -t proc /harddisk/proc"))\r
-                       printf("Unable to mount proc in /harddisk.");\r
-               else\r
-               {\r
-                       if (system("/bin/chroot /harddisk /usr/local/sbin/setup /dev/tty2 INSTALL"))\r
-                               printf("Unable to run setup.\n");\r
-                       if (system("/sbin/umount /harddisk/proc"))\r
-                               printf("Unable to umount /harddisk/proc.\n");\r
-               }\r
-       }\r
-\r
-       fcloseall();\r
-\r
-       system("/bin/swapoff /harddisk/swapfile");\r
-       system("/sbin/umount /harddisk/var/log");\r
-       system("/sbin/umount /harddisk/boot");\r
-       system("/sbin/umount /harddisk");\r
-       system("/etc/halt");\r
-\r
-       return 0;\r
-}\r
-\r
-int modprobe (char *mod) {\r
-    char commandstring[STRING_SIZE];\r
-    sprintf (commandstring,"/sbin/modprobe %s", mod);\r
-    return mysystem (commandstring);    \r
-}\r
-\r
-int rmmod (char *mod) {\r
-    char commandstring[STRING_SIZE];\r
-    sprintf (commandstring,"/sbin/rmmod %s", mod);\r
-    return mysystem (commandstring);    \r
-}\r
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Contains main entry point, and misc functions.
+ * 
+ * $Id: main.c,v 1.63.2.64 2006/01/11 01:01:38 franck78 Exp $
+ * 
+ */
+#include "install.h"
+
+#define CDROM_INSTALL 0
+#define URL_INSTALL 1
+
+int raid_disk = 0;
+FILE *flog = NULL;
+char *mylog;
+char **ctr;
+
+char *pcmcia = NULL;
+extern char url[STRING_SIZE];
+
+/* 
+    To include a translated string in the final installer, you must reference
+    it here with a simplr comment. This save a lot a space in the installer
+*/
+/* TR_WELCOME */
+/* TR_HELPLINE */
+/* TR_OK */
+/* TR_ERROR */
+/* TR_SELECT_INSTALLATION_MEDIA_LONG */
+/* TR_SELECT_INSTALLATION_MEDIA */
+/* TR_CANCEL */
+/* TR_INSERT_FLOPPY */
+/* TR_INSTALLATION_CANCELED */
+/* TR_EXTRACTING_MODULES */
+/* TR_UNABLE_TO_EXTRACT_MODULES */
+/* TR_LOADING_PCMCIA */
+/* TR_PROBING_SCSI */
+/* TR_NO_CDROM */
+/* TR_INSERT_CDROM */
+/* TR_USB_KEY_VFAT_ERR */
+/* TR_NETWORK_SETUP_FAILED */
+/* TR_NO_IPCOP_TARBALL_FOUND */
+/* TR_NO_SCSI_IMAGE_FOUND */
+/* TR_INSTALLING_FILES */
+/* TR_UNABLE_TO_INSTALL_FILES */
+/* TR_NO_HARDDISK */
+/* TR_PREPARE_HARDDISK */
+/* TR_DISK_TOO_SMALL */
+/* TR_CONTINUE_NO_SWAP */
+/* TR_PARTITIONING_DISK */
+/* TR_UNABLE_TO_PARTITION */
+/* TR_MAKING_BOOT_FILESYSTEM */
+/* TR_UNABLE_TO_MAKE_BOOT_FILESYSTEM */
+/* TR_MAKING_LOG_FILESYSTEM */
+/* TR_UNABLE_TO_MAKE_LOG_FILESYSTEM */
+/* TR_MAKING_ROOT_FILESYSTEM */
+/* TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM */
+/* TR_MOUNTING_ROOT_FILESYSTEM */
+/* TR_UNABLE_TO_MOUNT_ROOT_FILESYSTEM */
+/* TR_MAKING_SWAPSPACE */
+/* TR_UNABLE_TO_MAKE_SWAPSPACE */
+/* TR_MOUNTING_SWAP_PARTITION */
+/* TR_UNABLE_TO_MOUNT_SWAP_PARTITION */
+/* TR_MOUNTING_BOOT_FILESYSTEM */
+/* TR_UNABLE_TO_MOUNT_BOOT_FILESYSTEM */
+/* TR_MOUNTING_LOG_FILESYSTEM */
+/* TR_UNABLE_TO_MOUNT_LOG_FILESYSTEM */
+/* TR_ERROR_WRITING_CONFIG */
+/* TR_INSTALLING_GRUB */
+/* TR_UNABLE_TO_INSTALL_GRUB */
+/* TR_UNABLE_TO_UNMOUNT_CDROM */
+/* TR_UNABLE_TO_EJECT_CDROM */
+/* TR_CONGRATULATIONS_LONG */
+/* TR_CONGRATULATIONS */
+/* TR_PRESS_OK_TO_REBOOT */
+
+// in nic.c
+/* TR_CONFIGURE_NETWORKING */
+/* TR_PROBE */
+/* TR_SELECT */
+/* TR_CONFIGURE_NETWORKING_LONG */
+/* TR_PROBE_FAILED */
+/* TR_FOUND_NIC */
+/* TR_INTERFACE_FAILED_TO_COME_UP */
+
+//netc.c
+/* TR_CHECKING */
+/* TR_FAILED_TO_FIND */
+/* TR_ENTER_URL */
+
+//setup.c
+/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK1 */
+/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK2 */
+/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK3 */
+/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK4 */
+/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_HARDDISK */
+/* TR_UNABLE_TO_MAKE_SYMLINK_DEV_ROOT */
+/* TR_PASSWORD_PROMPT */
+/* TR_AGAIN_PROMPT */
+/* TR_PASSWORD_CANNOT_BE_BLANK */
+/* TR_PASSWORDS_DO_NOT_MATCH */
+
+//libsmooth
+/* TR_INTERFACE */
+/* TR_ENTER_THE_IP_ADDRESS_INFORMATION */
+/* TR_STATIC */
+/* TR_DHCP_HOSTNAME */
+/* TR_IP_ADDRESS_PROMPT */
+/* TR_NETMASK_PROMPT */
+/* TR_INVALID_FIELDS */
+/* TR_IP_ADDRESS_CR */
+/* TR_NETWORK_MASK_CR */
+/* TR_DHCP_HOSTNAME_CR */
+/* TR_LOOKING_FOR_NIC */
+/* TR_MANUAL */
+/* TR_SELECT_NETWORK_DRIVER */
+/* TR_SELECT_NETWORK_DRIVER_LONG */
+/* TR_UNABLE_TO_LOAD_DRIVER_MODULE */
+/* TR_THIS_DRIVER_MODULE_IS_ALREADY_LOADED */
+/* TR_MODULE_PARAMETERS */
+/* TR_LOADING_MODULE */
+/* TR_MODULE_NAME_CANNOT_BE_BLANK */
+
+
+int main(int argc, char *argv[])
+{
+#ifdef LANG_EN_ONLY
+        char *langnames[] = { "English", NULL };
+        char *shortlangnames[] = { "en", NULL };
+        char **langtrs[] = { en_tr, NULL };
+#else
+       char *langnames[] = { "Brasil", "Cestina", "Dansk", "Deutsch", "English", "Español", "Français", "Hellenic", "Italiano", "Spanish Latino", "Magyar", "Nederlands", "Norsk", "Polski", "Português", "Slovak", "Soomali", "Suomi", "Svenska", "Türkçe", "Tieng Viet", NULL };
+       char *shortlangnames[] = { "bz", "cs", "da", "de", "en", "es", "fr", "el", "it", "la", "hu", "nl", "no", "pl", "pt", "sk", "so", "fi", "sv", "tr", "vi", NULL };
+       char **langtrs[] = { bz_tr, cs_tr, da_tr, de_tr, en_tr, es_tr, fr_tr, el_tr, it_tr, la_tr, hu_tr, nl_tr, no_tr, pl_tr, pt_tr, sk_tr, so_tr, fi_tr, sv_tr, tr_tr, vi_tr, NULL };
+#endif
+       char hdletter, cdletter;
+       char harddrive[5], cdromdrive[5];       /* Device holder. */
+       struct devparams hdparams, cdromparams; /* Params for CDROM and HD */
+       int cdmounted = 0;              /* Loop flag for inserting a cd. */ 
+       int rc;
+       char commandstring[STRING_SIZE];
+       char *installtypes[] = { "CDROM/USB-KEY", "HTTP/FTP", NULL };
+       int installtype = CDROM_INSTALL; 
+       char insertmessage[STRING_SIZE];
+       char insertdevnode[STRING_SIZE];
+       int choice;
+       char shortlangname[10];
+       char message[1000];
+       char title[STRING_SIZE];
+       int allok = 0;
+       int no_restore=0;
+       int unmount_before=0;
+       struct keyvalue *ethernetkv = initkeyvalues();
+       FILE *handle, *cmdfile;
+       char line[STRING_SIZE];
+       char string[STRING_SIZE];
+       int maximum_free = 0, current_free;
+       int memory = 0;
+       int log_partition, boot_partition, root_partition, swap_file;
+       int scsi_disk = 0;
+       int pcmcia_disk = 0;
+       int pcmcia_cdrom = 0;
+       int scsi_cdrom = 0;
+       int ide_cdrom = 0;
+       int fdisk = 0;
+       int usb_cdrom = 0;
+
+       setlocale (LC_ALL, "");
+       sethostname(SNAME, 10);
+       
+       memset(&hdparams, 0, sizeof(struct devparams));
+       memset(&cdromparams, 0, sizeof(struct devparams));
+
+       /* Log file/terminal stuff. */
+       if (argc >= 2)
+       {               
+               if (!(flog = fopen(argv[1], "w+")))
+                       return 0;
+       }
+       else
+               return 0;
+       
+       mylog = argv[1];
+       
+       fprintf(flog, "Install program started.\n");
+               
+       newtInit();
+       newtCls();
+
+       /* Do usb detection first for usb keyboard */
+       if (! (cmdfile = fopen("/proc/cmdline", "r")))
+       {
+               fprintf(flog, "Couldn't open commandline: /proc/cmdline\n");
+       } else {
+               fgets(line, STRING_SIZE, cmdfile);
+               if (strstr (line, "fdisk") != NULL) {
+                       fprintf(flog, "Manual FDISK selected.\n");
+                       fdisk = 1;
+               }
+               if (strstr (line, "nopcmcia") == NULL) {
+                       fprintf(flog, "Initializing PCMCIA controllers.\n");
+                       pcmcia = initialize_pcmcia();
+                       if (pcmcia) {
+                               fprintf (flog, "Detected PCMCIA Controller: %s.\n", pcmcia);
+                               sprintf(commandstring, "/sbin/modprobe %s", pcmcia);
+                               mysystem("/sbin/modprobe pcmcia_core");
+                               mysystem(commandstring);
+                               mysystem("/sbin/modprobe ds");
+                               /* pcmcia netcard drivers are not available from Boot floppy,
+                                * they will be loaded from Drivers floppy later */
+                       } else {
+                               fprintf (flog, "Detected No PCMCIA Controller.\n");
+                       }
+               } else {
+                       fprintf(flog, "Skipping PCMCIA detection.\n");
+               }
+               if (strstr (line, "nousb") == NULL) {
+                       fprintf(flog, "Initializing USB controllers.\n");
+                       initialize_usb();
+               } else {
+                       fprintf(flog, "Skipping USB detection.\n");
+               }
+       }
+       
+       /* English is the default */
+       for (choice = 0; langnames[choice]; choice++)
+       {
+               if (strcmp(langnames[choice], "English") == 0)
+                       break;
+       }
+       if (!langnames[choice])
+               goto EXIT;
+
+#ifdef LANG_EN_ONLY
+       /* No need to ask.  "choice" already has the index for English */
+#else
+       rc = newtWinMenu("Language selection",
+               "Select the language you wish to use for the " NAME ".", 50, 5, 5, 8,
+               langnames, &choice, "Ok", NULL);
+#endif
+       ctr = langtrs[choice];
+       strcpy(shortlangname, shortlangnames[choice]);
+       if (strcmp(shortlangname, "el") == 0)
+               mysystem("/bin/setfont iso07u-16");
+       else if (strcmp(shortlangname, "pt") == 0)
+               mysystem("/bin/setfont lat1-16");
+       else if (strcmp(shortlangname, "bz") == 0)
+               mysystem("/bin/setfont lat1-16");
+       else if (strcmp(shortlangname, "cs") == 0)
+               mysystem("/bin/setfont lat2-16");
+       else if (strcmp(shortlangname, "hu") == 0)
+               mysystem("/bin/setfont lat2-16");
+       else if (strcmp(shortlangname, "pl") == 0)
+               mysystem("/bin/setfont lat2-16");
+       else if (strcmp(shortlangname, "sk") == 0)
+               mysystem("/bin/setfont lat2-16");
+       else if (strcmp(shortlangname, "tr") == 0)
+               mysystem("/bin/setfont lat5-16");
+       else if (strcmp(shortlangname, "vi") == 0)
+               mysystem("/bin/setfont viscii10-8x16");
+       else
+               mysystem("/bin/setfont lat0-16");
+
+       /* need this for reading from formatted device */
+       modprobe("vfat");
+
+       newtDrawRootText(14, 0, NAME " v" VERSION " - " SLOGAN );
+       newtPushHelpLine(ctr[TR_HELPLINE]);
+
+       snprintf(message, STRING_SIZE, ctr[TR_WELCOME], NAME);
+       snprintf (title, STRING_SIZE, "%s v%s - %s", NAME, VERSION, SLOGAN);
+       newtWinMessage(title, ctr[TR_OK], message);
+
+       snprintf(message,STRING_SIZE, ctr[TR_SELECT_INSTALLATION_MEDIA_LONG], NAME);
+       rc = newtWinMenu(ctr[TR_SELECT_INSTALLATION_MEDIA], message,
+               50, 5, 5, 6, installtypes, &installtype, ctr[TR_OK],
+               ctr[TR_CANCEL], NULL);
+
+       if (rc == 2)
+               goto EXIT;
+
+       if (installtype == CDROM_INSTALL)  // CD or USB-key
+       {
+
+               /* try usb key in superfloppy format only */
+               if (checkusb("sda")) {
+                       sprintf(cdromdrive, "sda");
+                       usb_cdrom = 1;
+                       goto FOUND_SOURCE;
+               }
+               if (checkusb("sdb")) {
+                       sprintf(cdromdrive, "sdb");
+                       usb_cdrom = 1;
+                       goto FOUND_SOURCE;
+               }
+
+               /* look for an IDE CDROM. */
+               if ((cdletter = findidetype(IDE_CDROM)))
+               {
+                       sprintf(cdromdrive, "hd%c", cdletter);
+                       ide_cdrom = 1;
+                       goto FOUND_SOURCE;
+               }
+
+               /* If we have a USB attached CDROM then it will
+                * have already appeared at /dev/scd0, so we
+                * try to access it first, before asking for the
+                * SCSI drivers disk.
+                */
+               if (try_scsi("scd0")) {
+                       sprintf(cdromdrive, "scd0");
+                       scsi_cdrom = 1;
+                       goto FOUND_SOURCE;
+               }
+
+               /* ask for supplemental  SCSI driver */
+               snprintf(insertmessage, STRING_SIZE, ctr[TR_INSERT_FLOPPY], NAME" SCSI");
+               if (newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], insertmessage) != 1)
+               {
+                       errorbox(ctr[TR_INSTALLATION_CANCELED]);
+                       goto EXIT;
+               }
+
+               /* extract new modules */
+               if (runcommandwithstatus("/bin/tar -C / -xvzf /dev/floppy", ctr[TR_EXTRACTING_MODULES]))
+               {
+                       errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);
+                       goto EXIT;
+               }
+               /* and load PCMCIA */
+               if (pcmcia)
+               {
+                       /* trying to support SCSI pcmcia :-) */
+                       runcommandwithstatus("cardmgr -o -c /etc/pcmcia/scsi",
+                               ctr[TR_LOADING_PCMCIA]);
+                       if (try_scsi("scd0")) {
+                               sprintf(cdromdrive, "scd0");
+                               pcmcia_cdrom = 1;
+                               goto FOUND_SOURCE;
+                       }
+               }
+
+               /* try loading all SCSI modules with default options */
+               /* Should expand this to allow options later though */
+               runcommandwithstatus("/bin/probescsi.sh", ctr[TR_PROBING_SCSI]);
+
+               /* If it fails, give up. */
+               if (try_scsi("scd0")) {
+                       sprintf(cdromdrive, "scd0");
+                       scsi_cdrom = 1;
+                       goto FOUND_SOURCE;
+               }
+
+               /* Unable to find a valid source, give up */
+               errorbox(ctr[TR_NO_CDROM]);
+               goto EXIT;
+
+               FOUND_SOURCE:
+               sprintf(cdromparams.devnode_disk, "/dev/%s", cdromdrive);
+//             cdromparams.module = 0;
+
+               snprintf(insertmessage,STRING_SIZE ,ctr[TR_INSERT_CDROM], NAME);
+               strcpy (insertdevnode, cdromparams.devnode_disk);
+       }
+       else    /* don't understand why this follows... */
+       {
+               /* If we've done a PXE boot, we can skip the Drivers floppy,
+                * as we've already got the modules in our instroot.gz */
+               if (!(handle = fopen("/CDROMBOOT", "r"))) {
+                       snprintf(insertmessage, STRING_SIZE-12, ctr[TR_INSERT_FLOPPY], NAME);
+                       strcpy (insertdevnode , "/dev/floppy");
+               } else {
+                       fclose(handle);
+                       cdmounted = 1;
+                       unmount_before = 1;
+               }
+       }
+
+       /* Try to mount /cdrom with the device discovered */
+       if (scsi_cdrom || ide_cdrom || usb_cdrom) {
+               snprintf(commandstring, STRING_SIZE, "/bin/mount -o ro %s /cdrom", insertdevnode);
+               int skip_dialog = 1;
+               int sd_test = 0;
+               while (!cdmounted)
+               {
+                       /* for usb-key, we have to try sda then sda1. The key cannot be unpluged */
+                       if (sd_test == 1) { //change to sda1
+                               sprintf(commandstring, "/bin/mount -o ro %s1 /cdrom", insertdevnode);
+                       }
+                       if (sd_test == 2) { //the key do not contains a vfat file system
+                               errorbox(ctr[TR_USB_KEY_VFAT_ERR]);
+                               goto EXIT;
+                       }
+                       if (usb_cdrom) sd_test++;       // next USB test
+                       
+                       if (!skip_dialog && !usb_cdrom) {
+                           rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], insertmessage);
+                           if (rc != 1)
+                           {
+                               errorbox(ctr[TR_INSTALLATION_CANCELED]);
+                               goto EXIT;
+                           }
+                       }
+                       skip_dialog = 0;
+                       if (mysystem(commandstring))
+                           continue; //mount failed, try again
+
+                       /*verify it's what we want */
+                       handle = fopen ("/cdrom/" SNAME "-" VERSION ".tgz", "r");
+                       if (handle == NULL) {
+                               mysystem ("/bin/umount /cdrom");
+                               continue;   /* bad disk ! */
+                       }
+
+                       fclose (handle);
+                               cdmounted = 1;
+                       /* If we've booted from CDROM, then
+                        * we've already got the drivers,
+                        * so we can skip this unpack. */
+                       if ((handle = fopen("/CDROMBOOT", "r"))) {
+                               fclose(handle);
+                               break;  /* ok we go everything */
+                       }
+                       /* unpack drivers */
+                       if (runcommandwithprogress(60, 4, title,
+                                               "/bin/tar -C / -xvzf /cdrom/images/drivers-"VERSION".img",
+                                               175, ctr[TR_EXTRACTING_MODULES]))
+                       {
+                               errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);
+                               goto EXIT;
+                       }
+               }
+       } else { /* no cd device were discovered,  ask second diskette */
+               sprintf(commandstring, "/bin/tar -C / -xvzf /dev/floppy");
+               while (!cdmounted)
+               {
+                       rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], insertmessage);
+                       if (rc != 1)
+                       {
+                               errorbox(ctr[TR_INSTALLATION_CANCELED]);
+                               goto EXIT;
+                       }
+                       if (runcommandwithprogress(60, 4, title, 
+                               commandstring,
+                               175, ctr[TR_EXTRACTING_MODULES]))
+                       {
+#if 0 /* disable this, so we allow for people putting in the wrong disk */
+                               errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);
+                               goto EXIT;
+#endif
+                       }
+                       else
+                       {
+                               handle = fopen ("/bin/mke2fs", "r");
+                               if (handle != NULL) {
+                                       fclose (handle);
+                                               cdmounted = 1;
+                               }
+                       }
+               }
+       }
+
+       /* PCMCIA controller is already detected
+        * On Boot floppy, we didn't have the PCMCIA drivers
+        * so load them now because they are installed from Drivers. */
+       if (!(handle = fopen("/CDROMBOOT", "r"))) {
+               if (strstr (line, "nopcmcia") == NULL) {
+                       fprintf(flog,"Floppy boot detected, loading PCMCIA drivers.\n");
+                       if (pcmcia) {
+                               fprintf (flog, "Detected PCMCIA Controller: %s.\n", pcmcia);
+                               sprintf(commandstring, "/sbin/modprobe %s", pcmcia);
+                               mysystem("/sbin/modprobe pcmcia_core");
+                               mysystem(commandstring);
+                               mysystem("/sbin/modprobe ds");
+                       } else {
+                               fprintf (flog, "Detected No PCMCIA Controller.\n");
+                       }
+               } else {
+                       fprintf(flog, "Skipping PCMCIA detection.\n");
+               }
+               if (strstr (line, "nousb") == NULL) {
+                       fprintf(flog, "Initializing USB controllers.\n");
+                       initialize_usb();
+               } else {
+                       fprintf(flog, "Skipping USB detection.\n");
+               }
+       } else
+               fclose(handle);
+
+       /* Configure the network now! */
+       if (installtype == URL_INSTALL)
+       {
+               /* Network driver and params. */
+               if (!(networkmenu(ethernetkv)))
+               {
+                       errorbox(ctr[TR_NETWORK_SETUP_FAILED]);
+                       goto EXIT;
+               }
+
+               /* Check for ipcop-<VERSION>.tgz */
+               if (!(checktarball(SNAME "-" VERSION ".tgz")))
+               {
+                       errorbox(ctr[TR_NO_IPCOP_TARBALL_FOUND]);
+                       goto EXIT;
+               }
+       }
+
+       /* Get device for the HD.  This has to succeed. */
+       /* first try an IDE disk */
+       if ((hdletter = findidetype(IDE_HD)))
+       {
+               sprintf(harddrive, "hd%c", hdletter);
+               goto FOUND_DESTINATION;
+       }
+       /* unpack SCSI driver if not done during CD detection */
+       if (installtype == URL_INSTALL)
+       {
+               /* If we've done a PXE boot, we can skip the SCSI
+                * floppy as we've already got the modules in our 
+                * instroot.gz */
+               if (!(handle = fopen("/CDROMBOOT", "r"))) 
+               {
+                       /* search img where it is on a mounted loop iso */
+                       if (!(checktarball("images/scsidrv-"VERSION".img")))
+                       {
+                               /* Couldn't find the SCSI drivers on the URL page,
+                                * so after 3 failed attempts, ask the user for the
+                                * SCSI drivers floppy disk. */
+                               errorbox(ctr[TR_NO_SCSI_IMAGE_FOUND]);
+                               snprintf(insertmessage, STRING_SIZE, ctr[TR_INSERT_FLOPPY], NAME" SCSI");
+                               rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], insertmessage);
+                               if (rc != 1)
+                               {
+                                       errorbox(ctr[TR_INSTALLATION_CANCELED]);
+                                       goto EXIT;
+                               }
+
+                               if (runcommandwithstatus("/bin/tar -C / -xvzf /dev/floppy", ctr[TR_EXTRACTING_MODULES]))
+                               {
+                                       errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);
+                                       goto EXIT;
+                               }
+                       } else {
+                               /* unpack... THIS DO NOT WORK BECAUSE var "string" is empty*/
+                               snprintf(commandstring, STRING_SIZE,
+                                       "/bin/wget -O - %s/%s | /bin/tar -C / -xvzf -",
+                                       url, string);
+                               if (runcommandwithprogress(60, 4, title, commandstring,
+                                       4500, ctr[TR_INSTALLING_FILES]))
+                               {
+                                       errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);
+                                       goto EXIT;
+                               }
+                       }
+               } else
+                       fclose(handle);
+       } else {  /* cdrom/usb install, install SCSI id not done */
+               if (ide_cdrom) {
+                       if (runcommandwithstatus("/bin/tar -C / -xvzf /cdrom/images/scsidrv-"VERSION".img", ctr[TR_EXTRACTING_MODULES]))
+                       {
+                               errorbox(ctr[TR_UNABLE_TO_EXTRACT_MODULES]);
+                               goto EXIT;
+                       }
+               }
+       }
+
+       /* load SCSI/pcmcia drivers if not done during CD detection */
+       if (!scsi_cdrom) {
+#if 0 /* not yet */
+               if (pcmcia)
+               {
+                       /* trying to support SCSI pcmcia :-) */
+                       runcommandwithstatus("cardmgr -o -c /etc/pcmcia/scsi", 
+                               ctr[TR_LOADING_PCMCIA]);
+                       if (try_scsi(usb_cdrom ? "sdb":"sda")) {
+                               scsi_disk = 1;
+                               pcmcia_disk = 1;
+                       }
+                       if (checkusb("sdb") && try_scsi("sdc")) {
+                               scsi_disk = 1;
+                               pcmcia_disk = 1;
+                       }
+               }
+#endif
+               /* try loading all SCSI modules with default options */
+               /* Should expand this to allow options later though */
+               if (!pcmcia_disk)
+                       runcommandwithstatus("/bin/probescsi.sh",
+                               ctr[TR_PROBING_SCSI]);
+       }
+       /* Now try to find destination device...        
+          Need to clean this up at some point
+          scsi disk is sdb/sdc when sda/sdb is used for usb-key
+          if scsi-disk is is sdd or more, it is not discovered
+       */
+       if (try_scsi(usb_cdrom ? "sdb":"sda")) {
+               scsi_disk = 1;
+               sprintf(harddrive, usb_cdrom ? "sdb":"sda");
+               goto FOUND_DESTINATION;
+       }
+       if (checkusb("sdb") && try_scsi("sdc")) {
+               scsi_disk = 1;
+               sprintf(harddrive, "sdc");
+               goto FOUND_DESTINATION;
+       }
+       if (try_scsi("ida/c0d0")) {
+               raid_disk = 1;
+               sprintf(harddrive, "ida/c0d0");
+               goto FOUND_DESTINATION;
+       }
+       if (try_scsi("cciss/c0d0")) {
+               raid_disk = 1;
+               sprintf(harddrive, "cciss/c0d0");
+               goto FOUND_DESTINATION;
+       }
+       if (try_scsi("rd/c0d0")) {
+               raid_disk = 1;
+               sprintf(harddrive, "rd/c0d0");
+               goto FOUND_DESTINATION;
+       }
+       if (try_scsi("ataraid/d0")) {
+               raid_disk = 1;
+               sprintf(harddrive, "ataraid/d0");
+               goto FOUND_DESTINATION;
+       }
+       /* nothing worked, give up */
+       errorbox(ctr[TR_NO_HARDDISK]);
+       goto EXIT;
+
+       FOUND_DESTINATION:
+       /* Make the hdparms struct and print the contents.
+          With USB-KEY install and SCSI disk, while installing, the disk
+          is named 'sdb,sdc,...' (following keys)
+          On reboot, it will become 'sda'
+          To avoid many test, all names are built in the struct.
+       */
+       sprintf(hdparams.devnode_disk, "/dev/%s", harddrive);
+       /* Address the partition or raid partition (eg dev/sda or /dev/sdap1 */
+       sprintf(hdparams.devnode_part, "/dev/%s%s", harddrive,raid_disk ? "p" : "");
+       /* now the names after the machine is booted. Today only scsi is affected 
+           and we only install on the first scsi disk.
+       */
+       {   char tmp[30];
+           strcpy(tmp, scsi_disk ? "sda" : harddrive);
+           sprintf(hdparams.devnode_disk_run, "/dev/%s", tmp);
+           sprintf(hdparams.devnode_part_run, "/dev/%s%s", tmp, raid_disk ? "p" : "");
+       }
+
+       rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL],
+               ctr[TR_PREPARE_HARDDISK], hdparams.devnode_disk_run);
+       if (rc != 1)
+               goto EXIT;
+
+       /* Calculate amount of memory in machine */
+        if ((handle = fopen("/proc/meminfo", "r")))
+        {
+            while (fgets(line, STRING_SIZE-1, handle)) {
+                if (sscanf (line, "MemTotal: %s kB", string)) {
+                    memory = atoi(string) / 1024 ;
+                }
+            }
+            fclose(handle);
+        }
+
+       /* Partition, mkswp, mkfs.
+        * before partitioning, first determine the sizes of each
+        * partition.  In order to do that we need to know the size of
+        * the disk. 
+        */
+       /* Don't use mysystem here so we can redirect output */
+       sprintf(commandstring, "/bin/sfdisk -s /dev/%s > /disksize 2> /dev/null", harddrive);
+       system(commandstring);
+
+       /* Calculate amount of disk space */
+        if ((handle = fopen("/disksize", "r")))
+        {
+               fgets(line, STRING_SIZE-1, handle);
+               if (sscanf (line, "%s", string)) {
+                       maximum_free = atoi(string) / 1024;
+               }
+               fclose(handle);
+        }
+       
+       fprintf(flog, "maximum_free = %d, memory = %d", maximum_free, memory);
+       
+       /* If you need more than this, you should really add physical memory */
+       /* Minimum: 192 = 64 real + 128 swap */
+       swap_file = memory < 64 ? 2 * memory : 192 - memory ;
+       swap_file = swap_file < 32 ? 32 : swap_file ;
+
+       if (maximum_free < 135 + swap_file )
+       {
+               if (maximum_free < 135) {
+                       errorbox(ctr[TR_DISK_TOO_SMALL]);
+                       goto EXIT;
+               }
+
+               rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], ctr[TR_CONTINUE_NO_SWAP]);
+               if (rc != 1)
+                       goto EXIT;
+               swap_file = 0;
+       }
+
+       boot_partition = 8; /* in MB */
+       current_free = maximum_free - boot_partition - swap_file;
+
+       /* Give more place for add-on, extend root to 25% of current_free, upper limit to 8 gigas */
+       root_partition = current_free / 4 ;
+       root_partition = root_partition > 8192 ? 8192 : root_partition ;
+       root_partition = current_free < 860 ? 235 : root_partition;
+       root_partition = current_free < 380 ? 110 : root_partition;
+
+       current_free = current_free - root_partition;
+       root_partition = root_partition + swap_file;
+
+       log_partition = current_free;
+
+       fprintf(flog, "boot = %d, swap = %d, mylog = %d, root = %d\n",
+               boot_partition, swap_file, log_partition, root_partition);
+
+#ifdef __alpha__
+       fdisk = 1;
+#endif
+
+       if (fdisk) {
+               rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], "NOW FDISK");
+               if (rc != 1)
+                       goto EXIT;
+       } else {
+#ifdef __i386__
+               handle = fopen("/tmp/partitiontable", "w");
+
+               fprintf(handle, ",%d,83,*\n,%d,83,\n,0,0,\n,,83,\n",
+                       boot_partition, log_partition);
+
+               fclose(handle);         
+
+               sprintf(commandstring, "/bin/sfdisk -uM %s < /tmp/partitiontable", hdparams.devnode_disk);
+               if (runcommandwithstatus(commandstring, ctr[TR_PARTITIONING_DISK]))
+               {
+                       errorbox(ctr[TR_UNABLE_TO_PARTITION]);
+                       goto EXIT;
+               }
+#endif
+       }
+       /* create filesystem boot partition 1 */
+       sprintf(commandstring, "/bin/mke2fs -m 0 -j %s1", hdparams.devnode_part);
+       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_BOOT_FILESYSTEM]))
+       {
+               errorbox(ctr[TR_UNABLE_TO_MAKE_BOOT_FILESYSTEM]);
+               goto EXIT;
+       }
+
+       /* create filesystem log partition 2 */
+       sprintf(commandstring, "/bin/mke2fs -j %s2", hdparams.devnode_part);
+       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_LOG_FILESYSTEM]))
+       {
+               errorbox(ctr[TR_UNABLE_TO_MAKE_LOG_FILESYSTEM]);
+               goto EXIT;
+       }
+
+       /* create filesystem root partition 4 */
+       sprintf(commandstring, "/bin/mke2fs -m 1 -j %s4", hdparams.devnode_part);
+       if (runcommandwithstatus(commandstring, ctr[TR_MAKING_ROOT_FILESYSTEM]))
+       {
+               errorbox(ctr[TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM]);
+               goto EXIT;
+       }
+
+       /* Mount root on partition 4 */
+       sprintf(commandstring, "/sbin/mount -t ext2 %s4 /harddisk", hdparams.devnode_part);
+       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_ROOT_FILESYSTEM]))
+       {
+               errorbox(ctr[TR_UNABLE_TO_MOUNT_ROOT_FILESYSTEM]);
+               goto EXIT;
+       }
+       mkdir("/harddisk/boot", S_IRWXU|S_IRWXG|S_IRWXO);
+       mkdir("/harddisk/var", S_IRWXU|S_IRWXG|S_IRWXO);        
+       mkdir("/harddisk/var/log", S_IRWXU|S_IRWXG|S_IRWXO);
+
+       /* Make,mount swapfile */
+       if (swap_file) {
+               sprintf(commandstring, "/bin/dd if=/dev/zero of=/harddisk/swapfile bs=1024k count=%d", swap_file);
+               if (runcommandwithstatus(commandstring, ctr[TR_MAKING_SWAPSPACE]))
+               {
+                       errorbox(ctr[TR_UNABLE_TO_MAKE_SWAPSPACE]);
+                       goto EXIT;
+               }
+               if (runcommandwithstatus("/bin/mkswap /harddisk/swapfile", ctr[TR_MAKING_SWAPSPACE]))
+               {
+                       errorbox(ctr[TR_UNABLE_TO_MAKE_SWAPSPACE]);
+                       goto EXIT;
+               }
+               if (runcommandwithstatus("/bin/swapon /harddisk/swapfile", ctr[TR_MOUNTING_SWAP_PARTITION]))
+               {
+                       errorbox(ctr[TR_UNABLE_TO_MOUNT_SWAP_PARTITION]);
+                       goto EXIT;
+               }
+       }
+
+       /* Mount boot on partition 1 */
+       sprintf(commandstring, "/sbin/mount -t ext2 %s1 /harddisk/boot", hdparams.devnode_part);
+       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_BOOT_FILESYSTEM]))
+       {
+               errorbox(ctr[TR_UNABLE_TO_MOUNT_BOOT_FILESYSTEM]);
+               goto EXIT;
+       }
+
+       /* Mount log on partition 2 */
+       sprintf(commandstring, "/sbin/mount -t ext2 %s2 /harddisk/var/log", hdparams.devnode_part);
+       if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_LOG_FILESYSTEM]))
+       {
+               errorbox(ctr[TR_UNABLE_TO_MOUNT_LOG_FILESYSTEM]);
+               goto EXIT;
+       }
+       
+       /* Either use tarball from cdrom or download. */
+       if (installtype == CDROM_INSTALL)
+               snprintf(commandstring, STRING_SIZE, 
+                       "/bin/tar -C /harddisk -xvzf /cdrom/" SNAME "-" VERSION ".tgz");
+       else
+               snprintf(commandstring, STRING_SIZE, 
+                       "/bin/wget -O - %s/" SNAME "-" VERSION ".tgz | /bin/tar -C /harddisk -xvzf -", url);
+       
+       if (runcommandwithprogress(60, 4, title, commandstring, 4600,
+               ctr[TR_INSTALLING_FILES]))
+       {
+               errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);
+               goto EXIT;
+       }
+       
+       /* Save USB controller type to modules.conf */
+       write_usb_modules_conf();
+
+       /* touch the modules.dep files */
+       mysystem("/bin/chroot /harddisk /bin/touch /lib/modules/"KERNEL_VERSION"/modules.dep");
+#ifdef __i386__
+       mysystem("/bin/chroot /harddisk /bin/touch /lib/modules/"KERNEL_VERSION"-smp/modules.dep");
+#endif
+
+       /* Rename uname */
+       rename ("/harddisk/bin/uname.bak", "/harddisk/bin/uname");
+
+       /* Write PCMCIA Config */
+       if (pcmcia) {
+               handle = fopen("/harddisk/etc/modules.conf", "a");
+               if (handle != NULL) {
+                       fprintf (handle, "# PCMCIA Settings\n");
+                       fprintf (handle, "alias pcmcia-controller %s\n", pcmcia);
+                       fclose(handle);
+               }
+       }
+
+       handle = fopen("/harddisk/etc/pcmcia.conf", "w");
+       if (handle != NULL) {
+               if (pcmcia) {
+                       fprintf (handle, "PCMCIA=yes\n");
+                       fprintf (handle, "PCIC=%s\n", pcmcia);
+               } else {
+                       fprintf (handle, "PCMCIA=no\n");
+                       fprintf (handle, "PCIC=\n");
+               }
+               fprintf (handle, "CARDMGR_OPTS=\n");
+               fprintf (handle, "SCHEME=\n");
+               fclose(handle);
+       }
+
+       /* *always* write disk configuration */
+       if (!(write_disk_configs(&hdparams))){
+               errorbox(ctr[TR_ERROR_WRITING_CONFIG]);
+               goto EXIT;
+       }
+
+       /*  
+         Allow the user to restore their configuration from a floppy.
+         It uses tar.  If the tar fails for any reason, show user an
+         error and go back to the restore/skip question. This gives
+         the user the chance to have another go. */
+         
+       /* Program is outside install to save space on floppy 
+       */
+       fprintf(flog, "Passing control to install2.\n");        
+       fflush(flog);
+       //newtSuspend();
+       /* pass needed parameter for install 2 by position
+           choice: index of langage selected
+           devnode_disk: to prevent unmounting of it
+           url: if network, allow restaure from it
+       */
+       sprintf(commandstring, "/harddisk/usr/local/bin/install2 %d %s %s",
+               choice,
+               strlen(cdromparams.devnode_disk ) ? cdromparams.devnode_disk : "none",
+               strlen(url) ? url : "none"
+              );
+       no_restore = system(commandstring);
+       //newtResume();
+       
+       /*  if we installed from CD ROM then we didn't set up the
+           network interface yet.  Therefore, set up Network
+           driver and params just before we need them.
+       */
+       if (no_restore && (installtype == CDROM_INSTALL)) {  
+               if (!(networkmenu(ethernetkv))){
+                       errorbox(ctr[TR_NETWORK_SETUP_FAILED]);
+                       goto EXIT;
+               }
+       }
+
+       /* Build cache lang file */
+       mysystem("/bin/chroot /harddisk /usr/bin/perl -e \"require '" CONFIG_ROOT "/lang.pl'; &Lang::BuildCacheLang\"");
+       
+       /* write ethernet and lang configs only if they have not
+           been restored from floppy already. */
+       if (no_restore) {
+               if (!write_ethernet_configs(ethernetkv)||
+                   !write_lang_configs(shortlangname))  {
+                       errorbox(ctr[TR_ERROR_WRITING_CONFIG]);
+                       goto EXIT;
+               }
+       }
+
+
+#if 0 /* not yet */
+       if (pcmcia_disk)
+       {
+               fprintf(flog, "Detected SCSI driver PCMCIA\n");
+               fprintf(flog, "Fixing up ipcoprd.img\n");
+               mysystem("/bin/chroot /harddisk /sbin/modprobe loop");
+               mkdir("/harddisk/initrd", S_IRWXU|S_IRWXG|S_IRWXO);
+               mysystem("/bin/chroot /harddisk /sbin/pcinitrd -r "KERNEL_VERSION" /boot/ipcoprd.img");
+#ifdef __i386__
+               mysystem("/bin/chroot /harddisk /bin/mv /boot/grub/scsigrub.conf /boot/grub/grub.conf");
+#endif
+#ifdef __alpha__
+               mysystem("/bin/chroot /harddisk /bin/mv /boot/etc/scsiaboot.conf /boot/etc/aboot.conf");
+#endif
+       }
+#endif
+
+#ifdef __i386__
+       // to verify: with USB-key grubbatch install on sdb and boot sda....
+       replace( "/harddisk/boot/grub/grubbatch", "DEVICE", hdparams.devnode_disk);
+       /* restore permissions */
+       chmod("/harddisk/boot/grub/grubbatch", S_IXUSR | S_IRUSR | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH);
+
+       sprintf(string, "root=%s4", hdparams.devnode_part_run);
+       replace( "/harddisk/boot/grub/grub.conf", "root=ROOT", string);
+
+       mysystem("/bin/chroot /harddisk /bin/mount -n -t proc none /proc");
+
+       if (runcommandwithstatus("/bin/chroot /harddisk /boot/grub/grubbatch", ctr[TR_INSTALLING_GRUB]))
+       {
+               errorbox(ctr[TR_UNABLE_TO_INSTALL_GRUB]);
+               goto EXIT;
+       }
+       mysystem("/bin/chroot /harddisk /bin/umount -n /proc");
+#endif
+#ifdef __alpha__
+       sprintf(commandstring, "/bin/chroot /harddisk /sbin/swriteboot -f3 %s /boot/bootlx", hdparams.devnode_disk);
+       mysystem(commandstring);
+       sprintf(commandstring, "/bin/chroot /harddisk /sbin/abootconf %s 1", hdparams.devnode_disk_run);
+       mysystem(commandstring);
+       sprintf(string, "root=%s4", hdparams.devnode_part_run);
+       replace( "/harddisk/boot/etc/aboot.conf", "root=ROOT", string);
+#endif
+
+       /* unmounting happens everywhere because there are places
+          which require device is to be unmounted under certain
+          circumstances.  This is the last place we can unmount
+          anything and still succeed.
+       */
+
+       if (!unmount_before && !usb_cdrom && installtype == CDROM_INSTALL){
+               if (mysystem("/sbin/umount /cdrom"))
+               {
+                       errorbox(ctr[TR_UNABLE_TO_UNMOUNT_CDROM]);
+                       goto EXIT;
+               }
+       }
+
+       if ((installtype == CDROM_INSTALL) && !usb_cdrom)
+       {
+               if (!(ejectcdrom(cdromparams.devnode_disk)))
+               {
+                       errorbox(ctr[TR_UNABLE_TO_EJECT_CDROM]);
+                       // goto EXIT;
+               }
+       }
+
+       snprintf(message, STRING_SIZE, ctr[TR_CONGRATULATIONS_LONG],
+               NAME, SNAME, SNAME, NAME, NAME, NAME);
+       newtWinMessage(ctr[TR_CONGRATULATIONS], ctr[TR_OK], message);
+       
+       allok = 1;
+
+EXIT:
+       fprintf(flog, "Install program ended.\n");
+       fflush(flog);
+       fclose(flog);
+
+       if (!allok)
+               newtWinMessage(title, ctr[TR_OK], ctr[TR_PRESS_OK_TO_REBOOT]);  
+
+       newtFinished();
+
+       freekeyvalues(ethernetkv);
+       //no more needed
+       mysystem("/bin/chroot /harddisk /bin/rm /usr/local/bin/install2");
+
+       /* run setup only if config not restored from floppy already. */
+       if (allok && no_restore)
+       {
+               /* /proc is needed by the module checker.  We have to mount it
+                * so it can be seen by setup, which is run chrooted. */
+               if (system("/sbin/mount proc -t proc /harddisk/proc"))
+                       printf("Unable to mount proc in /harddisk.");
+               else
+               {
+                       if (system("/bin/chroot /harddisk /usr/local/sbin/setup /dev/tty2 INSTALL"))
+                               printf("Unable to run setup.\n");
+                       if (system("/sbin/umount /harddisk/proc"))
+                               printf("Unable to umount /harddisk/proc.\n");
+               }
+       }
+
+       fcloseall();
+
+       system("/bin/swapoff /harddisk/swapfile");
+       system("/sbin/umount /harddisk/var/log");
+       system("/sbin/umount /harddisk/boot");
+       system("/sbin/umount /harddisk");
+       system("/etc/halt");
+
+       return 0;
+}
+
+int modprobe (char *mod) {
+    char commandstring[STRING_SIZE];
+    sprintf (commandstring,"/sbin/modprobe %s", mod);
+    return mysystem (commandstring);    
+}
+
+int rmmod (char *mod) {
+    char commandstring[STRING_SIZE];
+    sprintf (commandstring,"/sbin/rmmod %s", mod);
+    return mysystem (commandstring);    
+}
index 296b0fe956c76eac953c449f657b9991128258f9..2aa84d5d1eea6a4a0596659d29a1230a603cc642 100644 (file)
@@ -1,77 +1,77 @@
-/* SmoothWall install program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * Stuff for downloading the smoothwall tarball using wget.\r
- * \r
- * $Id: net.c,v 1.8.2.2 2004/04/14 22:05:40 gespinasse Exp $\r
- * \r
- */\r
\r
-#include "install.h"\r
-\r
-extern FILE *flog;\r
-extern char *mylog;\r
-\r
-extern char **ctr;\r
-\r
-static int got_url = 0;\r
-\r
-char url[STRING_SIZE];\r
-\r
-static int gettarballurl();\r
-\r
-int checktarball(char *file)\r
-{\r
-       int done;\r
-       int tries = 0;\r
-       char commandstring[STRING_SIZE];\r
-\r
-       done = 0;\r
-       while (!done)\r
-       {\r
-               if (!got_url && gettarballurl() != 1)\r
-                       return 0;\r
-\r
-               /* remove any successive /'s */\r
-               while (url[strlen(url)-1] == '/') { url[strlen(url)-1] = '\0'; }\r
-\r
-               snprintf(commandstring, STRING_SIZE, "/bin/wget -s -O /dev/null %s/%s", url, file);\r
-               if (!(runcommandwithstatus(commandstring, ctr[TR_CHECKING])))\r
-               {\r
-                       done = 1;\r
-                       got_url = 1;\r
-               } \r
-               else \r
-               {\r
-                       errorbox(ctr[TR_FAILED_TO_FIND]);\r
-                       got_url = 0;\r
-                       if (tries == 3)\r
-                               return 0;\r
-               }\r
-               tries++;\r
-       }\r
-\r
-       return 1;\r
-}\r
-\r
-static int gettarballurl()\r
-{\r
-       char *values[] = {      NULL, NULL };   /* pointers for the values. */\r
-       struct newtWinEntry entries[] =\r
-               { { "", &values[0], 0,}, { NULL, NULL, 0 } };\r
-       char title[STRING_SIZE];\r
-       char message[1000];\r
-       int rc;\r
-\r
-       sprintf(message, ctr[TR_ENTER_URL]);\r
-       sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
-       rc = newtWinEntries(title, message,\r
-               60, 5, 5, 50, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);\r
-               \r
-       strncpy(url, values[0], STRING_SIZE);\r
-\r
-       return rc;\r
-}\r
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Stuff for downloading the smoothwall tarball using wget.
+ * 
+ * $Id: net.c,v 1.8.2.2 2004/04/14 22:05:40 gespinasse Exp $
+ * 
+ */
+#include "install.h"
+
+extern FILE *flog;
+extern char *mylog;
+
+extern char **ctr;
+
+static int got_url = 0;
+
+char url[STRING_SIZE];
+
+static int gettarballurl();
+
+int checktarball(char *file)
+{
+       int done;
+       int tries = 0;
+       char commandstring[STRING_SIZE];
+
+       done = 0;
+       while (!done)
+       {
+               if (!got_url && gettarballurl() != 1)
+                       return 0;
+
+               /* remove any successive /'s */
+               while (url[strlen(url)-1] == '/') { url[strlen(url)-1] = '\0'; }
+
+               snprintf(commandstring, STRING_SIZE, "/bin/wget -s -O /dev/null %s/%s", url, file);
+               if (!(runcommandwithstatus(commandstring, ctr[TR_CHECKING])))
+               {
+                       done = 1;
+                       got_url = 1;
+               } 
+               else 
+               {
+                       errorbox(ctr[TR_FAILED_TO_FIND]);
+                       got_url = 0;
+                       if (tries == 3)
+                               return 0;
+               }
+               tries++;
+       }
+
+       return 1;
+}
+
+static int gettarballurl()
+{
+       char *values[] = {      NULL, NULL };   /* pointers for the values. */
+       struct newtWinEntry entries[] =
+               { { "", &values[0], 0,}, { NULL, NULL, 0 } };
+       char title[STRING_SIZE];
+       char message[1000];
+       int rc;
+
+       sprintf(message, ctr[TR_ENTER_URL]);
+       sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);
+       rc = newtWinEntries(title, message,
+               60, 5, 5, 50, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);
+               
+       strncpy(url, values[0], STRING_SIZE);
+
+       return rc;
+}
index 5ae74e56d70ded25c04e69524ef0cc874ac66708..23c90f59e150b70dcfb9860724fdecf20d9aa60c 100644 (file)
@@ -1,98 +1,98 @@
-/* SmoothWall install program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Lawrence Manning, 2001\r
- * Contains stuff related to firing up the network card, including a crude\r
- * autodector.\r
- * \r
- * $Id: nic.c,v 1.8.2.2 2005/12/24 09:08:26 franck78 Exp $\r
- * \r
- */\r
-\r
-#include "install.h"\r
-\r
-#include <sys/socket.h>\r
-#include <netinet/in.h>\r
-#include <arpa/inet.h>\r
-\r
-extern FILE *flog;\r
-extern char *mylog;\r
-extern char **ctr;\r
-extern struct nic nics[];\r
-\r
-int networkmenu(struct keyvalue *ethernetkv)\r
-{\r
-       int rc;\r
-       char driver[STRING_SIZE] = "";\r
-       char driveroptions[STRING_SIZE] = "";\r
-       int result = 0;\r
-       char commandstring[STRING_SIZE];\r
-       char address[STRING_SIZE], netmask[STRING_SIZE];\r
-       int done;\r
-       char description[1000];\r
-       char message[1000];\r
-       char title[STRING_SIZE];\r
-       done = 0;\r
-\r
-       while (!done)\r
-       {\r
-               rc = newtWinTernary(ctr[TR_CONFIGURE_NETWORKING], ctr[TR_PROBE], \r
-                       ctr[TR_SELECT], ctr[TR_CANCEL], ctr[TR_CONFIGURE_NETWORKING_LONG]);\r
-               \r
-               if (rc == 0 || rc == 1)\r
-               {\r
-                       probecards(driver, driveroptions);\r
-                       if (!strlen(driver))\r
-                               errorbox(ctr[TR_PROBE_FAILED]);\r
-                       else\r
-                       {\r
-                               findnicdescription(driver, description);\r
-                               sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);\r
-                               sprintf(message, ctr[TR_FOUND_NIC], NAME, description);\r
-                               newtWinMessage(title, ctr[TR_OK], message);\r
-                       }               \r
-               }                       \r
-               else if (rc == 2)\r
-                       choosecards(driver, driveroptions);\r
-               else\r
-                       done = 1;       \r
-                       \r
-               if (strlen(driver))\r
-                       done = 1;\r
-       }\r
-       \r
-       if (!strlen(driver))\r
-               goto EXIT;\r
-\r
-       /* Default is a GREEN nic only. */\r
-       /* Smoothie is not untarred yet, so we have to delay actually writing the\r
-        * settings till later. */\r
-       replacekeyvalue(ethernetkv, "CONFIG_TYPE", "0");\r
-       replacekeyvalue(ethernetkv, "GREEN_DRIVER", driver);\r
-       replacekeyvalue(ethernetkv, "GREEN_DRIVER_OPTIONS", driveroptions);\r
-       replacekeyvalue(ethernetkv, "GREEN_DEV", "eth0");\r
-       replacekeyvalue(ethernetkv, "GREEN_DISPLAYDRIVER", driver);\r
-       \r
-       if (!(changeaddress(ethernetkv, "GREEN", 0, "")))\r
-               goto EXIT;\r
-       \r
-       strcpy(address, ""); findkey(ethernetkv, "GREEN_ADDRESS", address);\r
-       strcpy(netmask, ""); findkey(ethernetkv, "GREEN_NETMASK", netmask);\r
-\r
-       snprintf(commandstring, STRING_SIZE, "/bin/ifconfig eth0 %s netmask %s up", \r
-               address, netmask);\r
-       if (mysystem(commandstring))\r
-       {\r
-               errorbox(ctr[TR_INTERFACE_FAILED_TO_COME_UP]);\r
-               goto EXIT;\r
-       }\r
-\r
-       result = 1;\r
-       \r
-EXIT:\r
-       \r
-       return result;\r
-}\r
-\r
+/* SmoothWall install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Lawrence Manning, 2001
+ * Contains stuff related to firing up the network card, including a crude
+ * autodector.
+ * 
+ * $Id: nic.c,v 1.8.2.2 2005/12/24 09:08:26 franck78 Exp $
+ * 
+ */
+
+#include "install.h"
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+extern FILE *flog;
+extern char *mylog;
+extern char **ctr;
+extern struct nic nics[];
+
+int networkmenu(struct keyvalue *ethernetkv)
+{
+       int rc;
+       char driver[STRING_SIZE] = "";
+       char driveroptions[STRING_SIZE] = "";
+       int result = 0;
+       char commandstring[STRING_SIZE];
+       char address[STRING_SIZE], netmask[STRING_SIZE];
+       int done;
+       char description[1000];
+       char message[1000];
+       char title[STRING_SIZE];
+       done = 0;
+
+       while (!done)
+       {
+               rc = newtWinTernary(ctr[TR_CONFIGURE_NETWORKING], ctr[TR_PROBE], 
+                       ctr[TR_SELECT], ctr[TR_CANCEL], ctr[TR_CONFIGURE_NETWORKING_LONG]);
+               
+               if (rc == 0 || rc == 1)
+               {
+                       probecards(driver, driveroptions);
+                       if (!strlen(driver))
+                               errorbox(ctr[TR_PROBE_FAILED]);
+                       else
+                       {
+                               findnicdescription(driver, description);
+                               sprintf (title, "%s v%s - %s", NAME, VERSION, SLOGAN);
+                               sprintf(message, ctr[TR_FOUND_NIC], NAME, description);
+                               newtWinMessage(title, ctr[TR_OK], message);
+                       }               
+               }                       
+               else if (rc == 2)
+                       choosecards(driver, driveroptions);
+               else
+                       done = 1;       
+                       
+               if (strlen(driver))
+                       done = 1;
+       }
+       
+       if (!strlen(driver))
+               goto EXIT;
+
+       /* Default is a GREEN nic only. */
+       /* Smoothie is not untarred yet, so we have to delay actually writing the
+        * settings till later. */
+       replacekeyvalue(ethernetkv, "CONFIG_TYPE", "0");
+       replacekeyvalue(ethernetkv, "GREEN_DRIVER", driver);
+       replacekeyvalue(ethernetkv, "GREEN_DRIVER_OPTIONS", driveroptions);
+       replacekeyvalue(ethernetkv, "GREEN_DEV", "eth0");
+       replacekeyvalue(ethernetkv, "GREEN_DISPLAYDRIVER", driver);
+       
+       if (!(changeaddress(ethernetkv, "GREEN", 0, "")))
+               goto EXIT;
+       
+       strcpy(address, ""); findkey(ethernetkv, "GREEN_ADDRESS", address);
+       strcpy(netmask, ""); findkey(ethernetkv, "GREEN_NETMASK", netmask);
+
+       snprintf(commandstring, STRING_SIZE, "/bin/ifconfig eth0 %s netmask %s up", 
+               address, netmask);
+       if (mysystem(commandstring))
+       {
+               errorbox(ctr[TR_INTERFACE_FAILED_TO_COME_UP]);
+               goto EXIT;
+       }
+
+       result = 1;
+       
+EXIT:
+       
+       return result;
+}
+
index 4bf5432e24a5e466595771d44ac2c4280204f33d..048f979896295d5c9a49e1b962941356e02316fa 100644 (file)
-/*\r
- * PCMCIA bridge device probe\r
- *\r
- * This file is part of the IPCop Firewall.\r
- *\r
- * IPCop is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * IPCop is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with IPCop; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
- *\r
- * The initial developer of the original code is David A. Hinds\r
- * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds\r
- * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.\r
- *\r
- * $Id: pcmcia.c,v 1.6.2.4 2005/12/08 02:12:28 franck78 Exp $\r
- *\r
- */\r
-\r
-#include "install.h"\r
-#include "pcmcia.h"\r
-\r
-#ifdef __GLIBC__\r
-#include <sys/io.h>\r
-#else\r
-#include <asm/io.h>\r
-#endif\r
-\r
-extern FILE *flog;\r
-extern int modprobe(char *);\r
-\r
-/*====================================================================*/\r
-\r
-typedef struct {\r
-    u_short    vendor, device;\r
-    char       *modname;\r
-    char       *name;\r
-} pci_id_t;\r
-\r
-pci_id_t pci_id[] = {\r
-    { 0x1013, 0x1100, "i82365", "Cirrus Logic CL 6729" },\r
-    { 0x1013, 0x1110, "yenta_socket", "Cirrus Logic PD 6832" },\r
-    { 0x10b3, 0xb106, "yenta_socket", "SMC 34C90" },\r
-    { 0x1180, 0x0465, "yenta_socket", "Ricoh RL5C465" },\r
-    { 0x1180, 0x0466, "yenta_socket", "Ricoh RL5C466" },\r
-    { 0x1180, 0x0475, "yenta_socket", "Ricoh RL5C475" },\r
-    { 0x1180, 0x0476, "yenta_socket", "Ricoh RL5C476" },\r
-    { 0x1180, 0x0477, "yenta_socket", "Ricoh RL5C477" },\r
-    { 0x1180, 0x0478, "yenta_socket", "Ricoh RL5C478" },\r
-    { 0x104c, 0xac12, "yenta_socket", "Texas Instruments PCI1130" }, \r
-    { 0x104c, 0xac13, "yenta_socket", "Texas Instruments PCI1031" }, \r
-    { 0x104c, 0xac15, "yenta_socket", "Texas Instruments PCI1131" }, \r
-    { 0x104c, 0xac1a, "yenta_socket", "Texas Instruments PCI1210" }, \r
-    { 0x104c, 0xac1e, "yenta_socket", "Texas Instruments PCI1211" }, \r
-    { 0x104c, 0xac17, "yenta_socket", "Texas Instruments PCI1220" }, \r
-    { 0x104c, 0xac19, "yenta_socket", "Texas Instruments PCI1221" }, \r
-    { 0x104c, 0xac1c, "yenta_socket", "Texas Instruments PCI1225" }, \r
-    { 0x104c, 0xac16, "yenta_socket", "Texas Instruments PCI1250" }, \r
-    { 0x104c, 0xac1d, "yenta_socket", "Texas Instruments PCI1251A" }, \r
-    { 0x104c, 0xac1f, "yenta_socket", "Texas Instruments PCI1251B" }, \r
-    { 0x104c, 0xac50, "yenta_socket", "Texas Instruments PCI1410" }, \r
-    { 0x104c, 0xac51, "yenta_socket", "Texas Instruments PCI1420" }, \r
-    { 0x104c, 0xac1b, "yenta_socket", "Texas Instruments PCI1450" }, \r
-    { 0x104c, 0xac52, "yenta_socket", "Texas Instruments PCI1451" }, \r
-    { 0x104c, 0xac56, "yenta_socket", "Texas Instruments PCI1510" }, \r
-    { 0x104c, 0xac55, "yenta_socket", "Texas Instruments PCI1520" }, \r
-    { 0x104c, 0xac54, "yenta_socket", "Texas Instruments PCI1620" }, \r
-    { 0x104c, 0xac41, "yenta_socket", "Texas Instruments PCI4410" }, \r
-    { 0x104c, 0xac40, "yenta_socket", "Texas Instruments PCI4450" }, \r
-    { 0x104c, 0xac42, "yenta_socket", "Texas Instruments PCI4451" }, \r
-    { 0x104c, 0xac44, "yenta_socket", "Texas Instruments PCI4510" }, \r
-    { 0x104c, 0xac46, "yenta_socket", "Texas Instruments PCI4520" }, \r
-    { 0x104c, 0xac49, "yenta_socket", "Texas Instruments PCI7410" }, \r
-    { 0x104c, 0xac47, "yenta_socket", "Texas Instruments PCI7510" }, \r
-    { 0x104c, 0xac48, "yenta_socket", "Texas Instruments PCI7610" }, \r
-    { 0x1217, 0x6729, "i82365", "O2 Micro 6729" }, \r
-    { 0x1217, 0x673a, "i82365", "O2 Micro 6730" }, \r
-    { 0x1217, 0x6832, "yenta_socket", "O2 Micro 6832/6833" }, \r
-    { 0x1217, 0x6836, "yenta_socket", "O2 Micro 6836/6860" }, \r
-    { 0x1217, 0x6872, "yenta_socket", "O2 Micro 6812" }, \r
-    { 0x1217, 0x6925, "yenta_socket", "O2 Micro 6922" }, \r
-    { 0x1217, 0x6933, "yenta_socket", "O2 Micro 6933" }, \r
-    { 0x1217, 0x6972, "yenta_socket", "O2 Micro 6912" }, \r
-    { 0x1179, 0x0603, "i82365", "Toshiba ToPIC95-A" }, \r
-    { 0x1179, 0x060a, "yenta_socket", "Toshiba ToPIC95-B" }, \r
-    { 0x1179, 0x060f, "yenta_socket", "Toshiba ToPIC97" }, \r
-    { 0x1179, 0x0617, "yenta_socket", "Toshiba ToPIC100" }, \r
-    { 0x119b, 0x1221, "i82365", "Omega Micro 82C092G" }, \r
-    { 0x8086, 0x1221, "i82092", "Intel 82092AA_0" }, \r
-    { 0x8086, 0x1222, "i82092", "Intel 82092AA_1" }, \r
-    { 0x1524, 0x1211, "yenta_socket", "ENE 1211" },\r
-    { 0x1524, 0x1225, "yenta_socket", "ENE 1225" },\r
-    { 0x1524, 0x1410, "yenta_socket", "ENE 1410" },\r
-    { 0x1524, 0x1420, "yenta_socket", "ENE 1420" },\r
-};\r
-#define PCI_COUNT (sizeof(pci_id)/sizeof(pci_id_t))\r
-\r
-static char * pci_probe()\r
-{\r
-    char s[256], *modname = NULL;\r
-    u_int device, vendor, i;\r
-    FILE *f;\r
-    \r
-    if ((f = fopen("/proc/bus/pci/devices", "r")) != NULL) {\r
-       while (fgets(s, 256, f) != NULL) {\r
-           u_int n = strtoul(s+5, NULL, 16);\r
-           vendor = (n >> 16); device = (n & 0xffff);\r
-           for (i = 0; i < PCI_COUNT; i++)\r
-               if ((vendor == pci_id[i].vendor) &&\r
-                   (device == pci_id[i].device)) break;\r
-\r
-           if (i < PCI_COUNT) {\r
-               modname = pci_id[i].modname;\r
-               break;\r
-           }\r
-       }\r
-    }\r
-    \r
-    return modname;\r
-}\r
-\r
-/*====================================================================*/\r
-\r
-#ifndef __alpha__\r
-typedef u_short ioaddr_t;\r
-\r
-static ioaddr_t i365_base = 0x03e0;\r
-\r
-static u_char i365_get(u_short sock, u_short reg)\r
-{\r
-    u_char val = I365_REG(sock, reg);\r
-    outb(val, i365_base); val = inb(i365_base+1);\r
-    return val;\r
-}\r
-\r
-#if 0    // the following code do nothing usefull, it ends with return 0 anyway\r
-\r
-static void i365_set(u_short sock, u_short reg, u_char data)\r
-{\r
-    u_char val = I365_REG(sock, reg);\r
-    outb(val, i365_base); outb(data, i365_base+1);\r
-}\r
-\r
-static void i365_bset(u_short sock, u_short reg, u_char mask)\r
-{\r
-    u_char d = i365_get(sock, reg);\r
-    d |= mask;\r
-    i365_set(sock, reg, d);\r
-}\r
-\r
-static void i365_bclr(u_short sock, u_short reg, u_char mask)\r
-{\r
-    u_char d = i365_get(sock, reg);\r
-    d &= ~mask;\r
-    i365_set(sock, reg, d);\r
-}\r
-#endif\r
-\r
-int i365_probe()\r
-{\r
-    int val, slot, sock, done;\r
-//   char *name = "i82365sl";\r
-\r
-    ioperm(i365_base, 4, 1);\r
-    ioperm(0x80, 1, 1);\r
-    for (slot = 0; slot < 2; slot++) {\r
-       for (sock = done = 0; sock < 2; sock++) {\r
-           val = i365_get(sock, I365_IDENT);\r
-           switch (val) {\r
-           case 0x82:\r
-//             name = "i82365sl A step";\r
-//             break;\r
-           case 0x83:\r
-//             name = "i82365sl B step";\r
-//         break;\r
-           case 0x84:\r
-//             name = "VLSI 82C146";\r
-//             break;\r
-           case 0x88: case 0x89: case 0x8a:\r
-//             name = "IBM Clone";\r
-//         break;\r
-           case 0x8b: case 0x8c:\r
-               break;\r
-           default:\r
-               done = 1;\r
-           }\r
-           if (done) break;\r
-       }\r
-       if (done && sock) break;\r
-       i365_base += 2;\r
-    }\r
-\r
-    if (sock == 0) {\r
-       return -1;\r
-    }\r
-\r
-#if 0    // the following code do nothing usefull, it ends with return 0 anyway\r
-    if ((sock == 2) && (strcmp(name, "VLSI 82C146") == 0))\r
-       name = "i82365sl DF";\r
-\r
-    /* Check for Vadem chips */\r
-    outb(0x0e, i365_base);\r
-    outb(0x37, i365_base);\r
-    i365_bset(0, VG468_MISC, VG468_MISC_VADEMREV);\r
-    val = i365_get(0, I365_IDENT);\r
-    if (val & I365_IDENT_VADEM) {\r
-       if ((val & 7) < 4)\r
-           name = "Vadem VG-468";\r
-       else\r
-           name = "Vadem VG-469";\r
-       i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV);\r
-    }\r
-    \r
-    /* Check for Cirrus CL-PD67xx chips */\r
-    i365_set(0, PD67_CHIP_INFO, 0);\r
-    val = i365_get(0, PD67_CHIP_INFO);\r
-    if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) {\r
-       val = i365_get(0, PD67_CHIP_INFO);\r
-       if ((val & PD67_INFO_CHIP_ID) == 0) {\r
-           if (val & PD67_INFO_SLOTS)\r
-               name = "Cirrus CL-PD672x";\r
-           else {\r
-               name = "Cirrus CL-PD6710";\r
-               sock = 1;\r
-           }\r
-           i365_set(0, PD67_EXT_INDEX, 0xe5);\r
-           if (i365_get(0, PD67_EXT_INDEX) != 0xe5)\r
-               name = "VIA VT83C469";\r
-       }\r
-    }\r
-#endif\r
-    return 0;\r
-    \r
-} /* i365_probe */\r
-#endif\r
-\r
-/*====================================================================*/\r
-\r
-#ifndef __alpha__\r
-static u_short tcic_getw(ioaddr_t base, u_char reg)\r
-{\r
-    u_short val = inw(base+reg);\r
-    return val;\r
-}\r
-\r
-static void tcic_setw(ioaddr_t base, u_char reg, u_short data)\r
-{\r
-    outw(data, base+reg);\r
-}\r
-\r
-int tcic_probe_at(ioaddr_t base)\r
-{\r
-    int i;\r
-    u_short old;\r
-    \r
-    /* Anything there?? */\r
-    for (i = 0; i < 0x10; i += 2)\r
-       if (tcic_getw(base, i) == 0xffff)\r
-           return -1;\r
-\r
-    /* Try to reset the chip */\r
-    tcic_setw(base, TCIC_SCTRL, TCIC_SCTRL_RESET);\r
-    tcic_setw(base, TCIC_SCTRL, 0);\r
-    \r
-    /* Can we set the addr register? */\r
-    old = tcic_getw(base, TCIC_ADDR);\r
-    tcic_setw(base, TCIC_ADDR, 0);\r
-    if (tcic_getw(base, TCIC_ADDR) != 0) {\r
-       tcic_setw(base, TCIC_ADDR, old);\r
-       return -2;\r
-    }\r
-    \r
-    tcic_setw(base, TCIC_ADDR, 0xc3a5);\r
-    if (tcic_getw(base, TCIC_ADDR) != 0xc3a5)\r
-       return -3;\r
-\r
-    return 2;\r
-}\r
-\r
-int tcic_probe(ioaddr_t base)\r
-{\r
-    int sock;\r
-\r
-    ioperm(base, 16, 1);\r
-    ioperm(0x80, 1, 1);\r
-    sock = tcic_probe_at(base);\r
-    \r
-    if (sock <= 0) {\r
-       return -1;\r
-    }\r
-\r
-    return 0;\r
-    \r
-} /* tcic_probe */\r
-#endif\r
-\r
-/*====================================================================*/\r
-char * initialize_pcmcia (void)\r
-{\r
-#ifndef __alpha__\r
-    ioaddr_t tcic_base = TCIC_BASE;\r
-#endif\r
-    char* pcmcia;\r
-    \r
-    if ((pcmcia = pci_probe()))\r
-       return pcmcia; /* we're all done */\r
-#ifndef __alpha__\r
-    else if (i365_probe() == 0)\r
-       return "i82365";\r
-    else if (tcic_probe(tcic_base) == 0)\r
-       return "tcic";\r
-#endif\r
-    else {\r
-       /* Detect ISAPNP based i82365 controllers */\r
-       FILE *f;\r
-        modprobe("i82365");\r
-       if ((f = fopen("/proc/bus/pccard/00/info", "r"))) {\r
-               fclose(f);\r
-               return "i82365";\r
-       }\r
-    }\r
-\r
-    return NULL;\r
-}\r
+/*
+ * PCMCIA bridge device probe
+ *
+ * This file is part of the IPCop Firewall.
+ *
+ * IPCop is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * IPCop is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with IPCop; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+ *
+ * $Id: pcmcia.c,v 1.6.2.4 2005/12/08 02:12:28 franck78 Exp $
+ *
+ */
+
+#include "install.h"
+#include "pcmcia.h"
+
+#ifdef __GLIBC__
+#include <sys/io.h>
+#else
+#include <asm/io.h>
+#endif
+
+extern FILE *flog;
+extern int modprobe(char *);
+
+/*====================================================================*/
+
+typedef struct {
+    u_short    vendor, device;
+    char       *modname;
+    char       *name;
+} pci_id_t;
+
+pci_id_t pci_id[] = {
+    { 0x1013, 0x1100, "i82365", "Cirrus Logic CL 6729" },
+    { 0x1013, 0x1110, "yenta_socket", "Cirrus Logic PD 6832" },
+    { 0x10b3, 0xb106, "yenta_socket", "SMC 34C90" },
+    { 0x1180, 0x0465, "yenta_socket", "Ricoh RL5C465" },
+    { 0x1180, 0x0466, "yenta_socket", "Ricoh RL5C466" },
+    { 0x1180, 0x0475, "yenta_socket", "Ricoh RL5C475" },
+    { 0x1180, 0x0476, "yenta_socket", "Ricoh RL5C476" },
+    { 0x1180, 0x0477, "yenta_socket", "Ricoh RL5C477" },
+    { 0x1180, 0x0478, "yenta_socket", "Ricoh RL5C478" },
+    { 0x104c, 0xac12, "yenta_socket", "Texas Instruments PCI1130" }, 
+    { 0x104c, 0xac13, "yenta_socket", "Texas Instruments PCI1031" }, 
+    { 0x104c, 0xac15, "yenta_socket", "Texas Instruments PCI1131" }, 
+    { 0x104c, 0xac1a, "yenta_socket", "Texas Instruments PCI1210" }, 
+    { 0x104c, 0xac1e, "yenta_socket", "Texas Instruments PCI1211" }, 
+    { 0x104c, 0xac17, "yenta_socket", "Texas Instruments PCI1220" }, 
+    { 0x104c, 0xac19, "yenta_socket", "Texas Instruments PCI1221" }, 
+    { 0x104c, 0xac1c, "yenta_socket", "Texas Instruments PCI1225" }, 
+    { 0x104c, 0xac16, "yenta_socket", "Texas Instruments PCI1250" }, 
+    { 0x104c, 0xac1d, "yenta_socket", "Texas Instruments PCI1251A" }, 
+    { 0x104c, 0xac1f, "yenta_socket", "Texas Instruments PCI1251B" }, 
+    { 0x104c, 0xac50, "yenta_socket", "Texas Instruments PCI1410" }, 
+    { 0x104c, 0xac51, "yenta_socket", "Texas Instruments PCI1420" }, 
+    { 0x104c, 0xac1b, "yenta_socket", "Texas Instruments PCI1450" }, 
+    { 0x104c, 0xac52, "yenta_socket", "Texas Instruments PCI1451" }, 
+    { 0x104c, 0xac56, "yenta_socket", "Texas Instruments PCI1510" }, 
+    { 0x104c, 0xac55, "yenta_socket", "Texas Instruments PCI1520" }, 
+    { 0x104c, 0xac54, "yenta_socket", "Texas Instruments PCI1620" }, 
+    { 0x104c, 0xac41, "yenta_socket", "Texas Instruments PCI4410" }, 
+    { 0x104c, 0xac40, "yenta_socket", "Texas Instruments PCI4450" }, 
+    { 0x104c, 0xac42, "yenta_socket", "Texas Instruments PCI4451" }, 
+    { 0x104c, 0xac44, "yenta_socket", "Texas Instruments PCI4510" }, 
+    { 0x104c, 0xac46, "yenta_socket", "Texas Instruments PCI4520" }, 
+    { 0x104c, 0xac49, "yenta_socket", "Texas Instruments PCI7410" }, 
+    { 0x104c, 0xac47, "yenta_socket", "Texas Instruments PCI7510" }, 
+    { 0x104c, 0xac48, "yenta_socket", "Texas Instruments PCI7610" }, 
+    { 0x1217, 0x6729, "i82365", "O2 Micro 6729" }, 
+    { 0x1217, 0x673a, "i82365", "O2 Micro 6730" }, 
+    { 0x1217, 0x6832, "yenta_socket", "O2 Micro 6832/6833" }, 
+    { 0x1217, 0x6836, "yenta_socket", "O2 Micro 6836/6860" }, 
+    { 0x1217, 0x6872, "yenta_socket", "O2 Micro 6812" }, 
+    { 0x1217, 0x6925, "yenta_socket", "O2 Micro 6922" }, 
+    { 0x1217, 0x6933, "yenta_socket", "O2 Micro 6933" }, 
+    { 0x1217, 0x6972, "yenta_socket", "O2 Micro 6912" }, 
+    { 0x1179, 0x0603, "i82365", "Toshiba ToPIC95-A" }, 
+    { 0x1179, 0x060a, "yenta_socket", "Toshiba ToPIC95-B" }, 
+    { 0x1179, 0x060f, "yenta_socket", "Toshiba ToPIC97" }, 
+    { 0x1179, 0x0617, "yenta_socket", "Toshiba ToPIC100" }, 
+    { 0x119b, 0x1221, "i82365", "Omega Micro 82C092G" }, 
+    { 0x8086, 0x1221, "i82092", "Intel 82092AA_0" }, 
+    { 0x8086, 0x1222, "i82092", "Intel 82092AA_1" }, 
+    { 0x1524, 0x1211, "yenta_socket", "ENE 1211" },
+    { 0x1524, 0x1225, "yenta_socket", "ENE 1225" },
+    { 0x1524, 0x1410, "yenta_socket", "ENE 1410" },
+    { 0x1524, 0x1420, "yenta_socket", "ENE 1420" },
+};
+#define PCI_COUNT (sizeof(pci_id)/sizeof(pci_id_t))
+
+static char * pci_probe()
+{
+    char s[256], *modname = NULL;
+    u_int device, vendor, i;
+    FILE *f;
+    
+    if ((f = fopen("/proc/bus/pci/devices", "r")) != NULL) {
+       while (fgets(s, 256, f) != NULL) {
+           u_int n = strtoul(s+5, NULL, 16);
+           vendor = (n >> 16); device = (n & 0xffff);
+           for (i = 0; i < PCI_COUNT; i++)
+               if ((vendor == pci_id[i].vendor) &&
+                   (device == pci_id[i].device)) break;
+
+           if (i < PCI_COUNT) {
+               modname = pci_id[i].modname;
+               break;
+           }
+       }
+    }
+    
+    return modname;
+}
+
+/*====================================================================*/
+
+#ifndef __alpha__
+typedef u_short ioaddr_t;
+
+static ioaddr_t i365_base = 0x03e0;
+
+static u_char i365_get(u_short sock, u_short reg)
+{
+    u_char val = I365_REG(sock, reg);
+    outb(val, i365_base); val = inb(i365_base+1);
+    return val;
+}
+
+#if 0    // the following code do nothing usefull, it ends with return 0 anyway
+
+static void i365_set(u_short sock, u_short reg, u_char data)
+{
+    u_char val = I365_REG(sock, reg);
+    outb(val, i365_base); outb(data, i365_base+1);
+}
+
+static void i365_bset(u_short sock, u_short reg, u_char mask)
+{
+    u_char d = i365_get(sock, reg);
+    d |= mask;
+    i365_set(sock, reg, d);
+}
+
+static void i365_bclr(u_short sock, u_short reg, u_char mask)
+{
+    u_char d = i365_get(sock, reg);
+    d &= ~mask;
+    i365_set(sock, reg, d);
+}
+#endif
+
+int i365_probe()
+{
+    int val, slot, sock, done;
+//   char *name = "i82365sl";
+
+    ioperm(i365_base, 4, 1);
+    ioperm(0x80, 1, 1);
+    for (slot = 0; slot < 2; slot++) {
+       for (sock = done = 0; sock < 2; sock++) {
+           val = i365_get(sock, I365_IDENT);
+           switch (val) {
+           case 0x82:
+//             name = "i82365sl A step";
+//             break;
+           case 0x83:
+//             name = "i82365sl B step";
+//         break;
+           case 0x84:
+//             name = "VLSI 82C146";
+//             break;
+           case 0x88: case 0x89: case 0x8a:
+//             name = "IBM Clone";
+//         break;
+           case 0x8b: case 0x8c:
+               break;
+           default:
+               done = 1;
+           }
+           if (done) break;
+       }
+       if (done && sock) break;
+       i365_base += 2;
+    }
+
+    if (sock == 0) {
+       return -1;
+    }
+
+#if 0    // the following code do nothing usefull, it ends with return 0 anyway
+    if ((sock == 2) && (strcmp(name, "VLSI 82C146") == 0))
+       name = "i82365sl DF";
+
+    /* Check for Vadem chips */
+    outb(0x0e, i365_base);
+    outb(0x37, i365_base);
+    i365_bset(0, VG468_MISC, VG468_MISC_VADEMREV);
+    val = i365_get(0, I365_IDENT);
+    if (val & I365_IDENT_VADEM) {
+       if ((val & 7) < 4)
+           name = "Vadem VG-468";
+       else
+           name = "Vadem VG-469";
+       i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV);
+    }
+    
+    /* Check for Cirrus CL-PD67xx chips */
+    i365_set(0, PD67_CHIP_INFO, 0);
+    val = i365_get(0, PD67_CHIP_INFO);
+    if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) {
+       val = i365_get(0, PD67_CHIP_INFO);
+       if ((val & PD67_INFO_CHIP_ID) == 0) {
+           if (val & PD67_INFO_SLOTS)
+               name = "Cirrus CL-PD672x";
+           else {
+               name = "Cirrus CL-PD6710";
+               sock = 1;
+           }
+           i365_set(0, PD67_EXT_INDEX, 0xe5);
+           if (i365_get(0, PD67_EXT_INDEX) != 0xe5)
+               name = "VIA VT83C469";
+       }
+    }
+#endif
+    return 0;
+    
+} /* i365_probe */
+#endif
+
+/*====================================================================*/
+
+#ifndef __alpha__
+static u_short tcic_getw(ioaddr_t base, u_char reg)
+{
+    u_short val = inw(base+reg);
+    return val;
+}
+
+static void tcic_setw(ioaddr_t base, u_char reg, u_short data)
+{
+    outw(data, base+reg);
+}
+
+int tcic_probe_at(ioaddr_t base)
+{
+    int i;
+    u_short old;
+    
+    /* Anything there?? */
+    for (i = 0; i < 0x10; i += 2)
+       if (tcic_getw(base, i) == 0xffff)
+           return -1;
+
+    /* Try to reset the chip */
+    tcic_setw(base, TCIC_SCTRL, TCIC_SCTRL_RESET);
+    tcic_setw(base, TCIC_SCTRL, 0);
+    
+    /* Can we set the addr register? */
+    old = tcic_getw(base, TCIC_ADDR);
+    tcic_setw(base, TCIC_ADDR, 0);
+    if (tcic_getw(base, TCIC_ADDR) != 0) {
+       tcic_setw(base, TCIC_ADDR, old);
+       return -2;
+    }
+    
+    tcic_setw(base, TCIC_ADDR, 0xc3a5);
+    if (tcic_getw(base, TCIC_ADDR) != 0xc3a5)
+       return -3;
+
+    return 2;
+}
+
+int tcic_probe(ioaddr_t base)
+{
+    int sock;
+
+    ioperm(base, 16, 1);
+    ioperm(0x80, 1, 1);
+    sock = tcic_probe_at(base);
+    
+    if (sock <= 0) {
+       return -1;
+    }
+
+    return 0;
+    
+} /* tcic_probe */
+#endif
+
+/*====================================================================*/
+char * initialize_pcmcia (void)
+{
+#ifndef __alpha__
+    ioaddr_t tcic_base = TCIC_BASE;
+#endif
+    char* pcmcia;
+    
+    if ((pcmcia = pci_probe()))
+       return pcmcia; /* we're all done */
+#ifndef __alpha__
+    else if (i365_probe() == 0)
+       return "i82365";
+    else if (tcic_probe(tcic_base) == 0)
+       return "tcic";
+#endif
+    else {
+       /* Detect ISAPNP based i82365 controllers */
+       FILE *f;
+        modprobe("i82365");
+       if ((f = fopen("/proc/bus/pccard/00/info", "r"))) {
+               fclose(f);
+               return "i82365";
+       }
+    }
+
+    return NULL;
+}
index 7b81dc4dc749ce6a6cdf9ab1a221d3b6ec3a6a14..d172caa1c4835f76b848ad8edc9dbd62f611b6dd 100644 (file)
-/*\r
- * PCMCIA bridge device probe\r
- *\r
- * This file is part of the IPCop Firewall.\r
- *\r
- * IPCop is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * IPCop is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with IPCop; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
- *\r
- * The initial developer of the original code is David A. Hinds\r
- * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds\r
- * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.\r
- *\r
- * $Id: pcmcia.h,v 1.1 2004/01/25 09:34:59 riddles Exp $\r
- *\r
- */\r
-\r
-#define TCIC_BASE              0x240\r
-\r
-/* offsets of registers from TCIC_BASE */\r
-#define TCIC_DATA              0x00\r
-#define TCIC_ADDR              0x02\r
-#define TCIC_SCTRL             0x06\r
-#define TCIC_SSTAT             0x07\r
-#define TCIC_MODE              0x08\r
-#define TCIC_PWR               0x09\r
-#define TCIC_EDC               0x0A\r
-#define TCIC_ICSR              0x0C\r
-#define TCIC_IENA              0x0D\r
-#define TCIC_AUX               0x0E\r
-\r
-#define TCIC_SS_SHFT           12\r
-#define TCIC_SS_MASK           0x7000\r
-\r
-/* Flags for TCIC_ADDR */\r
-#define TCIC_ADR2_REG          0x8000\r
-#define TCIC_ADR2_INDREG       0x0800\r
-\r
-#define TCIC_ADDR_REG          0x80000000\r
-#define TCIC_ADDR_SS_SHFT      (TCIC_SS_SHFT+16)\r
-#define TCIC_ADDR_SS_MASK      (TCIC_SS_MASK<<16)\r
-#define TCIC_ADDR_INDREG       0x08000000\r
-#define TCIC_ADDR_IO           0x04000000\r
-#define TCIC_ADDR_MASK         0x03ffffff\r
-\r
-/* Flags for TCIC_SCTRL */\r
-#define TCIC_SCTRL_ENA         0x01\r
-#define TCIC_SCTRL_INCMODE     0x18\r
-#define TCIC_SCTRL_INCMODE_HOLD        0x00\r
-#define TCIC_SCTRL_INCMODE_WORD        0x08\r
-#define TCIC_SCTRL_INCMODE_REG 0x10\r
-#define TCIC_SCTRL_INCMODE_AUTO        0x18\r
-#define TCIC_SCTRL_EDCSUM      0x20\r
-#define TCIC_SCTRL_RESET       0x80\r
-\r
-/* Flags for TCIC_SSTAT */\r
-#define TCIC_SSTAT_6US         0x01\r
-#define TCIC_SSTAT_10US                0x02\r
-#define TCIC_SSTAT_PROGTIME    0x04\r
-#define TCIC_SSTAT_LBAT1       0x08\r
-#define TCIC_SSTAT_LBAT2       0x10\r
-#define TCIC_SSTAT_RDY         0x20    /* Inverted */\r
-#define TCIC_SSTAT_WP          0x40\r
-#define TCIC_SSTAT_CD          0x80    /* Card detect */\r
-\r
-/* Flags for TCIC_MODE */\r
-#define TCIC_MODE_PGMMASK      0x1f\r
-#define TCIC_MODE_NORMAL       0x00\r
-#define TCIC_MODE_PGMWR                0x01\r
-#define TCIC_MODE_PGMRD                0x02\r
-#define TCIC_MODE_PGMCE                0x04\r
-#define TCIC_MODE_PGMDBW       0x08\r
-#define TCIC_MODE_PGMWORD      0x10\r
-#define TCIC_MODE_AUXSEL_MASK  0xe0\r
-\r
-/* Registers accessed through TCIC_AUX, by setting TCIC_MODE */\r
-#define TCIC_AUX_TCTL          (0<<5)\r
-#define TCIC_AUX_PCTL          (1<<5)\r
-#define TCIC_AUX_WCTL          (2<<5)\r
-#define TCIC_AUX_EXTERN                (3<<5)\r
-#define TCIC_AUX_PDATA         (4<<5)\r
-#define TCIC_AUX_SYSCFG                (5<<5)\r
-#define TCIC_AUX_ILOCK         (6<<5)\r
-#define TCIC_AUX_TEST          (7<<5)\r
-\r
-/* Flags for TCIC_PWR */\r
-#define TCIC_PWR_VCC(sock)     (0x01<<(sock))\r
-#define TCIC_PWR_VCC_MASK      0x03\r
-#define TCIC_PWR_VPP(sock)     (0x08<<(sock))\r
-#define TCIC_PWR_VPP_MASK      0x18\r
-#define TCIC_PWR_CLIMENA       0x40\r
-#define TCIC_PWR_CLIMSTAT      0x80\r
-\r
-/* Flags for TCIC_ICSR */\r
-#define TCIC_ICSR_CLEAR                0x01\r
-#define TCIC_ICSR_SET          0x02\r
-#define TCIC_ICSR_JAM          (TCIC_ICSR_CLEAR|TCIC_ICSR_SET)\r
-#define TCIC_ICSR_STOPCPU      0x04\r
-#define TCIC_ICSR_ILOCK                0x08\r
-#define TCIC_ICSR_PROGTIME     0x10\r
-#define TCIC_ICSR_ERR          0x20\r
-#define TCIC_ICSR_CDCHG                0x40\r
-#define TCIC_ICSR_IOCHK                0x80\r
-\r
-/* Flags for TCIC_IENA */\r
-#define TCIC_IENA_CFG_MASK     0x03\r
-#define TCIC_IENA_CFG_OFF      0x00    /* disabled */\r
-#define TCIC_IENA_CFG_OD       0x01    /* active low, open drain */\r
-#define TCIC_IENA_CFG_LOW      0x02    /* active low, totem pole */\r
-#define TCIC_IENA_CFG_HIGH     0x03    /* active high, totem pole */\r
-#define TCIC_IENA_ILOCK                0x08\r
-#define TCIC_IENA_PROGTIME     0x10\r
-#define TCIC_IENA_ERR          0x20    /* overcurrent or iochk */\r
-#define TCIC_IENA_CDCHG                0x40\r
-\r
-/* Flags for TCIC_AUX_WCTL */\r
-#define TCIC_WAIT_COUNT_MASK   0x001f\r
-#define TCIC_WAIT_ASYNC                0x0020\r
-#define TCIC_WAIT_SENSE                0x0040\r
-#define TCIC_WAIT_SRC          0x0080\r
-#define TCIC_WCTL_WR           0x0100\r
-#define TCIC_WCTL_RD           0x0200\r
-#define TCIC_WCTL_CE           0x0400\r
-#define TCIC_WCTL_LLBAT1       0x0800\r
-#define TCIC_WCTL_LLBAT2       0x1000\r
-#define TCIC_WCTL_LRDY         0x2000\r
-#define TCIC_WCTL_LWP          0x4000\r
-#define TCIC_WCTL_LCD          0x8000\r
-\r
-/* Flags for TCIC_AUX_SYSCFG */\r
-#define TCIC_SYSCFG_IRQ_MASK   0x000f\r
-#define TCIC_SYSCFG_MCSFULL    0x0010\r
-#define TCIC_SYSCFG_IO1723     0x0020\r
-#define TCIC_SYSCFG_MCSXB      0x0040\r
-#define TCIC_SYSCFG_ICSXB      0x0080\r
-#define TCIC_SYSCFG_NOPDN      0x0100\r
-#define TCIC_SYSCFG_MPSEL_SHFT 9\r
-#define TCIC_SYSCFG_MPSEL_MASK 0x0e00\r
-#define TCIC_SYSCFG_MPSENSE    0x2000\r
-#define TCIC_SYSCFG_AUTOBUSY   0x4000\r
-#define TCIC_SYSCFG_ACC                0x8000\r
-\r
-#define TCIC_ILOCK_OUT         0x01\r
-#define TCIC_ILOCK_SENSE       0x02\r
-#define TCIC_ILOCK_CRESET      0x04\r
-#define TCIC_ILOCK_CRESENA     0x08\r
-#define TCIC_ILOCK_CWAIT       0x10\r
-#define TCIC_ILOCK_CWAITSNS    0x20\r
-#define TCIC_ILOCK_HOLD_MASK   0xc0\r
-#define TCIC_ILOCK_HOLD_CCLK   0xc0\r
-\r
-#define TCIC_ILOCKTEST_ID_SH   8\r
-#define TCIC_ILOCKTEST_ID_MASK 0x7f00\r
-#define TCIC_ILOCKTEST_MCIC_1  0x8000\r
-\r
-#define TCIC_ID_DB86082                0x02\r
-#define TCIC_ID_DB86082A       0x03\r
-#define TCIC_ID_DB86084                0x04\r
-#define TCIC_ID_DB86084A       0x08\r
-#define TCIC_ID_DB86072                0x15\r
-#define TCIC_ID_DB86184                0x14\r
-#define TCIC_ID_DB86082B       0x17\r
-\r
-#define TCIC_TEST_DIAG         0x8000\r
-\r
-/*\r
- * Indirectly addressed registers\r
- */\r
-\r
-#define TCIC_SCF1(sock)        ((sock)<<3)\r
-#define TCIC_SCF2(sock) (((sock)<<3)+2)\r
-\r
-/* Flags for SCF1 */\r
-#define TCIC_SCF1_IRQ_MASK     0x000f\r
-#define TCIC_SCF1_IRQ_OFF      0x0000\r
-#define TCIC_SCF1_IRQOC                0x0010\r
-#define TCIC_SCF1_PCVT         0x0020\r
-#define TCIC_SCF1_IRDY         0x0040\r
-#define TCIC_SCF1_ATA          0x0080\r
-#define TCIC_SCF1_DMA_SHIFT    8\r
-#define TCIC_SCF1_DMA_MASK     0x0700\r
-#define TCIC_SCF1_DMA_OFF      0\r
-#define TCIC_SCF1_DREQ2                2\r
-#define TCIC_SCF1_IOSTS                0x0800\r
-#define TCIC_SCF1_SPKR         0x1000\r
-#define TCIC_SCF1_FINPACK      0x2000\r
-#define TCIC_SCF1_DELWR                0x4000\r
-#define TCIC_SCF1_HD7IDE       0x8000\r
-\r
-/* Flags for SCF2 */\r
-#define TCIC_SCF2_RI           0x0001\r
-#define TCIC_SCF2_IDBR         0x0002\r
-#define TCIC_SCF2_MDBR         0x0004\r
-#define TCIC_SCF2_MLBAT1       0x0008\r
-#define TCIC_SCF2_MLBAT2       0x0010\r
-#define TCIC_SCF2_MRDY         0x0020\r
-#define TCIC_SCF2_MWP          0x0040\r
-#define TCIC_SCF2_MCD          0x0080\r
-#define TCIC_SCF2_MALL         0x00f8\r
-\r
-/* Indirect addresses for memory window registers */\r
-#define TCIC_MWIN(sock,map)    (0x100+(((map)+((sock)<<2))<<3))\r
-#define TCIC_MBASE_X           2\r
-#define TCIC_MMAP_X            4\r
-#define TCIC_MCTL_X            6\r
-\r
-#define TCIC_MBASE_4K_BIT      0x4000\r
-#define TCIC_MBASE_HA_SHFT     12\r
-#define TCIC_MBASE_HA_MASK     0x0fff\r
-\r
-#define TCIC_MMAP_REG          0x8000\r
-#define TCIC_MMAP_CA_SHFT      12\r
-#define TCIC_MMAP_CA_MASK      0x3fff\r
-\r
-#define TCIC_MCTL_WSCNT_MASK   0x001f\r
-#define TCIC_MCTL_WCLK         0x0020\r
-#define TCIC_MCTL_WCLK_CCLK    0x0000\r
-#define TCIC_MCTL_WCLK_BCLK    0x0020\r
-#define TCIC_MCTL_QUIET                0x0040\r
-#define TCIC_MCTL_WP           0x0080\r
-#define TCIC_MCTL_ACC          0x0100\r
-#define TCIC_MCTL_KE           0x0200\r
-#define TCIC_MCTL_EDC          0x0400\r
-#define TCIC_MCTL_B8           0x0800\r
-#define TCIC_MCTL_SS_SHFT      TCIC_SS_SHFT\r
-#define TCIC_MCTL_SS_MASK      TCIC_SS_MASK\r
-#define TCIC_MCTL_ENA          0x8000\r
-\r
-/* Indirect addresses for I/O window registers */\r
-#define TCIC_IWIN(sock,map)    (0x200+(((map)+((sock)<<1))<<2))\r
-#define TCIC_IBASE_X           0\r
-#define TCIC_ICTL_X            2\r
-\r
-#define TCIC_ICTL_WSCNT_MASK   TCIC_MCTL_WSCNT_MASK\r
-#define TCIC_ICTL_QUIET                TCIC_MCTL_QUIET\r
-#define TCIC_ICTL_1K           0x0080\r
-#define TCIC_ICTL_PASS16       0x0100\r
-#define TCIC_ICTL_ACC          TCIC_MCTL_ACC\r
-#define TCIC_ICTL_TINY         0x0200\r
-#define TCIC_ICTL_B16          0x0400\r
-#define TCIC_ICTL_B8           TCIC_MCTL_B8\r
-#define TCIC_ICTL_BW_MASK      (TCIC_ICTL_B16|TCIC_ICTL_B8)\r
-#define TCIC_ICTL_BW_DYN       0\r
-#define TCIC_ICTL_BW_8         TCIC_ICTL_B8\r
-#define TCIC_ICTL_BW_16                TCIC_ICTL_B16\r
-#define TCIC_ICTL_BW_ATA       (TCIC_ICTL_B16|TCIC_ICTL_B8)\r
-#define TCIC_ICTL_SS_SHFT      TCIC_SS_SHFT\r
-#define TCIC_ICTL_SS_MASK      TCIC_SS_MASK\r
-#define TCIC_ICTL_ENA          TCIC_MCTL_ENA\r
-\r
-/* register definitions for the Intel 82365SL PCMCIA controller */\r
-\r
-/* Offsets for PCIC registers */\r
-#define I365_IDENT     0x00    /* Identification and revision */\r
-#define I365_STATUS    0x01    /* Interface status */\r
-#define I365_POWER     0x02    /* Power and RESETDRV control */\r
-#define I365_INTCTL    0x03    /* Interrupt and general control */\r
-#define I365_CSC       0x04    /* Card status change */\r
-#define I365_CSCINT    0x05    /* Card status change interrupt control */\r
-#define I365_ADDRWIN   0x06    /* Address window enable */\r
-#define I365_IOCTL     0x07    /* I/O control */\r
-#define I365_GENCTL    0x16    /* Card detect and general control */\r
-#define I365_GBLCTL    0x1E    /* Global control register */\r
-\r
-/* Offsets for I/O and memory window registers */\r
-#define I365_IO(map)   (0x08+((map)<<2))\r
-#define I365_MEM(map)  (0x10+((map)<<3))\r
-#define I365_W_START   0\r
-#define I365_W_STOP    2\r
-#define I365_W_OFF     4\r
-\r
-/* Flags for I365_STATUS */\r
-#define I365_CS_BVD1   0x01\r
-#define I365_CS_STSCHG 0x01\r
-#define I365_CS_BVD2   0x02\r
-#define I365_CS_SPKR   0x02\r
-#define I365_CS_DETECT 0x0C\r
-#define I365_CS_WRPROT 0x10\r
-#define I365_CS_READY  0x20    /* Inverted */\r
-#define I365_CS_POWERON        0x40\r
-#define I365_CS_GPI    0x80\r
-\r
-/* Flags for I365_POWER */\r
-#define I365_PWR_OFF   0x00    /* Turn off the socket */\r
-#define I365_PWR_OUT   0x80    /* Output enable */\r
-#define I365_PWR_NORESET 0x40  /* Disable RESETDRV on resume */\r
-#define I365_PWR_AUTO  0x20    /* Auto pwr switch enable */\r
-#define I365_VCC_MASK  0x18    /* Mask for turning off Vcc */\r
-/* There are different layouts for B-step and DF-step chips: the B\r
-   step has independent Vpp1/Vpp2 control, and the DF step has only\r
-   Vpp1 control, plus 3V control */\r
-#define I365_VCC_5V    0x10    /* Vcc = 5.0v */\r
-#define I365_VCC_3V    0x18    /* Vcc = 3.3v */\r
-#define I365_VPP2_MASK 0x0c    /* Mask for turning off Vpp2 */\r
-#define I365_VPP2_5V   0x04    /* Vpp2 = 5.0v */\r
-#define I365_VPP2_12V  0x08    /* Vpp2 = 12.0v */\r
-#define I365_VPP1_MASK 0x03    /* Mask for turning off Vpp1 */\r
-#define I365_VPP1_5V   0x01    /* Vpp2 = 5.0v */\r
-#define I365_VPP1_12V  0x02    /* Vpp2 = 12.0v */\r
-\r
-/* Flags for I365_INTCTL */\r
-#define I365_RING_ENA  0x80\r
-#define I365_PC_RESET  0x40\r
-#define I365_PC_IOCARD 0x20\r
-#define I365_INTR_ENA  0x10\r
-#define I365_IRQ_MASK  0x0F\r
-\r
-/* Flags for I365_CSC and I365_CSCINT*/\r
-#define I365_CSC_BVD1  0x01\r
-#define I365_CSC_STSCHG        0x01\r
-#define I365_CSC_BVD2  0x02\r
-#define I365_CSC_READY 0x04\r
-#define I365_CSC_DETECT        0x08\r
-#define I365_CSC_ANY   0x0F\r
-#define I365_CSC_GPI   0x10\r
-\r
-/* Flags for I365_ADDRWIN */\r
-#define I365_ADDR_MEMCS16      0x20\r
-#define I365_ENA_IO(map)       (0x40 << (map))\r
-#define I365_ENA_MEM(map)      (0x01 << (map))\r
-\r
-/* Flags for I365_IOCTL */\r
-#define I365_IOCTL_MASK(map)   (0x0F << (map<<2))\r
-#define I365_IOCTL_WAIT(map)   (0x08 << (map<<2))\r
-#define I365_IOCTL_0WS(map)    (0x04 << (map<<2))\r
-#define I365_IOCTL_IOCS16(map) (0x02 << (map<<2))\r
-#define I365_IOCTL_16BIT(map)  (0x01 << (map<<2))\r
-\r
-/* Flags for I365_GENCTL */\r
-#define I365_CTL_16DELAY       0x01\r
-#define I365_CTL_RESET         0x02\r
-#define I365_CTL_GPI_ENA       0x04\r
-#define I365_CTL_GPI_CTL       0x08\r
-#define I365_CTL_RESUME                0x10\r
-#define I365_CTL_SW_IRQ                0x20\r
-\r
-/* Flags for I365_GBLCTL */\r
-#define I365_GBL_PWRDOWN       0x01\r
-#define I365_GBL_CSC_LEV       0x02\r
-#define I365_GBL_WRBACK                0x04\r
-#define I365_GBL_IRQ_0_LEV     0x08\r
-#define I365_GBL_IRQ_1_LEV     0x10\r
-\r
-/* Flags for memory window registers */\r
-#define I365_MEM_16BIT 0x8000  /* In memory start high byte */\r
-#define I365_MEM_0WS   0x4000\r
-#define I365_MEM_WS1   0x8000  /* In memory stop high byte */\r
-#define I365_MEM_WS0   0x4000\r
-#define I365_MEM_WRPROT        0x8000  /* In offset high byte */\r
-#define I365_MEM_REG   0x4000\r
-\r
-#define I365_REG(slot, reg)    (((slot) << 6) | (reg))\r
-\r
-/* Default ISA interrupt mask */\r
-#define I365_ISA_IRQ_MASK      0xdeb8  /* irq's 3-5,7,9-12,14,15 */\r
-\r
-/* Device ID's for PCI-to-PCMCIA bridges */\r
-\r
-#ifndef PCI_VENDOR_ID_INTEL\r
-#define PCI_VENDOR_ID_INTEL            0x8086\r
-#endif\r
-#ifndef PCI_DEVICE_ID_INTEL_82092AA_0\r
-#define PCI_DEVICE_ID_INTEL_82092AA_0  0x1221\r
-#endif\r
-#ifndef PCI_VENDOR_ID_OMEGA\r
-#define PCI_VENDOR_ID_OMEGA            0x119b\r
-#endif\r
-#ifndef PCI_DEVICE_ID_OMEGA_82C092G\r
-#define PCI_DEVICE_ID_OMEGA_82C092G    0x1221\r
-#endif\r
-\r
-#ifndef PCI_VENDOR_ID_CIRRUS\r
-#define PCI_VENDOR_ID_CIRRUS           0x1013\r
-#endif\r
-#ifndef PCI_DEVICE_ID_CIRRUS_6729\r
-#define PCI_DEVICE_ID_CIRRUS_6729      0x1100\r
-#endif\r
-#ifndef PCI_DEVICE_ID_CIRRUS_6832\r
-#define PCI_DEVICE_ID_CIRRUS_6832      0x1110\r
-#endif\r
-\r
-#define PD67_MISC_CTL_1                0x16    /* Misc control 1 */\r
-#define PD67_FIFO_CTL          0x17    /* FIFO control */\r
-#define PD67_MISC_CTL_2                0x1E    /* Misc control 2 */\r
-#define PD67_CHIP_INFO         0x1f    /* Chip information */\r
-#define PD67_ATA_CTL           0x026   /* 6730: ATA control */\r
-#define PD67_EXT_INDEX         0x2e    /* Extension index */\r
-#define PD67_EXT_DATA          0x2f    /* Extension data */\r
-\r
-#define pd67_ext_get(s, r) \\r
-    (i365_set(s, PD67_EXT_INDEX, r), i365_get(s, PD67_EXT_DATA))\r
-#define pd67_ext_set(s, r, v) \\r
-    (i365_set(s, PD67_EXT_INDEX, r), i365_set(s, PD67_EXT_DATA, v))\r
-\r
-/* PD6722 extension registers -- indexed in PD67_EXT_INDEX */\r
-#define PD67_DATA_MASK0                0x01    /* Data mask 0 */\r
-#define PD67_DATA_MASK1                0x02    /* Data mask 1 */\r
-#define PD67_DMA_CTL           0x03    /* DMA control */\r
-\r
-/* PD6730 extension registers -- indexed in PD67_EXT_INDEX */\r
-#define PD67_EXT_CTL_1         0x03    /* Extension control 1 */\r
-#define PD67_MEM_PAGE(n)       ((n)+5) /* PCI window bits 31:24 */\r
-#define PD67_EXTERN_DATA       0x0a\r
-#define PD67_EXT_CTL_2         0x0b\r
-#define PD67_MISC_CTL_3                0x25\r
-#define PD67_SMB_PWR_CTL       0x26\r
-\r
-/* I/O window address offset */\r
-#define PD67_IO_OFF(w)         (0x36+((w)<<1))\r
-\r
-/* Timing register sets */\r
-#define PD67_TIME_SETUP(n)     (0x3a + 3*(n))\r
-#define PD67_TIME_CMD(n)       (0x3b + 3*(n))\r
-#define PD67_TIME_RECOV(n)     (0x3c + 3*(n))\r
-\r
-/* Flags for PD67_MISC_CTL_1 */\r
-#define PD67_MC1_5V_DET                0x01    /* 5v detect */\r
-#define PD67_MC1_MEDIA_ENA     0x01    /* 6730: Multimedia enable */\r
-#define PD67_MC1_VCC_3V                0x02    /* 3.3v Vcc */\r
-#define PD67_MC1_PULSE_MGMT    0x04\r
-#define PD67_MC1_PULSE_IRQ     0x08\r
-#define PD67_MC1_SPKR_ENA      0x10\r
-#define PD67_MC1_INPACK_ENA    0x80\r
-\r
-/* Flags for PD67_FIFO_CTL */\r
-#define PD67_FIFO_EMPTY                0x80\r
-\r
-/* Flags for PD67_MISC_CTL_2 */\r
-#define PD67_MC2_FREQ_BYPASS   0x01\r
-#define PD67_MC2_DYNAMIC_MODE  0x02\r
-#define PD67_MC2_SUSPEND       0x04\r
-#define PD67_MC2_5V_CORE       0x08\r
-#define PD67_MC2_LED_ENA       0x10    /* IRQ 12 is LED enable */\r
-#define PD67_MC2_FAST_PCI      0x10    /* 6729: PCI bus > 25 MHz */\r
-#define PD67_MC2_3STATE_BIT7   0x20    /* Floppy change bit */\r
-#define PD67_MC2_DMA_MODE      0x40\r
-#define PD67_MC2_IRQ15_RI      0x80    /* IRQ 15 is ring enable */\r
-\r
-/* Flags for PD67_CHIP_INFO */\r
-#define PD67_INFO_SLOTS                0x20    /* 0 = 1 slot, 1 = 2 slots */\r
-#define PD67_INFO_CHIP_ID      0xc0\r
-#define PD67_INFO_REV          0x1c\r
-\r
-/* Fields in PD67_TIME_* registers */\r
-#define PD67_TIME_SCALE                0xc0\r
-#define PD67_TIME_SCALE_1      0x00\r
-#define PD67_TIME_SCALE_16     0x40\r
-#define PD67_TIME_SCALE_256    0x80\r
-#define PD67_TIME_SCALE_4096   0xc0\r
-#define PD67_TIME_MULT         0x3f\r
-\r
-/* Fields in PD67_DMA_CTL */\r
-#define PD67_DMA_MODE          0xc0\r
-#define PD67_DMA_OFF           0x00\r
-#define PD67_DMA_DREQ_INPACK   0x40\r
-#define PD67_DMA_DREQ_WP       0x80\r
-#define PD67_DMA_DREQ_BVD2     0xc0\r
-#define PD67_DMA_PULLUP                0x20    /* Disable socket pullups? */\r
-\r
-/* Fields in PD67_EXT_CTL_1 */\r
-#define PD67_EC1_VCC_PWR_LOCK  0x01\r
-#define PD67_EC1_AUTO_PWR_CLEAR        0x02\r
-#define PD67_EC1_LED_ENA       0x04\r
-#define PD67_EC1_INV_CARD_IRQ  0x08\r
-#define PD67_EC1_INV_MGMT_IRQ  0x10\r
-#define PD67_EC1_PULLUP_CTL    0x20\r
-\r
-/* Fields in PD67_EXTERN_DATA */\r
-#define PD67_EXD_VS1(s)                (0x01 << ((s)<<1))\r
-#define PD67_EXD_VS2(s)                (0x02 << ((s)<<1))\r
-\r
-/* Fields in PD67_EXT_CTL_2 */\r
-#define PD67_EC2_GPSTB_TOTEM   0x04\r
-#define PD67_EC2_GPSTB_IOR     0x08\r
-#define PD67_EC2_GPSTB_IOW     0x10\r
-#define PD67_EC2_GPSTB_HIGH    0x20\r
-\r
-/* Fields in PD67_MISC_CTL_3 */\r
-#define PD67_MC3_IRQ_MASK      0x03\r
-#define PD67_MC3_IRQ_PCPCI     0x00\r
-#define PD67_MC3_IRQ_EXTERN    0x01\r
-#define PD67_MC3_IRQ_PCIWAY    0x02\r
-#define PD67_MC3_IRQ_PCI       0x03\r
-#define PD67_MC3_PWR_MASK      0x0c\r
-#define PD67_MC3_PWR_SERIAL    0x00\r
-#define PD67_MC3_PWR_TI2202    0x08\r
-#define PD67_MC3_PWR_SMB       0x0c\r
-\r
-/* Register definitions for Cirrus PD6832 PCI-to-CardBus bridge */\r
-\r
-/* PD6832 extension registers -- indexed in PD67_EXT_INDEX */\r
-#define PD68_PCI_SPACE                 0x22\r
-#define PD68_PCCARD_SPACE              0x23\r
-#define PD68_WINDOW_TYPE               0x24\r
-#define PD68_EXT_CSC                   0x2e\r
-#define PD68_MISC_CTL_4                        0x2f\r
-#define PD68_MISC_CTL_5                        0x30\r
-#define PD68_MISC_CTL_6                        0x31\r
-\r
-/* Extra flags in PD67_MISC_CTL_3 */\r
-#define PD68_MC3_HW_SUSP               0x10\r
-#define PD68_MC3_MM_EXPAND             0x40\r
-#define PD68_MC3_MM_ARM                        0x80\r
-\r
-/* Bridge Control Register */\r
-#define  PD6832_BCR_MGMT_IRQ_ENA       0x0800\r
-\r
-/* Socket Number Register */\r
-#define PD6832_SOCKET_NUMBER           0x004c  /* 8 bit */\r
-\r
-/* Data structure for tracking vendor-specific state */\r
-typedef struct cirrus_state_t {\r
-    u_char             misc1;          /* PD67_MISC_CTL_1 */\r
-    u_char             misc2;          /* PD67_MISC_CTL_2 */\r
-    u_char             ectl1;          /* PD67_EXT_CTL_1 */\r
-    u_char             timer[6];       /* PD67_TIME_* */\r
-} cirrus_state_t;\r
-\r
-#define CIRRUS_PCIC_ID \\r
-    IS_PD6729, IS_PD6730, IS_PD6832\r
-\r
-#define CIRRUS_PCIC_INFO \\r
-    { "Cirrus PD6729", IS_CIRRUS|IS_PCI, ID(CIRRUS, 6729) },           \\r
-    { "Cirrus PD6730", IS_CIRRUS|IS_PCI, PCI_VENDOR_ID_CIRRUS, -1 },   \\r
-    { "Cirrus PD6832", IS_CIRRUS|IS_CARDBUS, ID(CIRRUS, 6832) }\r
-\r
-/* Special bit in I365_IDENT used for Vadem chip detection */\r
-#define I365_IDENT_VADEM       0x08\r
-\r
-/* Special definitions in I365_POWER */\r
-#define VG468_VPP2_MASK                0x0c\r
-#define VG468_VPP2_5V          0x04\r
-#define VG468_VPP2_12V         0x08\r
-\r
-/* Unique Vadem registers */\r
-#define VG469_VSENSE           0x1f    /* Card voltage sense */\r
-#define VG469_VSELECT          0x2f    /* Card voltage select */\r
-#define VG468_CTL              0x38    /* Control register */\r
-#define VG468_TIMER            0x39    /* Timer control */\r
-#define VG468_MISC             0x3a    /* Miscellaneous */\r
-#define VG468_GPIO_CFG         0x3b    /* GPIO configuration */\r
-#define VG469_EXT_MODE         0x3c    /* Extended mode register */\r
-#define VG468_SELECT           0x3d    /* Programmable chip select */\r
-#define VG468_SELECT_CFG       0x3e    /* Chip select configuration */\r
-#define VG468_ATA              0x3f    /* ATA control */\r
-\r
-/* Flags for VG469_VSENSE */\r
-#define VG469_VSENSE_A_VS1     0x01\r
-#define VG469_VSENSE_A_VS2     0x02\r
-#define VG469_VSENSE_B_VS1     0x04\r
-#define VG469_VSENSE_B_VS2     0x08\r
-\r
-/* Flags for VG469_VSELECT */\r
-#define VG469_VSEL_VCC         0x03\r
-#define VG469_VSEL_5V          0x00\r
-#define VG469_VSEL_3V          0x03\r
-#define VG469_VSEL_MAX         0x0c\r
-#define VG469_VSEL_EXT_STAT    0x10\r
-#define VG469_VSEL_EXT_BUS     0x20\r
-#define VG469_VSEL_MIXED       0x40\r
-#define VG469_VSEL_ISA         0x80\r
-\r
-/* Flags for VG468_CTL */\r
-#define VG468_CTL_SLOW         0x01    /* 600ns memory timing */\r
-#define VG468_CTL_ASYNC                0x02    /* Asynchronous bus clocking */\r
-#define VG468_CTL_TSSI         0x08    /* Tri-state some outputs */\r
-#define VG468_CTL_DELAY                0x10    /* Card detect debounce */\r
-#define VG468_CTL_INPACK       0x20    /* Obey INPACK signal? */\r
-#define VG468_CTL_POLARITY     0x40    /* VCCEN polarity */\r
-#define VG468_CTL_COMPAT       0x80    /* Compatibility stuff */\r
-\r
-#define VG469_CTL_WS_COMPAT    0x04    /* Wait state compatibility */\r
-#define VG469_CTL_STRETCH      0x10    /* LED stretch */\r
-\r
-/* Flags for VG468_TIMER */\r
-#define VG468_TIMER_ZEROPWR    0x10    /* Zero power control */\r
-#define VG468_TIMER_SIGEN      0x20    /* Power up */\r
-#define VG468_TIMER_STATUS     0x40    /* Activity timer status */\r
-#define VG468_TIMER_RES                0x80    /* Timer resolution */\r
-#define VG468_TIMER_MASK       0x0f    /* Activity timer timeout */\r
-\r
-/* Flags for VG468_MISC */\r
-#define VG468_MISC_GPIO                0x04    /* General-purpose IO */\r
-#define VG468_MISC_DMAWSB      0x08    /* DMA wait state control */\r
-#define VG469_MISC_LEDENA      0x10    /* LED enable */\r
-#define VG468_MISC_VADEMREV    0x40    /* Vadem revision control */\r
-#define VG468_MISC_UNLOCK      0x80    /* Unique register lock */\r
-\r
-/* Flags for VG469_EXT_MODE_A */\r
-#define VG469_MODE_VPPST       0x03    /* Vpp steering control */\r
-#define VG469_MODE_INT_SENSE   0x04    /* Internal voltage sense */\r
-#define VG469_MODE_CABLE       0x08\r
-#define VG469_MODE_COMPAT      0x10    /* i82365sl B or DF step */\r
-#define VG469_MODE_TEST                0x20\r
-#define VG469_MODE_RIO         0x40    /* Steer RIO to INTR? */\r
-\r
-/* Flags for VG469_EXT_MODE_B */\r
-#define VG469_MODE_B_3V                0x01    /* 3.3v for socket B */\r
-\r
-/* Data structure for tracking vendor-specific state */\r
-typedef struct vg46x_state_t {\r
-    u_char             ctl;            /* VG468_CTL */\r
-    u_char             ema;            /* VG468_EXT_MODE_A */\r
-} vg46x_state_t;\r
+/*
+ * PCMCIA bridge device probe
+ *
+ * This file is part of the IPCop Firewall.
+ *
+ * IPCop is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * IPCop is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with IPCop; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ * The initial developer of the original code is David A. Hinds
+ * <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
+ * are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
+ *
+ * $Id: pcmcia.h,v 1.1 2004/01/25 09:34:59 riddles Exp $
+ *
+ */
+
+#define TCIC_BASE              0x240
+
+/* offsets of registers from TCIC_BASE */
+#define TCIC_DATA              0x00
+#define TCIC_ADDR              0x02
+#define TCIC_SCTRL             0x06
+#define TCIC_SSTAT             0x07
+#define TCIC_MODE              0x08
+#define TCIC_PWR               0x09
+#define TCIC_EDC               0x0A
+#define TCIC_ICSR              0x0C
+#define TCIC_IENA              0x0D
+#define TCIC_AUX               0x0E
+
+#define TCIC_SS_SHFT           12
+#define TCIC_SS_MASK           0x7000
+
+/* Flags for TCIC_ADDR */
+#define TCIC_ADR2_REG          0x8000
+#define TCIC_ADR2_INDREG       0x0800
+
+#define TCIC_ADDR_REG          0x80000000
+#define TCIC_ADDR_SS_SHFT      (TCIC_SS_SHFT+16)
+#define TCIC_ADDR_SS_MASK      (TCIC_SS_MASK<<16)
+#define TCIC_ADDR_INDREG       0x08000000
+#define TCIC_ADDR_IO           0x04000000
+#define TCIC_ADDR_MASK         0x03ffffff
+
+/* Flags for TCIC_SCTRL */
+#define TCIC_SCTRL_ENA         0x01
+#define TCIC_SCTRL_INCMODE     0x18
+#define TCIC_SCTRL_INCMODE_HOLD        0x00
+#define TCIC_SCTRL_INCMODE_WORD        0x08
+#define TCIC_SCTRL_INCMODE_REG 0x10
+#define TCIC_SCTRL_INCMODE_AUTO        0x18
+#define TCIC_SCTRL_EDCSUM      0x20
+#define TCIC_SCTRL_RESET       0x80
+
+/* Flags for TCIC_SSTAT */
+#define TCIC_SSTAT_6US         0x01
+#define TCIC_SSTAT_10US                0x02
+#define TCIC_SSTAT_PROGTIME    0x04
+#define TCIC_SSTAT_LBAT1       0x08
+#define TCIC_SSTAT_LBAT2       0x10
+#define TCIC_SSTAT_RDY         0x20    /* Inverted */
+#define TCIC_SSTAT_WP          0x40
+#define TCIC_SSTAT_CD          0x80    /* Card detect */
+
+/* Flags for TCIC_MODE */
+#define TCIC_MODE_PGMMASK      0x1f
+#define TCIC_MODE_NORMAL       0x00
+#define TCIC_MODE_PGMWR                0x01
+#define TCIC_MODE_PGMRD                0x02
+#define TCIC_MODE_PGMCE                0x04
+#define TCIC_MODE_PGMDBW       0x08
+#define TCIC_MODE_PGMWORD      0x10
+#define TCIC_MODE_AUXSEL_MASK  0xe0
+
+/* Registers accessed through TCIC_AUX, by setting TCIC_MODE */
+#define TCIC_AUX_TCTL          (0<<5)
+#define TCIC_AUX_PCTL          (1<<5)
+#define TCIC_AUX_WCTL          (2<<5)
+#define TCIC_AUX_EXTERN                (3<<5)
+#define TCIC_AUX_PDATA         (4<<5)
+#define TCIC_AUX_SYSCFG                (5<<5)
+#define TCIC_AUX_ILOCK         (6<<5)
+#define TCIC_AUX_TEST          (7<<5)
+
+/* Flags for TCIC_PWR */
+#define TCIC_PWR_VCC(sock)     (0x01<<(sock))
+#define TCIC_PWR_VCC_MASK      0x03
+#define TCIC_PWR_VPP(sock)     (0x08<<(sock))
+#define TCIC_PWR_VPP_MASK      0x18
+#define TCIC_PWR_CLIMENA       0x40
+#define TCIC_PWR_CLIMSTAT      0x80
+
+/* Flags for TCIC_ICSR */
+#define TCIC_ICSR_CLEAR                0x01
+#define TCIC_ICSR_SET          0x02
+#define TCIC_ICSR_JAM          (TCIC_ICSR_CLEAR|TCIC_ICSR_SET)
+#define TCIC_ICSR_STOPCPU      0x04
+#define TCIC_ICSR_ILOCK                0x08
+#define TCIC_ICSR_PROGTIME     0x10
+#define TCIC_ICSR_ERR          0x20
+#define TCIC_ICSR_CDCHG                0x40
+#define TCIC_ICSR_IOCHK                0x80
+
+/* Flags for TCIC_IENA */
+#define TCIC_IENA_CFG_MASK     0x03
+#define TCIC_IENA_CFG_OFF      0x00    /* disabled */
+#define TCIC_IENA_CFG_OD       0x01    /* active low, open drain */
+#define TCIC_IENA_CFG_LOW      0x02    /* active low, totem pole */
+#define TCIC_IENA_CFG_HIGH     0x03    /* active high, totem pole */
+#define TCIC_IENA_ILOCK                0x08
+#define TCIC_IENA_PROGTIME     0x10
+#define TCIC_IENA_ERR          0x20    /* overcurrent or iochk */
+#define TCIC_IENA_CDCHG                0x40
+
+/* Flags for TCIC_AUX_WCTL */
+#define TCIC_WAIT_COUNT_MASK   0x001f
+#define TCIC_WAIT_ASYNC                0x0020
+#define TCIC_WAIT_SENSE                0x0040
+#define TCIC_WAIT_SRC          0x0080
+#define TCIC_WCTL_WR           0x0100
+#define TCIC_WCTL_RD           0x0200
+#define TCIC_WCTL_CE           0x0400
+#define TCIC_WCTL_LLBAT1       0x0800
+#define TCIC_WCTL_LLBAT2       0x1000
+#define TCIC_WCTL_LRDY         0x2000
+#define TCIC_WCTL_LWP          0x4000
+#define TCIC_WCTL_LCD          0x8000
+
+/* Flags for TCIC_AUX_SYSCFG */
+#define TCIC_SYSCFG_IRQ_MASK   0x000f
+#define TCIC_SYSCFG_MCSFULL    0x0010
+#define TCIC_SYSCFG_IO1723     0x0020
+#define TCIC_SYSCFG_MCSXB      0x0040
+#define TCIC_SYSCFG_ICSXB      0x0080
+#define TCIC_SYSCFG_NOPDN      0x0100
+#define TCIC_SYSCFG_MPSEL_SHFT 9
+#define TCIC_SYSCFG_MPSEL_MASK 0x0e00
+#define TCIC_SYSCFG_MPSENSE    0x2000
+#define TCIC_SYSCFG_AUTOBUSY   0x4000
+#define TCIC_SYSCFG_ACC                0x8000
+
+#define TCIC_ILOCK_OUT         0x01
+#define TCIC_ILOCK_SENSE       0x02
+#define TCIC_ILOCK_CRESET      0x04
+#define TCIC_ILOCK_CRESENA     0x08
+#define TCIC_ILOCK_CWAIT       0x10
+#define TCIC_ILOCK_CWAITSNS    0x20
+#define TCIC_ILOCK_HOLD_MASK   0xc0
+#define TCIC_ILOCK_HOLD_CCLK   0xc0
+
+#define TCIC_ILOCKTEST_ID_SH   8
+#define TCIC_ILOCKTEST_ID_MASK 0x7f00
+#define TCIC_ILOCKTEST_MCIC_1  0x8000
+
+#define TCIC_ID_DB86082                0x02
+#define TCIC_ID_DB86082A       0x03
+#define TCIC_ID_DB86084                0x04
+#define TCIC_ID_DB86084A       0x08
+#define TCIC_ID_DB86072                0x15
+#define TCIC_ID_DB86184                0x14
+#define TCIC_ID_DB86082B       0x17
+
+#define TCIC_TEST_DIAG         0x8000
+
+/*
+ * Indirectly addressed registers
+ */
+
+#define TCIC_SCF1(sock)        ((sock)<<3)
+#define TCIC_SCF2(sock) (((sock)<<3)+2)
+
+/* Flags for SCF1 */
+#define TCIC_SCF1_IRQ_MASK     0x000f
+#define TCIC_SCF1_IRQ_OFF      0x0000
+#define TCIC_SCF1_IRQOC                0x0010
+#define TCIC_SCF1_PCVT         0x0020
+#define TCIC_SCF1_IRDY         0x0040
+#define TCIC_SCF1_ATA          0x0080
+#define TCIC_SCF1_DMA_SHIFT    8
+#define TCIC_SCF1_DMA_MASK     0x0700
+#define TCIC_SCF1_DMA_OFF      0
+#define TCIC_SCF1_DREQ2                2
+#define TCIC_SCF1_IOSTS                0x0800
+#define TCIC_SCF1_SPKR         0x1000
+#define TCIC_SCF1_FINPACK      0x2000
+#define TCIC_SCF1_DELWR                0x4000
+#define TCIC_SCF1_HD7IDE       0x8000
+
+/* Flags for SCF2 */
+#define TCIC_SCF2_RI           0x0001
+#define TCIC_SCF2_IDBR         0x0002
+#define TCIC_SCF2_MDBR         0x0004
+#define TCIC_SCF2_MLBAT1       0x0008
+#define TCIC_SCF2_MLBAT2       0x0010
+#define TCIC_SCF2_MRDY         0x0020
+#define TCIC_SCF2_MWP          0x0040
+#define TCIC_SCF2_MCD          0x0080
+#define TCIC_SCF2_MALL         0x00f8
+
+/* Indirect addresses for memory window registers */
+#define TCIC_MWIN(sock,map)    (0x100+(((map)+((sock)<<2))<<3))
+#define TCIC_MBASE_X           2
+#define TCIC_MMAP_X            4
+#define TCIC_MCTL_X            6
+
+#define TCIC_MBASE_4K_BIT      0x4000
+#define TCIC_MBASE_HA_SHFT     12
+#define TCIC_MBASE_HA_MASK     0x0fff
+
+#define TCIC_MMAP_REG          0x8000
+#define TCIC_MMAP_CA_SHFT      12
+#define TCIC_MMAP_CA_MASK      0x3fff
+
+#define TCIC_MCTL_WSCNT_MASK   0x001f
+#define TCIC_MCTL_WCLK         0x0020
+#define TCIC_MCTL_WCLK_CCLK    0x0000
+#define TCIC_MCTL_WCLK_BCLK    0x0020
+#define TCIC_MCTL_QUIET                0x0040
+#define TCIC_MCTL_WP           0x0080
+#define TCIC_MCTL_ACC          0x0100
+#define TCIC_MCTL_KE           0x0200
+#define TCIC_MCTL_EDC          0x0400
+#define TCIC_MCTL_B8           0x0800
+#define TCIC_MCTL_SS_SHFT      TCIC_SS_SHFT
+#define TCIC_MCTL_SS_MASK      TCIC_SS_MASK
+#define TCIC_MCTL_ENA          0x8000
+
+/* Indirect addresses for I/O window registers */
+#define TCIC_IWIN(sock,map)    (0x200+(((map)+((sock)<<1))<<2))
+#define TCIC_IBASE_X           0
+#define TCIC_ICTL_X            2
+
+#define TCIC_ICTL_WSCNT_MASK   TCIC_MCTL_WSCNT_MASK
+#define TCIC_ICTL_QUIET                TCIC_MCTL_QUIET
+#define TCIC_ICTL_1K           0x0080
+#define TCIC_ICTL_PASS16       0x0100
+#define TCIC_ICTL_ACC          TCIC_MCTL_ACC
+#define TCIC_ICTL_TINY         0x0200
+#define TCIC_ICTL_B16          0x0400
+#define TCIC_ICTL_B8           TCIC_MCTL_B8
+#define TCIC_ICTL_BW_MASK      (TCIC_ICTL_B16|TCIC_ICTL_B8)
+#define TCIC_ICTL_BW_DYN       0
+#define TCIC_ICTL_BW_8         TCIC_ICTL_B8
+#define TCIC_ICTL_BW_16                TCIC_ICTL_B16
+#define TCIC_ICTL_BW_ATA       (TCIC_ICTL_B16|TCIC_ICTL_B8)
+#define TCIC_ICTL_SS_SHFT      TCIC_SS_SHFT
+#define TCIC_ICTL_SS_MASK      TCIC_SS_MASK
+#define TCIC_ICTL_ENA          TCIC_MCTL_ENA
+
+/* register definitions for the Intel 82365SL PCMCIA controller */
+
+/* Offsets for PCIC registers */
+#define I365_IDENT     0x00    /* Identification and revision */
+#define I365_STATUS    0x01    /* Interface status */
+#define I365_POWER     0x02    /* Power and RESETDRV control */
+#define I365_INTCTL    0x03    /* Interrupt and general control */
+#define I365_CSC       0x04    /* Card status change */
+#define I365_CSCINT    0x05    /* Card status change interrupt control */
+#define I365_ADDRWIN   0x06    /* Address window enable */
+#define I365_IOCTL     0x07    /* I/O control */
+#define I365_GENCTL    0x16    /* Card detect and general control */
+#define I365_GBLCTL    0x1E    /* Global control register */
+
+/* Offsets for I/O and memory window registers */
+#define I365_IO(map)   (0x08+((map)<<2))
+#define I365_MEM(map)  (0x10+((map)<<3))
+#define I365_W_START   0
+#define I365_W_STOP    2
+#define I365_W_OFF     4
+
+/* Flags for I365_STATUS */
+#define I365_CS_BVD1   0x01
+#define I365_CS_STSCHG 0x01
+#define I365_CS_BVD2   0x02
+#define I365_CS_SPKR   0x02
+#define I365_CS_DETECT 0x0C
+#define I365_CS_WRPROT 0x10
+#define I365_CS_READY  0x20    /* Inverted */
+#define I365_CS_POWERON        0x40
+#define I365_CS_GPI    0x80
+
+/* Flags for I365_POWER */
+#define I365_PWR_OFF   0x00    /* Turn off the socket */
+#define I365_PWR_OUT   0x80    /* Output enable */
+#define I365_PWR_NORESET 0x40  /* Disable RESETDRV on resume */
+#define I365_PWR_AUTO  0x20    /* Auto pwr switch enable */
+#define I365_VCC_MASK  0x18    /* Mask for turning off Vcc */
+/* There are different layouts for B-step and DF-step chips: the B
+   step has independent Vpp1/Vpp2 control, and the DF step has only
+   Vpp1 control, plus 3V control */
+#define I365_VCC_5V    0x10    /* Vcc = 5.0v */
+#define I365_VCC_3V    0x18    /* Vcc = 3.3v */
+#define I365_VPP2_MASK 0x0c    /* Mask for turning off Vpp2 */
+#define I365_VPP2_5V   0x04    /* Vpp2 = 5.0v */
+#define I365_VPP2_12V  0x08    /* Vpp2 = 12.0v */
+#define I365_VPP1_MASK 0x03    /* Mask for turning off Vpp1 */
+#define I365_VPP1_5V   0x01    /* Vpp2 = 5.0v */
+#define I365_VPP1_12V  0x02    /* Vpp2 = 12.0v */
+
+/* Flags for I365_INTCTL */
+#define I365_RING_ENA  0x80
+#define I365_PC_RESET  0x40
+#define I365_PC_IOCARD 0x20
+#define I365_INTR_ENA  0x10
+#define I365_IRQ_MASK  0x0F
+
+/* Flags for I365_CSC and I365_CSCINT*/
+#define I365_CSC_BVD1  0x01
+#define I365_CSC_STSCHG        0x01
+#define I365_CSC_BVD2  0x02
+#define I365_CSC_READY 0x04
+#define I365_CSC_DETECT        0x08
+#define I365_CSC_ANY   0x0F
+#define I365_CSC_GPI   0x10
+
+/* Flags for I365_ADDRWIN */
+#define I365_ADDR_MEMCS16      0x20
+#define I365_ENA_IO(map)       (0x40 << (map))
+#define I365_ENA_MEM(map)      (0x01 << (map))
+
+/* Flags for I365_IOCTL */
+#define I365_IOCTL_MASK(map)   (0x0F << (map<<2))
+#define I365_IOCTL_WAIT(map)   (0x08 << (map<<2))
+#define I365_IOCTL_0WS(map)    (0x04 << (map<<2))
+#define I365_IOCTL_IOCS16(map) (0x02 << (map<<2))
+#define I365_IOCTL_16BIT(map)  (0x01 << (map<<2))
+
+/* Flags for I365_GENCTL */
+#define I365_CTL_16DELAY       0x01
+#define I365_CTL_RESET         0x02
+#define I365_CTL_GPI_ENA       0x04
+#define I365_CTL_GPI_CTL       0x08
+#define I365_CTL_RESUME                0x10
+#define I365_CTL_SW_IRQ                0x20
+
+/* Flags for I365_GBLCTL */
+#define I365_GBL_PWRDOWN       0x01
+#define I365_GBL_CSC_LEV       0x02
+#define I365_GBL_WRBACK                0x04
+#define I365_GBL_IRQ_0_LEV     0x08
+#define I365_GBL_IRQ_1_LEV     0x10
+
+/* Flags for memory window registers */
+#define I365_MEM_16BIT 0x8000  /* In memory start high byte */
+#define I365_MEM_0WS   0x4000
+#define I365_MEM_WS1   0x8000  /* In memory stop high byte */
+#define I365_MEM_WS0   0x4000
+#define I365_MEM_WRPROT        0x8000  /* In offset high byte */
+#define I365_MEM_REG   0x4000
+
+#define I365_REG(slot, reg)    (((slot) << 6) | (reg))
+
+/* Default ISA interrupt mask */
+#define I365_ISA_IRQ_MASK      0xdeb8  /* irq's 3-5,7,9-12,14,15 */
+
+/* Device ID's for PCI-to-PCMCIA bridges */
+
+#ifndef PCI_VENDOR_ID_INTEL
+#define PCI_VENDOR_ID_INTEL            0x8086
+#endif
+#ifndef PCI_DEVICE_ID_INTEL_82092AA_0
+#define PCI_DEVICE_ID_INTEL_82092AA_0  0x1221
+#endif
+#ifndef PCI_VENDOR_ID_OMEGA
+#define PCI_VENDOR_ID_OMEGA            0x119b
+#endif
+#ifndef PCI_DEVICE_ID_OMEGA_82C092G
+#define PCI_DEVICE_ID_OMEGA_82C092G    0x1221
+#endif
+
+#ifndef PCI_VENDOR_ID_CIRRUS
+#define PCI_VENDOR_ID_CIRRUS           0x1013
+#endif
+#ifndef PCI_DEVICE_ID_CIRRUS_6729
+#define PCI_DEVICE_ID_CIRRUS_6729      0x1100
+#endif
+#ifndef PCI_DEVICE_ID_CIRRUS_6832
+#define PCI_DEVICE_ID_CIRRUS_6832      0x1110
+#endif
+
+#define PD67_MISC_CTL_1                0x16    /* Misc control 1 */
+#define PD67_FIFO_CTL          0x17    /* FIFO control */
+#define PD67_MISC_CTL_2                0x1E    /* Misc control 2 */
+#define PD67_CHIP_INFO         0x1f    /* Chip information */
+#define PD67_ATA_CTL           0x026   /* 6730: ATA control */
+#define PD67_EXT_INDEX         0x2e    /* Extension index */
+#define PD67_EXT_DATA          0x2f    /* Extension data */
+
+#define pd67_ext_get(s, r) \
+    (i365_set(s, PD67_EXT_INDEX, r), i365_get(s, PD67_EXT_DATA))
+#define pd67_ext_set(s, r, v) \
+    (i365_set(s, PD67_EXT_INDEX, r), i365_set(s, PD67_EXT_DATA, v))
+
+/* PD6722 extension registers -- indexed in PD67_EXT_INDEX */
+#define PD67_DATA_MASK0                0x01    /* Data mask 0 */
+#define PD67_DATA_MASK1                0x02    /* Data mask 1 */
+#define PD67_DMA_CTL           0x03    /* DMA control */
+
+/* PD6730 extension registers -- indexed in PD67_EXT_INDEX */
+#define PD67_EXT_CTL_1         0x03    /* Extension control 1 */
+#define PD67_MEM_PAGE(n)       ((n)+5) /* PCI window bits 31:24 */
+#define PD67_EXTERN_DATA       0x0a
+#define PD67_EXT_CTL_2         0x0b
+#define PD67_MISC_CTL_3                0x25
+#define PD67_SMB_PWR_CTL       0x26
+
+/* I/O window address offset */
+#define PD67_IO_OFF(w)         (0x36+((w)<<1))
+
+/* Timing register sets */
+#define PD67_TIME_SETUP(n)     (0x3a + 3*(n))
+#define PD67_TIME_CMD(n)       (0x3b + 3*(n))
+#define PD67_TIME_RECOV(n)     (0x3c + 3*(n))
+
+/* Flags for PD67_MISC_CTL_1 */
+#define PD67_MC1_5V_DET                0x01    /* 5v detect */
+#define PD67_MC1_MEDIA_ENA     0x01    /* 6730: Multimedia enable */
+#define PD67_MC1_VCC_3V                0x02    /* 3.3v Vcc */
+#define PD67_MC1_PULSE_MGMT    0x04
+#define PD67_MC1_PULSE_IRQ     0x08
+#define PD67_MC1_SPKR_ENA      0x10
+#define PD67_MC1_INPACK_ENA    0x80
+
+/* Flags for PD67_FIFO_CTL */
+#define PD67_FIFO_EMPTY                0x80
+
+/* Flags for PD67_MISC_CTL_2 */
+#define PD67_MC2_FREQ_BYPASS   0x01
+#define PD67_MC2_DYNAMIC_MODE  0x02
+#define PD67_MC2_SUSPEND       0x04
+#define PD67_MC2_5V_CORE       0x08
+#define PD67_MC2_LED_ENA       0x10    /* IRQ 12 is LED enable */
+#define PD67_MC2_FAST_PCI      0x10    /* 6729: PCI bus > 25 MHz */
+#define PD67_MC2_3STATE_BIT7   0x20    /* Floppy change bit */
+#define PD67_MC2_DMA_MODE      0x40
+#define PD67_MC2_IRQ15_RI      0x80    /* IRQ 15 is ring enable */
+
+/* Flags for PD67_CHIP_INFO */
+#define PD67_INFO_SLOTS                0x20    /* 0 = 1 slot, 1 = 2 slots */
+#define PD67_INFO_CHIP_ID      0xc0
+#define PD67_INFO_REV          0x1c
+
+/* Fields in PD67_TIME_* registers */
+#define PD67_TIME_SCALE                0xc0
+#define PD67_TIME_SCALE_1      0x00
+#define PD67_TIME_SCALE_16     0x40
+#define PD67_TIME_SCALE_256    0x80
+#define PD67_TIME_SCALE_4096   0xc0
+#define PD67_TIME_MULT         0x3f
+
+/* Fields in PD67_DMA_CTL */
+#define PD67_DMA_MODE          0xc0
+#define PD67_DMA_OFF           0x00
+#define PD67_DMA_DREQ_INPACK   0x40
+#define PD67_DMA_DREQ_WP       0x80
+#define PD67_DMA_DREQ_BVD2     0xc0
+#define PD67_DMA_PULLUP                0x20    /* Disable socket pullups? */
+
+/* Fields in PD67_EXT_CTL_1 */
+#define PD67_EC1_VCC_PWR_LOCK  0x01
+#define PD67_EC1_AUTO_PWR_CLEAR        0x02
+#define PD67_EC1_LED_ENA       0x04
+#define PD67_EC1_INV_CARD_IRQ  0x08
+#define PD67_EC1_INV_MGMT_IRQ  0x10
+#define PD67_EC1_PULLUP_CTL    0x20
+
+/* Fields in PD67_EXTERN_DATA */
+#define PD67_EXD_VS1(s)                (0x01 << ((s)<<1))
+#define PD67_EXD_VS2(s)                (0x02 << ((s)<<1))
+
+/* Fields in PD67_EXT_CTL_2 */
+#define PD67_EC2_GPSTB_TOTEM   0x04
+#define PD67_EC2_GPSTB_IOR     0x08
+#define PD67_EC2_GPSTB_IOW     0x10
+#define PD67_EC2_GPSTB_HIGH    0x20
+
+/* Fields in PD67_MISC_CTL_3 */
+#define PD67_MC3_IRQ_MASK      0x03
+#define PD67_MC3_IRQ_PCPCI     0x00
+#define PD67_MC3_IRQ_EXTERN    0x01
+#define PD67_MC3_IRQ_PCIWAY    0x02
+#define PD67_MC3_IRQ_PCI       0x03
+#define PD67_MC3_PWR_MASK      0x0c
+#define PD67_MC3_PWR_SERIAL    0x00
+#define PD67_MC3_PWR_TI2202    0x08
+#define PD67_MC3_PWR_SMB       0x0c
+
+/* Register definitions for Cirrus PD6832 PCI-to-CardBus bridge */
+
+/* PD6832 extension registers -- indexed in PD67_EXT_INDEX */
+#define PD68_PCI_SPACE                 0x22
+#define PD68_PCCARD_SPACE              0x23
+#define PD68_WINDOW_TYPE               0x24
+#define PD68_EXT_CSC                   0x2e
+#define PD68_MISC_CTL_4                        0x2f
+#define PD68_MISC_CTL_5                        0x30
+#define PD68_MISC_CTL_6                        0x31
+
+/* Extra flags in PD67_MISC_CTL_3 */
+#define PD68_MC3_HW_SUSP               0x10
+#define PD68_MC3_MM_EXPAND             0x40
+#define PD68_MC3_MM_ARM                        0x80
+
+/* Bridge Control Register */
+#define  PD6832_BCR_MGMT_IRQ_ENA       0x0800
+
+/* Socket Number Register */
+#define PD6832_SOCKET_NUMBER           0x004c  /* 8 bit */
+
+/* Data structure for tracking vendor-specific state */
+typedef struct cirrus_state_t {
+    u_char             misc1;          /* PD67_MISC_CTL_1 */
+    u_char             misc2;          /* PD67_MISC_CTL_2 */
+    u_char             ectl1;          /* PD67_EXT_CTL_1 */
+    u_char             timer[6];       /* PD67_TIME_* */
+} cirrus_state_t;
+
+#define CIRRUS_PCIC_ID \
+    IS_PD6729, IS_PD6730, IS_PD6832
+
+#define CIRRUS_PCIC_INFO \
+    { "Cirrus PD6729", IS_CIRRUS|IS_PCI, ID(CIRRUS, 6729) },           \
+    { "Cirrus PD6730", IS_CIRRUS|IS_PCI, PCI_VENDOR_ID_CIRRUS, -1 },   \
+    { "Cirrus PD6832", IS_CIRRUS|IS_CARDBUS, ID(CIRRUS, 6832) }
+
+/* Special bit in I365_IDENT used for Vadem chip detection */
+#define I365_IDENT_VADEM       0x08
+
+/* Special definitions in I365_POWER */
+#define VG468_VPP2_MASK                0x0c
+#define VG468_VPP2_5V          0x04
+#define VG468_VPP2_12V         0x08
+
+/* Unique Vadem registers */
+#define VG469_VSENSE           0x1f    /* Card voltage sense */
+#define VG469_VSELECT          0x2f    /* Card voltage select */
+#define VG468_CTL              0x38    /* Control register */
+#define VG468_TIMER            0x39    /* Timer control */
+#define VG468_MISC             0x3a    /* Miscellaneous */
+#define VG468_GPIO_CFG         0x3b    /* GPIO configuration */
+#define VG469_EXT_MODE         0x3c    /* Extended mode register */
+#define VG468_SELECT           0x3d    /* Programmable chip select */
+#define VG468_SELECT_CFG       0x3e    /* Chip select configuration */
+#define VG468_ATA              0x3f    /* ATA control */
+
+/* Flags for VG469_VSENSE */
+#define VG469_VSENSE_A_VS1     0x01
+#define VG469_VSENSE_A_VS2     0x02
+#define VG469_VSENSE_B_VS1     0x04
+#define VG469_VSENSE_B_VS2     0x08
+
+/* Flags for VG469_VSELECT */
+#define VG469_VSEL_VCC         0x03
+#define VG469_VSEL_5V          0x00
+#define VG469_VSEL_3V          0x03
+#define VG469_VSEL_MAX         0x0c
+#define VG469_VSEL_EXT_STAT    0x10
+#define VG469_VSEL_EXT_BUS     0x20
+#define VG469_VSEL_MIXED       0x40
+#define VG469_VSEL_ISA         0x80
+
+/* Flags for VG468_CTL */
+#define VG468_CTL_SLOW         0x01    /* 600ns memory timing */
+#define VG468_CTL_ASYNC                0x02    /* Asynchronous bus clocking */
+#define VG468_CTL_TSSI         0x08    /* Tri-state some outputs */
+#define VG468_CTL_DELAY                0x10    /* Card detect debounce */
+#define VG468_CTL_INPACK       0x20    /* Obey INPACK signal? */
+#define VG468_CTL_POLARITY     0x40    /* VCCEN polarity */
+#define VG468_CTL_COMPAT       0x80    /* Compatibility stuff */
+
+#define VG469_CTL_WS_COMPAT    0x04    /* Wait state compatibility */
+#define VG469_CTL_STRETCH      0x10    /* LED stretch */
+
+/* Flags for VG468_TIMER */
+#define VG468_TIMER_ZEROPWR    0x10    /* Zero power control */
+#define VG468_TIMER_SIGEN      0x20    /* Power up */
+#define VG468_TIMER_STATUS     0x40    /* Activity timer status */
+#define VG468_TIMER_RES                0x80    /* Timer resolution */
+#define VG468_TIMER_MASK       0x0f    /* Activity timer timeout */
+
+/* Flags for VG468_MISC */
+#define VG468_MISC_GPIO                0x04    /* General-purpose IO */
+#define VG468_MISC_DMAWSB      0x08    /* DMA wait state control */
+#define VG469_MISC_LEDENA      0x10    /* LED enable */
+#define VG468_MISC_VADEMREV    0x40    /* Vadem revision control */
+#define VG468_MISC_UNLOCK      0x80    /* Unique register lock */
+
+/* Flags for VG469_EXT_MODE_A */
+#define VG469_MODE_VPPST       0x03    /* Vpp steering control */
+#define VG469_MODE_INT_SENSE   0x04    /* Internal voltage sense */
+#define VG469_MODE_CABLE       0x08
+#define VG469_MODE_COMPAT      0x10    /* i82365sl B or DF step */
+#define VG469_MODE_TEST                0x20
+#define VG469_MODE_RIO         0x40    /* Steer RIO to INTR? */
+
+/* Flags for VG469_EXT_MODE_B */
+#define VG469_MODE_B_3V                0x01    /* 3.3v for socket B */
+
+/* Data structure for tracking vendor-specific state */
+typedef struct vg46x_state_t {
+    u_char             ctl;            /* VG468_CTL */
+    u_char             ema;            /* VG468_EXT_MODE_A */
+} vg46x_state_t;
index 6b1cd598c8818280ed08a9f9cfbf559ad7029f70..54256cd28a536d84fe86bc62d0801ac2172d62e4 100644 (file)
@@ -1,64 +1,64 @@
-#!/bin/sh\r
-OLDDIR=`pwd`\r
-cd /lib/modules/*/kernel/drivers/scsi\r
-/bin/modprobe scsi_mod.o.gz > /dev/null 2>&1\r
-/bin/modprobe sd_mod.o.gz > /dev/null 2>&1\r
-/bin/modprobe sr_mod.o.gz > /dev/null 2>&1\r
-/bin/modprobe sg.o.gz > /dev/null 2>&1\r
-/bin/modprobe libata.o.gz > /dev/null 2>&1\r
-echo "Trying cpqarray"; \r
-if /bin/modprobe cpqarray > /dev/null 2>&1; then\r
-       echo "cpqarray.o.gz" > /scsidriver;\r
-       exit 0;\r
-fi\r
-echo "Trying cciss";\r
-if /bin/modprobe cciss > /dev/null 2>&1; then\r
-       echo "cciss.o.gz" > /scsidriver;\r
-       exit 0;\r
-fi\r
-echo "Trying DAC960";\r
-if /bin/modprobe DAC960 > /dev/null 2>&1; then\r
-       echo "DAC960.o.gz" > /scsidriver;\r
-       exit 0;\r
-fi\r
-/bin/modprobe ataraid.o.gz > /dev/null 2>&1\r
-echo "Trying medley";\r
-if /bin/modprobe medley > /dev/null 2>&1; then\r
-       echo "medley.o.gz" > /scsidriver;\r
-       exit 0;\r
-fi\r
-echo "Trying hptraid";\r
-if /bin/modprobe hptraid > /dev/null 2>&1; then\r
-       echo "hptraid.o.gz" > /scsidriver;\r
-       exit 0;\r
-fi\r
-echo "Trying pdcraid";\r
-if /bin/modprobe pdcraid > /dev/null 2>&1; then\r
-       echo "pdcraid.o.gz" > /scsidriver;\r
-       exit 0;\r
-fi\r
-echo "Trying silraid";\r
-if /bin/modprobe silraid > /dev/null 2>&1; then\r
-       echo "silraid.o.gz" > /scsidriver;\r
-       exit 0;\r
-fi\r
-for i in * message/fusion/mptscsih.o.gz ; \r
-do \r
-# Skip the generic scsi modules and ancillary support modules\r
-# Added eata_dma to skip list because it crashes some machines. Probe last.\r
-if [ $i != "scsi_mod.o.gz" -a $i != "sd_mod.o.gz" -a $i != "sg.o.gz" -a $i != "sr_mod.o.gz" -a $i != "53c700.o.gz" -a $i != "NCR53C9x.o.gz" -a $i != "eata_dma.o.gz" -a $i != "libata.o.gz" ]; then\r
-       DRIVER=`echo $i | sed 's/.o.gz//'`\r
-       echo "Trying $DRIVER"; \r
-       if /bin/modprobe $DRIVER > /dev/null 2>&1; then\r
-               echo $i > /scsidriver;\r
-               /bin/cat /proc/scsi/scsi;\r
-               exit 0;\r
-       fi;\r
-fi;\r
-done\r
-echo "Trying eata_dma";\r
-if /bin/modprobe eata_dma > /dev/null 2>&1; then\r
-       echo "eata_dma.o.gz" > /scsidriver;\r
-       exit 0;\r
-fi\r
-cd $OLDDIR\r
+#!/bin/sh
+OLDDIR=`pwd`
+cd /lib/modules/*/kernel/drivers/scsi
+/bin/modprobe scsi_mod.o.gz > /dev/null 2>&1
+/bin/modprobe sd_mod.o.gz > /dev/null 2>&1
+/bin/modprobe sr_mod.o.gz > /dev/null 2>&1
+/bin/modprobe sg.o.gz > /dev/null 2>&1
+/bin/modprobe libata.o.gz > /dev/null 2>&1
+echo "Trying cpqarray"; 
+if /bin/modprobe cpqarray > /dev/null 2>&1; then
+       echo "cpqarray.o.gz" > /scsidriver;
+       exit 0;
+fi
+echo "Trying cciss";
+if /bin/modprobe cciss > /dev/null 2>&1; then
+       echo "cciss.o.gz" > /scsidriver;
+       exit 0;
+fi
+echo "Trying DAC960";
+if /bin/modprobe DAC960 > /dev/null 2>&1; then
+       echo "DAC960.o.gz" > /scsidriver;
+       exit 0;
+fi
+/bin/modprobe ataraid.o.gz > /dev/null 2>&1
+echo "Trying medley";
+if /bin/modprobe medley > /dev/null 2>&1; then
+       echo "medley.o.gz" > /scsidriver;
+       exit 0;
+fi
+echo "Trying hptraid";
+if /bin/modprobe hptraid > /dev/null 2>&1; then
+       echo "hptraid.o.gz" > /scsidriver;
+       exit 0;
+fi
+echo "Trying pdcraid";
+if /bin/modprobe pdcraid > /dev/null 2>&1; then
+       echo "pdcraid.o.gz" > /scsidriver;
+       exit 0;
+fi
+echo "Trying silraid";
+if /bin/modprobe silraid > /dev/null 2>&1; then
+       echo "silraid.o.gz" > /scsidriver;
+       exit 0;
+fi
+for i in * message/fusion/mptscsih.o.gz ; 
+do 
+# Skip the generic scsi modules and ancillary support modules
+# Added eata_dma to skip list because it crashes some machines. Probe last.
+if [ $i != "scsi_mod.o.gz" -a $i != "sd_mod.o.gz" -a $i != "sg.o.gz" -a $i != "sr_mod.o.gz" -a $i != "53c700.o.gz" -a $i != "NCR53C9x.o.gz" -a $i != "eata_dma.o.gz" -a $i != "libata.o.gz" ]; then
+       DRIVER=`echo $i | sed 's/.o.gz//'`
+       echo "Trying $DRIVER"; 
+       if /bin/modprobe $DRIVER > /dev/null 2>&1; then
+               echo $i > /scsidriver;
+               /bin/cat /proc/scsi/scsi;
+               exit 0;
+       fi;
+fi;
+done
+echo "Trying eata_dma";
+if /bin/modprobe eata_dma > /dev/null 2>&1; then
+       echo "eata_dma.o.gz" > /scsidriver;
+       exit 0;
+fi
+cd $OLDDIR
index 495030ad19510cf2e378c9b04bb268e528933eed..96bf787d5c7edf27165a0deead598c10eda54eb7 100644 (file)
@@ -1,28 +1,28 @@
-/* IPCop install program.\r
- *\r
- * This program is distributed under the terms of the GNU General Public\r
- * Licence.  See the file COPYING for details.\r
- *\r
- * (c) Alan Hourihane, 2003 <alanh@fairlite.demon.co.uk>\r
- * \r
- * $Id: scsi.c\r
- * \r
- */\r
-\r
-#include "install.h"\r
-\r
-int\r
-try_scsi(char *disk_device)\r
-{\r
-       int fd;\r
-       char dev[10];\r
-\r
-       sprintf(dev, "/dev/%s", disk_device);\r
-\r
-       if ((fd = open(dev, O_RDONLY)) < 0)\r
-               return 0;\r
-\r
-       close(fd);\r
-       // remove usb scsi\r
-       return ( checkusb(disk_device) ? 0:1 );\r
-}\r
+/* IPCop install program.
+ *
+ * This program is distributed under the terms of the GNU General Public
+ * Licence.  See the file COPYING for details.
+ *
+ * (c) Alan Hourihane, 2003 <alanh@fairlite.demon.co.uk>
+ * 
+ * $Id: scsi.c
+ * 
+ */
+
+#include "install.h"
+
+int
+try_scsi(char *disk_device)
+{
+       int fd;
+       char dev[10];
+
+       sprintf(dev, "/dev/%s", disk_device);
+
+       if ((fd = open(dev, O_RDONLY)) < 0)
+               return 0;
+
+       close(fd);
+       // remove usb scsi
+       return ( checkusb(disk_device) ? 0:1 );
+}
index b8e838ee7c8f97669e3f89a5531d596f96152453..7ba750148ae0581adb1cf4221b8f2eaafd7dd2fb 100644 (file)
-/*\r
- * This file is part of the IPCop Firewall.\r
- *\r
- * IPCop is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * IPCop is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with IPCop; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
- *\r
- * Copyright 2002: Mark Wormgoor <mark@wormgoor.com>\r
- * \r
- * $Id: upgrade-v12-v13.c,v 1.2.2.3 2004/11/11 09:39:25 alanh Exp $\r
- * \r
- */\r
-\r
-#include "install.h"\r
-\r
-void _convert_ppp_settings() {\r
-       DIR *dirp;\r
-       struct dirent *dp;\r
-       char filename[STRING_SIZE];\r
-       \r
-       dirp = opendir( "/harddisk/var/ipcop/ppp" );\r
-       while ( (dp = readdir( dirp )) != NULL ) {\r
-               if ( strstr( dp->d_name, "settings" ) == dp->d_name ) {\r
-                       snprintf (filename, STRING_SIZE-1, "%s/%s", \r
-                               "/harddisk/var/ipcop/ppp", dp->d_name);\r
-\r
-                       /* reduce furthur replacements from commands below */\r
-                       replace (filename, "TYPE=modem", "");\r
-                       replace (filename, "COMPORT=ttyS0", "TYPE=modem\nCOMPORT=ttyS0");\r
-                       replace (filename, "COMPORT=ttyS1", "TYPE=modem\nCOMPORT=ttyS1");\r
-                       replace (filename, "COMPORT=ttyS2", "TYPE=modem\nCOMPORT=ttyS2");\r
-                       replace (filename, "COMPORT=ttyS3", "TYPE=modem\nCOMPORT=ttyS3");\r
-                       /* reduce furthur replacements from commands below */\r
-                       replace (filename, "TYPE=isdn", "");\r
-                       replace (filename, "COMPORT=isdn1", "TYPE=isdn\nCOMPORT=isdn1");\r
-                       replace (filename, "COMPORT=isdn2", "TYPE=isdn\nCOMPORT=isdn2");\r
-                       replace (filename, "COMPORT=pppoe", "TYPE=pppoe");\r
-                       replace (filename, "COMPORT=pptp", "TYPE=pptp");\r
-                       replace (filename, "COMPORT=usbadsl", "TYPE=alcatelusb");\r
-                       replace (filename, "COMPORT=pppoa", "TYPE=pulsardsl");\r
-\r
-                       chown (filename, 99, 99);\r
-               }       \r
-       }\r
-       (void) closedir( dirp );\r
-}\r
-\r
-int _convert_xtaccess() {\r
-       int count=1, count2=0;\r
-        FILE *portfw1, *portfw2;\r
-        char portsrctemp[STRING_SIZE], portdsttemp[STRING_SIZE];\r
-       char *portproto, *portsrcip, *portsrcport, *portdstip, *portdstport, *portenabled, *portremip;\r
-\r
-        FILE *xtaccess1, *xtaccess2;\r
-       char xtsrctemp[STRING_SIZE], xtdsttemp[STRING_SIZE];\r
-       char *xtproto, *xtsrcip, *xtdstip, *xtdstport, *xtenabled;\r
-        \r
-       if (!(portfw1 = fopen ("/harddisk/var/ipcop/portfw/config", "r"))) return 1;\r
-       if (!(portfw2 = fopen ("/harddisk/var/ipcop/portfw/config.new", "w"))) \r
-       {\r
-               fclose(portfw1);\r
-               return 1;\r
-       }\r
-\r
-        while (fgets (portsrctemp, STRING_SIZE, portfw1) != NULL) {\r
-               count2 = 0;\r
-               portproto   = NULL;\r
-               portsrcip   = NULL;\r
-               portsrcport = NULL;\r
-               portdstip   = NULL;\r
-               portdstport = NULL;\r
-               portremip   = NULL;\r
-               portenabled = NULL;\r
-               \r
-               if (!(xtaccess1 = fopen ("/harddisk/var/ipcop/xtaccess/config", "r"))) \r
-               {\r
-                       fclose(portfw1);\r
-                       fclose(portfw2);\r
-                       return 1;\r
-               }\r
-               if (!(xtaccess2 = fopen ("/harddisk/var/ipcop/xtaccess/config.new", "w"))) \r
-               {\r
-                       fclose(portfw1);\r
-                       fclose(portfw2);\r
-                       fclose(xtaccess1);\r
-                       return 1;\r
-               }\r
-\r
-               if (isdigit (portsrctemp[0])) {\r
-                       /* Already converted to new format */\r
-                       fputs(portsrctemp, portfw2);\r
-                       continue;\r
-               }\r
-\r
-               if (portsrctemp[strlen(portsrctemp) - 1] == '\n')\r
-                       portsrctemp[strlen(portsrctemp) - 1] = '\0';\r
-               portproto   = strtok (portsrctemp, ",");\r
-               portsrcport = strtok (NULL, ",");\r
-               portdstip   = strtok (NULL, ",");\r
-               portdstport = strtok (NULL, ",");\r
-               portenabled = strtok (NULL, ",");\r
-               portsrcip   = strtok (NULL, ",");\r
-               portremip   = strtok (NULL, ",");\r
-               if (!(portproto && portsrcport && portdstip && \r
-                       portdstport && portenabled ))\r
-                       continue;\r
-\r
-               if (portsrcip == NULL) portsrcip = strdup ("0.0.0.0");\r
-\r
-               while (fgets (xtsrctemp, STRING_SIZE, xtaccess1)) {\r
-                       xtproto   = NULL;\r
-                       xtsrcip   = NULL;\r
-                       xtdstip   = NULL;\r
-                       xtdstport = NULL;\r
-                       xtenabled = NULL;\r
-\r
-                       if (xtsrctemp[strlen(xtsrctemp) - 1] == '\n')\r
-                               xtsrctemp[strlen(xtsrctemp) - 1] = '\0';\r
-                       xtproto   = strtok (xtsrctemp, ",");\r
-                       xtsrcip   = strtok (NULL, ",");\r
-                       xtdstport = strtok (NULL, ",");\r
-                       xtenabled = strtok (NULL, ",");\r
-                       xtdstip   = strtok (NULL, ",");\r
-                       if (!(xtproto && xtsrcip && xtdstport && xtenabled)) continue;\r
-\r
-                       if (xtdstip == NULL) xtdstip = strdup ("0.0.0.0");\r
-\r
-                       if (strcmp (portproto, xtproto) == 0 &&\r
-                                       strcmp (portsrcport, xtdstport) == 0 &&\r
-                                       strcmp (portsrcip, xtdstip) == 0) {\r
-                               portremip = strdup (xtsrcip);\r
-                               if ((strcmp (portremip, "0.0.0.0/0") == 0) && (count2 == 0)) {\r
-                                       sprintf (portdsttemp, "%d,%d,%s,%s,%s,%s,%s,%s,%s\n",\r
-                                               count, count2, portproto, portsrcport, portdstip,\r
-                                               portdstport, portenabled, portsrcip, portremip);\r
-                                       fputs(portdsttemp, portfw2);\r
-                               } else {\r
-                                       if (count2 == 0) {\r
-                                               sprintf (portdsttemp, "%d,%d,%s,%s,%s,%s,%s,%s,%d\n",\r
-                                                       count,count2,portproto, portsrcport, portdstip,\r
-                                                       portdstport, portenabled, portsrcip, 0);\r
-                                               fputs(portdsttemp, portfw2);\r
-                                               count2++;\r
-                                       }\r
-                                       sprintf (portdsttemp, "%d,%d,%s,%d,%s,%s,%s,%d,%s\n",\r
-                                               count,count2,portproto, 0, portdstip,\r
-                                               portdstport, portenabled, 0, portremip);\r
-                                       fputs(portdsttemp, portfw2);\r
-                               }\r
-                               count2++;\r
-                       } else {\r
-                               sprintf (xtdsttemp, "%s,%s,%s,%s,%s\n",\r
-                                       xtproto, xtsrcip, xtdstport, xtenabled, xtdstip);\r
-                               fputs(xtdsttemp, xtaccess2);\r
-                       }\r
-                }\r
-\r
-               /* Close source and destination xtaccess files */\r
-               fclose (xtaccess1);\r
-               fclose (xtaccess2);\r
-\r
-               /* Move the new xtaccess file */\r
-               rename ("/harddisk/var/ipcop/xtaccess/config.new",\r
-                       "/harddisk/var/ipcop/xtaccess/config");\r
-\r
-               /* If no external access line existed, add a no access line */\r
-               if (count2 == 0) {\r
-                       if (portremip == NULL) portremip = strdup ("127.0.0.1/32");\r
-\r
-                       /* Print new port forwarding line to file */\r
-                       sprintf (portdsttemp, "%d,%d,%s,%s,%s,%s,%s,%s,%s\n",\r
-                               count, count2, portproto, portsrcport, portdstip, \r
-                               portdstport, portenabled, portsrcip, portremip);\r
-                       fputs(portdsttemp, portfw2);\r
-               }\r
-               count++;\r
-       }\r
-\r
-       /* Close source and destination portfw files */\r
-       fclose (portfw1);\r
-       fclose (portfw2);\r
-\r
-       /* Move the new portfw file */\r
-       rename ("/harddisk/var/ipcop/portfw/config.new",\r
-               "/harddisk/var/ipcop/portfw/config");\r
-       chown  ("/harddisk/var/ipcop/xtaccess/config", 99, 99);\r
-       chown  ("/harddisk/var/ipcop/portfw/config", 99, 99);\r
-\r
-       return 0;\r
-}\r
-\r
-int _convert_pulsardsl() {\r
-       DIR *dirp;\r
-       struct dirent *dp;\r
-       char filename[STRING_SIZE];\r
-       FILE *settings, *pulsardsl;\r
-       char line[STRING_SIZE];\r
-       \r
-       if (!(pulsardsl = fopen ("/harddisk/var/ipcop/pciadsl/settings", "r"))) return 1;\r
-       \r
-       dirp = opendir( "/harddisk/var/ipcop/ppp" );\r
-       while ( (dp = readdir( dirp )) != NULL ) {\r
-               if ( strstr( dp->d_name, "settings" ) == dp->d_name ) {\r
-                       snprintf (filename, STRING_SIZE-1, "%s/%s", \r
-                               "/harddisk/var/ipcop/ppp", dp->d_name);\r
-                       if (!(settings = fopen (filename, "r+"))) {\r
-                               closedir(dirp);\r
-                               fclose(pulsardsl);\r
-                               return 1;\r
-                       }\r
-                       while (fgets (line, STRING_SIZE, settings) != NULL) {\r
-                               if (strstr (line, "TYPE=pulsardsl") == line) {\r
-                                       fseek(settings,0,SEEK_END);\r
-                                       rewind(pulsardsl);\r
-                                       while (fgets(line, STRING_SIZE, pulsardsl) != NULL) {\r
-                                               fputs (line, settings);\r
-                                       }\r
-                                       fclose (settings);\r
-                                       chown (filename, 99, 99);\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       fclose(pulsardsl);\r
-       (void) closedir( dirp );\r
-\r
-\r
-       return 0;\r
-}\r
-\r
-int _convert_pulsardsl_ethernet() {\r
-       DIR *dirp;\r
-       struct dirent *dp;\r
-       FILE *ethernet, *settings;\r
-       char line[STRING_SIZE];\r
-       char type[STRING_SIZE];\r
-       char ip[STRING_SIZE];\r
-       char filename[STRING_SIZE];\r
-       \r
-       if (!(ethernet = fopen ("/harddisk/var/ipcop/ethernet/settings", "r"))) return 1;\r
-\r
-       while (fgets (line, STRING_SIZE, ethernet) != NULL) {\r
-               if (strstr (line, "RED_DRIVER=pciadsl") == line) {\r
-                       rewind (ethernet);\r
-                       while (fgets (line, STRING_SIZE, ethernet) != NULL) {\r
-                               if (strstr (line, "RED_TYPE") == line) {\r
-                                       strcpy (type, line + 9*sizeof(char));\r
-                                       if (type[strlen(type) - 1] == '\n')\r
-                                               type[strlen(type) - 1] = '\0';\r
-                               }\r
-                               if (strstr (line, "RED_ADDRESS") == line) {\r
-                                       strcpy (ip, line + 12*sizeof(char));\r
-                                       if (ip[strlen(ip) - 1] == '\n')\r
-                                               type[strlen(ip) - 1] = '\0';\r
-                               }\r
-                               fclose (ethernet);\r
-\r
-                               replace ("/harddisk/var/ipcop/ethernet/settings", "RED_DEV=eth1", "RED_DEV=");\r
-                               replace ("/harddisk/var/ipcop/ethernet/settings", "CONFIG_TYPE=2", "CONFIG_TYPE=0");\r
-                               replace ("/harddisk/var/ipcop/ethernet/settings", "CONFIG_TYPE=3", "CONFIG_TYPE=1");\r
-                               replace ("/harddisk/var/ipcop/ethernet/settings", "RED_DEV=eth2", "RED_DEV=");\r
-                               chown ("/harddisk/var/ipcop/ethernet/settings", 99, 99);\r
-                               \r
-                               dirp = opendir( "/harddisk/var/ipcop/ppp" );\r
-                               while ( (dp = readdir( dirp )) != NULL ) {\r
-                                       if ( strstr( dp->d_name, "settings-" ) == dp->d_name ) {\r
-                                               snprintf (filename, STRING_SIZE-1, "%s/%s", \r
-                                                       "/harddisk/var/ipcop/ppp", dp->d_name);\r
-                                               if (!(settings = fopen (filename, "r+"))) \r
-                                               {\r
-                                                       closedir(dirp);\r
-                                                       return 1;\r
-                                               }\r
-                                               while (fgets (line, STRING_SIZE, settings) != NULL) {\r
-                                                       if (strstr (line, "TYPE=pulsardsl") == line) {\r
-                                                               fseek(settings,0,SEEK_END);\r
-                                                               fprintf (settings, "METHOD=%s\n", type);\r
-                                                               fprintf (settings, "IP=%s\n", ip);\r
-                                                               fclose (settings);\r
-                                                               chown (filename, 99, 99);\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                               }\r
-                               (void) closedir( dirp );\r
-                       }\r
-               }\r
-       }\r
-\r
-       return 0;\r
-}\r
-\r
-int upgrade_v12_v13() {\r
-       struct stat s;\r
-       replace ("/harddisk/var/ipcop/ethernet/settings", "rtl8139", "8139too");\r
-       replace ("/harddisk/var/ipcop/vpn/ipsec.conf", "auto=add", "auto=start");\r
-       chown ("/harddisk/var/ipcop/vpn/ipsec.conf", 99, 99);\r
-       chown ("/harddisk/var/ipcop/ethernet/settings", 99, 99);\r
-       chown ("/harddisk/var/ipcop/main/settings", 99, 99);\r
-       _convert_ppp_settings();\r
-       _convert_xtaccess();\r
-       _convert_pulsardsl();\r
-       _convert_pulsardsl_ethernet();\r
-\r
-       /* Rename usbadsl directory */\r
-       stat ("/harddisk/var/ipcop/usbadsl", &s);\r
-       if (S_ISDIR(s.st_mode)) {\r
-               remove ("/harddisk/var/ipcop/usbadsl/settings");\r
-               if (! system("/bin/chroot /harddisk /bin/rm -rf /var/ipcop/alcatelusb"))\r
-                       rename ("/harddisk/var/ipcop/usbadsl", "/harddisk/var/ipcop/alcatelusb");\r
-       }\r
-       \r
-       /* Rename pciadsl module and directory */\r
-       remove ("/harddisk/var/ipcop/pulsar/settings");\r
-       rename ("/harddisk/var/ipcop/pciadsl/pciadsl.o", "/harddisk/var/ipcop/pciadsl/pulsar.o");\r
-       stat ("/harddisk/var/ipcop/pciadsl", &s);\r
-       if (S_ISDIR(s.st_mode)) {\r
-               if (! system("/bin/chroot /harddisk /bin/rm -rf /var/ipcop/pulsardsl"))\r
-                       rename ("/harddisk/var/ipcop/pciadsl", "/harddisk/var/ipcop/pulsardsl");\r
-       }\r
-\r
-       /* Change squid cache directory */\r
-       replace ("/harddisk/var/ipcop/proxy/squid.conf", "/var/spool/squid", "/var/log/cache");\r
-       chown ("/harddisk/var/ipcop/proxy/squid.conf", 99, 99);\r
-       \r
-       /* Change setup user shell */\r
-       replace ("/harddisk/etc/passwd", ":/usr/local/sbin/setup", ":/bin/bash -c /usr/local/sbin/setup");\r
-       \r
-       return 0;\r
-}\r
+/*
+ * This file is part of the IPCop Firewall.
+ *
+ * IPCop is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * IPCop is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with IPCop; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ * Copyright 2002: Mark Wormgoor <mark@wormgoor.com>
+ * 
+ * $Id: upgrade-v12-v13.c,v 1.2.2.3 2004/11/11 09:39:25 alanh Exp $
+ * 
+ */
+
+#include "install.h"
+
+void _convert_ppp_settings() {
+       DIR *dirp;
+       struct dirent *dp;
+       char filename[STRING_SIZE];
+       
+       dirp = opendir( "/harddisk/var/ipcop/ppp" );
+       while ( (dp = readdir( dirp )) != NULL ) {
+               if ( strstr( dp->d_name, "settings" ) == dp->d_name ) {
+                       snprintf (filename, STRING_SIZE-1, "%s/%s", 
+                               "/harddisk/var/ipcop/ppp", dp->d_name);
+
+                       /* reduce furthur replacements from commands below */
+                       replace (filename, "TYPE=modem", "");
+                       replace (filename, "COMPORT=ttyS0", "TYPE=modem\nCOMPORT=ttyS0");
+                       replace (filename, "COMPORT=ttyS1", "TYPE=modem\nCOMPORT=ttyS1");
+                       replace (filename, "COMPORT=ttyS2", "TYPE=modem\nCOMPORT=ttyS2");
+                       replace (filename, "COMPORT=ttyS3", "TYPE=modem\nCOMPORT=ttyS3");
+                       /* reduce furthur replacements from commands below */
+                       replace (filename, "TYPE=isdn", "");
+                       replace (filename, "COMPORT=isdn1", "TYPE=isdn\nCOMPORT=isdn1");
+                       replace (filename, "COMPORT=isdn2", "TYPE=isdn\nCOMPORT=isdn2");
+                       replace (filename, "COMPORT=pppoe", "TYPE=pppoe");
+                       replace (filename, "COMPORT=pptp", "TYPE=pptp");
+                       replace (filename, "COMPORT=usbadsl", "TYPE=alcatelusb");
+                       replace (filename, "COMPORT=pppoa", "TYPE=pulsardsl");
+
+                       chown (filename, 99, 99);
+               }       
+       }
+       (void) closedir( dirp );
+}
+
+int _convert_xtaccess() {
+       int count=1, count2=0;
+        FILE *portfw1, *portfw2;
+        char portsrctemp[STRING_SIZE], portdsttemp[STRING_SIZE];
+       char *portproto, *portsrcip, *portsrcport, *portdstip, *portdstport, *portenabled, *portremip;
+
+        FILE *xtaccess1, *xtaccess2;
+       char xtsrctemp[STRING_SIZE], xtdsttemp[STRING_SIZE];
+       char *xtproto, *xtsrcip, *xtdstip, *xtdstport, *xtenabled;
+        
+       if (!(portfw1 = fopen ("/harddisk/var/ipcop/portfw/config", "r"))) return 1;
+       if (!(portfw2 = fopen ("/harddisk/var/ipcop/portfw/config.new", "w"))) 
+       {
+               fclose(portfw1);
+               return 1;
+       }
+
+        while (fgets (portsrctemp, STRING_SIZE, portfw1) != NULL) {
+               count2 = 0;
+               portproto   = NULL;
+               portsrcip   = NULL;
+               portsrcport = NULL;
+               portdstip   = NULL;
+               portdstport = NULL;
+               portremip   = NULL;
+               portenabled = NULL;
+               
+               if (!(xtaccess1 = fopen ("/harddisk/var/ipcop/xtaccess/config", "r"))) 
+               {
+                       fclose(portfw1);
+                       fclose(portfw2);
+                       return 1;
+               }
+               if (!(xtaccess2 = fopen ("/harddisk/var/ipcop/xtaccess/config.new", "w"))) 
+               {
+                       fclose(portfw1);
+                       fclose(portfw2);
+                       fclose(xtaccess1);
+                       return 1;
+               }
+
+               if (isdigit (portsrctemp[0])) {
+                       /* Already converted to new format */
+                       fputs(portsrctemp, portfw2);
+                       continue;
+               }
+
+               if (portsrctemp[strlen(portsrctemp) - 1] == '\n')
+                       portsrctemp[strlen(portsrctemp) - 1] = '\0';
+               portproto   = strtok (portsrctemp, ",");
+               portsrcport = strtok (NULL, ",");
+               portdstip   = strtok (NULL, ",");
+               portdstport = strtok (NULL, ",");
+               portenabled = strtok (NULL, ",");
+               portsrcip   = strtok (NULL, ",");
+               portremip   = strtok (NULL, ",");
+               if (!(portproto && portsrcport && portdstip && 
+                       portdstport && portenabled ))
+                       continue;
+
+               if (portsrcip == NULL) portsrcip = strdup ("0.0.0.0");
+
+               while (fgets (xtsrctemp, STRING_SIZE, xtaccess1)) {
+                       xtproto   = NULL;
+                       xtsrcip   = NULL;
+                       xtdstip   = NULL;
+                       xtdstport = NULL;
+                       xtenabled = NULL;
+
+                       if (xtsrctemp[strlen(xtsrctemp) - 1] == '\n')
+                               xtsrctemp[strlen(xtsrctemp) - 1] = '\0';
+                       xtproto   = strtok (xtsrctemp, ",");
+                       xtsrcip   = strtok (NULL, ",");
+                       xtdstport = strtok (NULL, ",");
+                       xtenabled = strtok (NULL, ",");
+                       xtdstip   = strtok (NULL, ",");
+                       if (!(xtproto && xtsrcip && xtdstport && xtenabled)) continue;
+
+                       if (xtdstip == NULL) xtdstip = strdup ("0.0.0.0");
+
+                       if (strcmp (portproto, xtproto) == 0 &&
+                                       strcmp (portsrcport, xtdstport) == 0 &&
+                                       strcmp (portsrcip, xtdstip) == 0) {
+                               portremip = strdup (xtsrcip);
+                               if ((strcmp (portremip, "0.0.0.0/0") == 0) && (count2 == 0)) {
+                                       sprintf (portdsttemp, "%d,%d,%s,%s,%s,%s,%s,%s,%s\n",
+                                               count, count2, portproto, portsrcport, portdstip,
+                                               portdstport, portenabled, portsrcip, portremip);
+                                       fputs(portdsttemp, portfw2);
+                               } else {
+                                       if (count2 == 0) {
+                                               sprintf (portdsttemp, "%d,%d,%s,%s,%s,%s,%s,%s,%d\n",
+                                                       count,count2,portproto, portsrcport, portdstip,
+                                                       portdstport, portenabled, portsrcip, 0);
+                                               fputs(portdsttemp, portfw2);
+                                               count2++;
+                                       }
+                                       sprintf (portdsttemp, "%d,%d,%s,%d,%s,%s,%s,%d,%s\n",
+                                               count,count2,portproto, 0, portdstip,
+                                               portdstport, portenabled, 0, portremip);
+                                       fputs(portdsttemp, portfw2);
+                               }
+                               count2++;
+                       } else {
+                               sprintf (xtdsttemp, "%s,%s,%s,%s,%s\n",
+                                       xtproto, xtsrcip, xtdstport, xtenabled, xtdstip);
+                               fputs(xtdsttemp, xtaccess2);
+                       }
+                }
+
+               /* Close source and destination xtaccess files */
+               fclose (xtaccess1);
+               fclose (xtaccess2);
+
+               /* Move the new xtaccess file */
+               rename ("/harddisk/var/ipcop/xtaccess/config.new",
+                       "/harddisk/var/ipcop/xtaccess/config");
+
+               /* If no external access line existed, add a no access line */
+               if (count2 == 0) {
+                       if (portremip == NULL) portremip = strdup ("127.0.0.1/32");
+
+                       /* Print new port forwarding line to file */
+                       sprintf (portdsttemp, "%d,%d,%s,%s,%s,%s,%s,%s,%s\n",
+                               count, count2, portproto, portsrcport, portdstip, 
+                               portdstport, portenabled, portsrcip, portremip);
+                       fputs(portdsttemp, portfw2);
+               }
+               count++;
+       }
+
+       /* Close source and destination portfw files */
+       fclose (portfw1);
+       fclose (portfw2);
+
+       /* Move the new portfw file */
+       rename ("/harddisk/var/ipcop/portfw/config.new",
+               "/harddisk/var/ipcop/portfw/config");
+       chown  ("/harddisk/var/ipcop/xtaccess/config", 99, 99);
+       chown  ("/harddisk/var/ipcop/portfw/config", 99, 99);
+
+       return 0;
+}
+
+int _convert_pulsardsl() {
+       DIR *dirp;
+       struct dirent *dp;
+       char filename[STRING_SIZE];
+       FILE *settings, *pulsardsl;
+       char line[STRING_SIZE];
+       
+       if (!(pulsardsl = fopen ("/harddisk/var/ipcop/pciadsl/settings", "r"))) return 1;
+       
+       dirp = opendir( "/harddisk/var/ipcop/ppp" );
+       while ( (dp = readdir( dirp )) != NULL ) {
+               if ( strstr( dp->d_name, "settings" ) == dp->d_name ) {
+                       snprintf (filename, STRING_SIZE-1, "%s/%s", 
+                               "/harddisk/var/ipcop/ppp", dp->d_name);
+                       if (!(settings = fopen (filename, "r+"))) {
+                               closedir(dirp);
+                               fclose(pulsardsl);
+                               return 1;
+                       }
+                       while (fgets (line, STRING_SIZE, settings) != NULL) {
+                               if (strstr (line, "TYPE=pulsardsl") == line) {
+                                       fseek(settings,0,SEEK_END);
+                                       rewind(pulsardsl);
+                                       while (fgets(line, STRING_SIZE, pulsardsl) != NULL) {
+                                               fputs (line, settings);
+                                       }
+                                       fclose (settings);
+                                       chown (filename, 99, 99);
+                               }
+                       }
+               }
+       }
+       fclose(pulsardsl);
+       (void) closedir( dirp );
+
+
+       return 0;
+}
+
+int _convert_pulsardsl_ethernet() {
+       DIR *dirp;
+       struct dirent *dp;
+       FILE *ethernet, *settings;
+       char line[STRING_SIZE];
+       char type[STRING_SIZE];
+       char ip[STRING_SIZE];
+       char filename[STRING_SIZE];
+       
+       if (!(ethernet = fopen ("/harddisk/var/ipcop/ethernet/settings", "r"))) return 1;
+
+       while (fgets (line, STRING_SIZE, ethernet) != NULL) {
+               if (strstr (line, "RED_DRIVER=pciadsl") == line) {
+                       rewind (ethernet);
+                       while (fgets (line, STRING_SIZE, ethernet) != NULL) {
+                               if (strstr (line, "RED_TYPE") == line) {
+                                       strcpy (type, line + 9*sizeof(char));
+                                       if (type[strlen(type) - 1] == '\n')
+                                               type[strlen(type) - 1] = '\0';
+                               }
+                               if (strstr (line, "RED_ADDRESS") == line) {
+                                       strcpy (ip, line + 12*sizeof(char));
+                                       if (ip[strlen(ip) - 1] == '\n')
+                                               type[strlen(ip) - 1] = '\0';
+                               }
+                               fclose (ethernet);
+
+                               replace ("/harddisk/var/ipcop/ethernet/settings", "RED_DEV=eth1", "RED_DEV=");
+                               replace ("/harddisk/var/ipcop/ethernet/settings", "CONFIG_TYPE=2", "CONFIG_TYPE=0");
+                               replace ("/harddisk/var/ipcop/ethernet/settings", "CONFIG_TYPE=3", "CONFIG_TYPE=1");
+                               replace ("/harddisk/var/ipcop/ethernet/settings", "RED_DEV=eth2", "RED_DEV=");
+                               chown ("/harddisk/var/ipcop/ethernet/settings", 99, 99);
+                               
+                               dirp = opendir( "/harddisk/var/ipcop/ppp" );
+                               while ( (dp = readdir( dirp )) != NULL ) {
+                                       if ( strstr( dp->d_name, "settings-" ) == dp->d_name ) {
+                                               snprintf (filename, STRING_SIZE-1, "%s/%s", 
+                                                       "/harddisk/var/ipcop/ppp", dp->d_name);
+                                               if (!(settings = fopen (filename, "r+"))) 
+                                               {
+                                                       closedir(dirp);
+                                                       return 1;
+                                               }
+                                               while (fgets (line, STRING_SIZE, settings) != NULL) {
+                                                       if (strstr (line, "TYPE=pulsardsl") == line) {
+                                                               fseek(settings,0,SEEK_END);
+                                                               fprintf (settings, "METHOD=%s\n", type);
+                                                               fprintf (settings, "IP=%s\n", ip);
+                                                               fclose (settings);
+                                                               chown (filename, 99, 99);
+                                                       }
+                                               }
+                                       }
+                               }
+                               (void) closedir( dirp );
+                       }
+               }
+       }
+
+       return 0;
+}
+
+int upgrade_v12_v13() {
+       struct stat s;
+       replace ("/harddisk/var/ipcop/ethernet/settings", "rtl8139", "8139too");
+       replace ("/harddisk/var/ipcop/vpn/ipsec.conf", "auto=add", "auto=start");
+       chown ("/harddisk/var/ipcop/vpn/ipsec.conf", 99, 99);
+       chown ("/harddisk/var/ipcop/ethernet/settings", 99, 99);
+       chown ("/harddisk/var/ipcop/main/settings", 99, 99);
+       _convert_ppp_settings();
+       _convert_xtaccess();
+       _convert_pulsardsl();
+       _convert_pulsardsl_ethernet();
+
+       /* Rename usbadsl directory */
+       stat ("/harddisk/var/ipcop/usbadsl", &s);
+       if (S_ISDIR(s.st_mode)) {
+               remove ("/harddisk/var/ipcop/usbadsl/settings");
+               if (! system("/bin/chroot /harddisk /bin/rm -rf /var/ipcop/alcatelusb"))
+                       rename ("/harddisk/var/ipcop/usbadsl", "/harddisk/var/ipcop/alcatelusb");
+       }
+       
+       /* Rename pciadsl module and directory */
+       remove ("/harddisk/var/ipcop/pulsar/settings");
+       rename ("/harddisk/var/ipcop/pciadsl/pciadsl.o", "/harddisk/var/ipcop/pciadsl/pulsar.o");
+       stat ("/harddisk/var/ipcop/pciadsl", &s);
+       if (S_ISDIR(s.st_mode)) {
+               if (! system("/bin/chroot /harddisk /bin/rm -rf /var/ipcop/pulsardsl"))
+                       rename ("/harddisk/var/ipcop/pciadsl", "/harddisk/var/ipcop/pulsardsl");
+       }
+
+       /* Change squid cache directory */
+       replace ("/harddisk/var/ipcop/proxy/squid.conf", "/var/spool/squid", "/var/log/cache");
+       chown ("/harddisk/var/ipcop/proxy/squid.conf", 99, 99);
+       
+       /* Change setup user shell */
+       replace ("/harddisk/etc/passwd", ":/usr/local/sbin/setup", ":/bin/bash -c /usr/local/sbin/setup");
+       
+       return 0;
+}
index adcd2366fc6dbb43159687d5e5dcc3fe3a4dafb9..1437877e0a1a4c8e7ce1007ab4354f15ec7e080f 100644 (file)
-/*\r
- * This file is part of the IPCop Firewall.\r
- *\r
- * IPCop is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * IPCop is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with IPCop; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
- *\r
- * Copyright 2002: Mark Wormgoor <mark@wormgoor.com>\r
- * \r
- * $Id: upgrade-v130-v140.c,v 1.12.2.35 2004/11/11 09:40:03 alanh Exp $\r
- * \r
- */\r
-\r
-#include "install.h"\r
-\r
-extern char **ctr;\r
\r
-int _handledomainname(void)\r
-{\r
-       char domainname[STRING_SIZE] = "localdomain";\r
-       struct keyvalue *kv = initkeyvalues();\r
-       char *values[] = { domainname, NULL };  /* pointers for the values. */\r
-       struct newtWinEntry entries[] =\r
-               { { "", &values[0], 0,}, { NULL, NULL, 0 } };\r
-       int rc;\r
-       int result;\r
-       \r
-       if (!(readkeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings")))\r
-       {\r
-               freekeyvalues(kv);\r
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
-               return 0;\r
-       }       \r
-       \r
-       findkey(kv, "DOMAINNAME", domainname);\r
-\r
-       /* already have a domainname */\r
-       if (strlen(domainname))\r
-               return 0;\r
-       \r
-       for (;;)\r
-       {       \r
-               rc = newtWinEntries(ctr[TR_DOMAINNAME], ctr[TR_ENTER_DOMAINNAME],\r
-                       50, 5, 5, 40, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);       \r
-               \r
-               if (rc == 1)\r
-               {\r
-                       strcpy(domainname, values[0]);\r
-                       if (strchr(domainname, ' '))\r
-                               errorbox(ctr[TR_DOMAINNAME_CANNOT_CONTAIN_SPACES]);\r
-                       else\r
-                       {                       \r
-                               replacekeyvalue(kv, "DOMAINNAME", domainname);\r
-                               writekeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings");\r
-                               result = 1;\r
-                               break;\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       result = 0;\r
-                       break;\r
-               }\r
-       }\r
-       free(values[0]);\r
-       freekeyvalues(kv);\r
-       \r
-       return result;\r
-}      \r
-\r
-int _add_logwatch_user() {\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel logwatch");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel logwatch");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 102 logwatch");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 102 -g logwatch -d /var/log/logwatch -s /bin/false logwatch");\r
-    \r
-       return 0;\r
-}\r
-\r
-int _fixsquid() {\r
-       FILE *squidreadfile;\r
-       FILE *squidwritefile;\r
-       FILE *aclreadfile;\r
-       char hostname[STRING_SIZE] = "";\r
-       char domainname[STRING_SIZE] = "";\r
-       char squidtemp[STRING_SIZE];\r
-       struct keyvalue *kv = initkeyvalues();\r
-       int already_upgraded = 0;\r
-       int updated = 0;\r
-\r
-       if (!(squidreadfile = fopen ("/harddisk" CONFIG_ROOT "/proxy/squid.conf", "r"))) return 1;\r
-       if (!(squidwritefile = fopen ("/harddisk" CONFIG_ROOT "/proxy/squid.conf.new", "w"))) \r
-       {\r
-               fclose(squidreadfile);\r
-               return 1;\r
-       }\r
-\r
-       if (!(readkeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings")))\r
-       {\r
-               fclose (squidwritefile);\r
-               fclose (squidreadfile);\r
-               freekeyvalues(kv);\r
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
-               return 1;\r
-       }\r
-\r
-       findkey(kv, "HOSTNAME", hostname);\r
-       findkey(kv, "DOMAINNAME", domainname);\r
-       freekeyvalues(kv);\r
-\r
-        while (fgets (squidtemp, STRING_SIZE, squidreadfile) != NULL) {\r
-               /* this will fail if we've already been upgraded, which is ok */\r
-               if (!strncmp(squidtemp, "reply_body_max_size 0 KB", 24)) {\r
-                       sprintf(squidtemp, "reply_body_max_size 0 allow all\n");\r
-               }\r
-               if (!strncmp(squidtemp, "cache_store_log /var/log/squid/store.log", 40)) {\r
-                       sprintf(squidtemp, "cache_store_log none\n");\r
-               }\r
-               fputs(squidtemp, squidwritefile);\r
-\r
-               /* so for us developers we skip already upgraded squiddies */\r
-               if (!strncmp(squidtemp, "visible_hostname", 16)) {\r
-                       already_upgraded = 1;\r
-               }\r
-\r
-               /* Check for the new acl's */\r
-               if (!strncmp(squidtemp, "__GREEN_IP__", 12)) {\r
-                       updated = 1;\r
-               }\r
-       }\r
-       if (!already_upgraded) {\r
-               sprintf(squidtemp, "visible_hostname %s.%s\n", hostname, domainname);\r
-               fputs(squidtemp, squidwritefile);\r
-       }\r
-\r
-       fclose (squidwritefile);\r
-       fclose (squidreadfile);\r
-\r
-       rename ("/harddisk" CONFIG_ROOT "/proxy/squid.conf.new",\r
-               "/harddisk" CONFIG_ROOT "/proxy/squid.conf");\r
-\r
-       replace("/harddisk" CONFIG_ROOT "/proxy/squid.conf", "cache_dir ufs", "cache_dir aufs");\r
-\r
-       if (!updated) {\r
-               rename ("/harddisk" CONFIG_ROOT "/proxy/acl",\r
-                       "/harddisk" CONFIG_ROOT "/proxy/acl.old");\r
-               rename ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4",\r
-                       "/harddisk" CONFIG_ROOT "/proxy/acl");\r
-       } else {\r
-               if (!(aclreadfile = fopen ("/harddisk" CONFIG_ROOT "/proxy/acl", "r"))) {\r
-                       rename ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4",\r
-                               "/harddisk" CONFIG_ROOT "/proxy/acl");\r
-               } else {\r
-                       unlink ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4");\r
-                       fclose(aclreadfile);\r
-               }\r
-       }\r
-\r
-       chown  ("/harddisk" CONFIG_ROOT "/proxy/squid.conf", 99, 99);\r
-       chown  ("/harddisk" CONFIG_ROOT "/proxy/acl", 99, 99);\r
-       return 0;\r
-}\r
-\r
-int _fixeagleusb() {\r
-       FILE *eaglereadfile;\r
-       FILE *eaglewritefile;\r
-       char eagletemp[STRING_SIZE];\r
-       int already_upgraded = 0;\r
-\r
-       if (!(eaglereadfile  = fopen ("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf", "r"))) return 1;\r
-       if (!(eaglewritefile = fopen ("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf.new", "w"))) \r
-       {\r
-               fclose(eaglereadfile);\r
-               return 1;\r
-       }\r
-\r
-        while (fgets (eagletemp, STRING_SIZE, eaglereadfile) != NULL) {\r
-               /* so for us developers we skip already upgraded configs */\r
-               if (!strncmp(eagletemp, "<eaglectrl>", 11)) {\r
-                       already_upgraded = 1;\r
-               }\r
-       }\r
-\r
-       rewind(eaglereadfile);\r
-       if (!already_upgraded)\r
-               fprintf(eaglewritefile, "<eaglectrl>\n");\r
-       while (fgets (eagletemp, STRING_SIZE, eaglereadfile) != NULL)\r
-               fputs(eagletemp, eaglewritefile);\r
-       if (!already_upgraded)\r
-               fprintf(eaglewritefile, "</eaglectrl>\n");\r
-\r
-       fclose (eaglewritefile);\r
-       fclose (eaglereadfile);\r
-\r
-       rename ("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf.new",\r
-               "/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf");\r
-\r
-       replace("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf", "Linetype=00000001", "Linetype=0A");\r
-\r
-       chown  ("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf", 99, 99);\r
-       unlink("/harddisk" CONFIG_ROOT "/eagle-usb/dsp_code_pots.bin");\r
-       unlink("/harddisk" CONFIG_ROOT "/eagle-usb/dsp_code_isdn.bin");\r
-       return 0;\r
-}\r
-\r
-int _fixdhcp_30() {\r
-       FILE *dhcpreadfile;\r
-       FILE *dhcpwritefile;\r
-       char dhcptemp[STRING_SIZE];\r
-\r
-       if (!(dhcpreadfile = fopen ("/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf", "r"))) return 1;\r
-       if (!(dhcpwritefile = fopen ("/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf.new", "w"))) \r
-       {\r
-               fclose(dhcpreadfile);\r
-               return 1;\r
-       }\r
-       fprintf (dhcpwritefile, "authoritative;\n");\r
-       fprintf (dhcpwritefile, "deny bootp;\n");\r
-       fprintf (dhcpwritefile, "ddns-update-style none;\n");\r
-       while (fgets (dhcptemp, STRING_SIZE, dhcpreadfile) != NULL) {\r
-               int write = 1;\r
-\r
-               /* so for us developers we skip already upgraded dhcp files */\r
-               if (!strncmp(dhcptemp, "authoritative", 13)) {\r
-                       write = 0;\r
-               }\r
-               /* so for us developers we skip already upgraded dhcp files */\r
-               if (!strncmp(dhcptemp, "ddns-update-style", 17)) {\r
-                       write = 0;\r
-               }\r
-               /* so for us developers we skip already upgraded dhcp files */\r
-               if (!strncmp(dhcptemp, "deny bootp", 10)) {\r
-                       write = 0;\r
-               }\r
-\r
-               if (write)\r
-                       fputs(dhcptemp, dhcpwritefile);\r
-       }\r
-\r
-       fclose(dhcpreadfile);\r
-       fclose(dhcpwritefile);\r
-\r
-       rename ("/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf.new",\r
-               "/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf");\r
-       chown  ("/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);\r
-\r
-       /* This one will get converted again furthur down */\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "WINS=", "WINS1=");\r
-\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "START_ADDR=", "START_ADDR_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "END_ADDR=", "END_ADDR_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "DOMAIN_NAME=", "DOMAIN_NAME_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "DEFAULT_LEASE_TIME=", "DEFAULT_LEASE_TIME_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "MAX_LEASE_TIME=", "MAX_LEASE_TIME_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "DNS1=", "DNS1_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "DNS2=", "DNS2_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "WINS1=", "WINS1_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "WINS2=", "WINS2_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "ENABLE=", "ENABLE_GREEN=");\r
-       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "range dynamic-bootp", "range");\r
-       chown  ("/harddisk" CONFIG_ROOT "/dhcp/settings", 99, 99);\r
-\r
-       if ((dhcpreadfile = fopen ("/harddisk" CONFIG_ROOT "/dhcp/enable", "r")))\r
-       {\r
-               fclose(dhcpreadfile);\r
-               rename ("/harddisk" CONFIG_ROOT "/dhcp/enable",\r
-                       "/harddisk" CONFIG_ROOT "/dhcp/enable_green");\r
-               chown  ("/harddisk" CONFIG_ROOT "/dhcp/enable_green", 99, 99);\r
-       }\r
-\r
-       return 0;\r
-}\r
-\r
-int _add_sshd_user() {\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel sshd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel sshd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 74 sshd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 74 -g sshd -d /var/empty/sshd -s /bin/false -M sshd");\r
-    \r
-       return 0;\r
-}\r
-\r
-int _add_dnsmasq_user() {\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel dnsmasq");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel dnsmasq");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 103 dnsmasq");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 103 -g dnsmasq -d / -s /bin/false -M dnsmasq");\r
-    \r
-       return 0;\r
-}\r
-\r
-int _add_cron_user() {\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel cron");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel cron");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 104 cron");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 104 -g cron -d / -s /bin/false -M cron");\r
-    \r
-       return 0;\r
-}\r
-\r
-int _add_sysklogd_user() {\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel syslogd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel syslogd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 105 syslogd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 105 -g syslogd -d / -s /bin/false -M syslogd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel klogd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel klogd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 106 klogd");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 106 -g klogd -d / -s /bin/false -M klogd");\r
-    \r
-       return 0;\r
-}\r
-\r
-int _del_setup_user() {\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel setup");\r
-    \r
-       return 0;\r
-}\r
-\r
-int _create_nobody_dir(){\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/usermod -d /home/nobody nobody");\r
-\r
-       return 0;\r
-}\r
-\r
-int _del_useless_user_group()\r
-{\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel games");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel games");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel news");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel news");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel ftp");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel gopher");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel lp");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel uucp");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel adm");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel adm");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel operator");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel sync");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel shutdown");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/userdel halt");\r
-       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel man");\r
-       return 0;\r
-}\r
-\r
-void _del_pulsardsl_dir()\r
-{\r
-       mysystem("/bin/chroot /harddisk /bin/rm -rf " CONFIG_ROOT "/pulsardsl");\r
-}\r
-\r
-void _del_fritzdsl_dir()\r
-{\r
-       mysystem("/bin/chroot /harddisk /bin/rm -rf " CONFIG_ROOT "/fritzdsl");\r
-}\r
-\r
-int _convert_vpn() {\r
-       int count=1;\r
-       FILE *vpn1, *vpn2;\r
-       char vpnip[STRING_SIZE] = "";\r
-       char greennetaddr[STRING_SIZE] = "";\r
-       struct keyvalue *kv = initkeyvalues();\r
-       char vpnsrctemp[STRING_SIZE], vpndsttemp[STRING_SIZE];\r
-       char *name, *left, *left_nexthop, *left_subnet, *right, *right_nexthop, *right_subnet, *secret, *enabled, *compression;\r
-\r
-       if (!(vpn1 = fopen ("/harddisk" CONFIG_ROOT "/vpn/config", "r"))) return 1;\r
-       if (!(vpn2 = fopen ("/harddisk" CONFIG_ROOT "/vpn/config.new", "w"))) \r
-       {\r
-               fclose(vpn1);\r
-               return 1;\r
-       }\r
-\r
-       if (!(readkeyvalues(kv, "/harddisk" CONFIG_ROOT "/ethernet/settings")))\r
-       {\r
-               fclose (vpn1);\r
-               fclose (vpn2);\r
-               freekeyvalues(kv);\r
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
-               return 0;\r
-       }\r
-\r
-       findkey(kv, "GREEN_NETADDRESS", greennetaddr);\r
-       freekeyvalues(kv);\r
-\r
-       kv = initkeyvalues();\r
-       if (!(readkeyvalues(kv, "/harddisk" CONFIG_ROOT "/vpn/settings")))\r
-       {\r
-               fclose (vpn1);\r
-               fclose (vpn2);\r
-               freekeyvalues(kv);\r
-               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r
-               return 0;\r
-       }       \r
-       \r
-       /* if no VPN_IP is defined, we must turn it off to force the user\r
-        * to enter a value once upgraded */\r
-       findkey(kv, "VPN_IP", vpnip);\r
-       if (strlen(vpnip) == 0) {\r
-               replacekeyvalue(kv, "ENABLED", "off");\r
-               writekeyvalues(kv, "/harddisk" CONFIG_ROOT "/vpn/settings");\r
-       }\r
-       freekeyvalues(kv);\r
-\r
-        while (fgets (vpnsrctemp, STRING_SIZE, vpn1) != NULL) {\r
-               if (isdigit (vpnsrctemp[0])) {\r
-                       /* Already converted to new format */\r
-                       fputs(vpnsrctemp, vpn2);\r
-                       continue;\r
-               }\r
-\r
-               name          = NULL;\r
-               left          = NULL;\r
-               left_nexthop  = NULL;\r
-               left_subnet   = NULL;\r
-               right         = NULL;\r
-               right_nexthop = NULL;\r
-               right_subnet  = NULL;\r
-               secret        = NULL;\r
-               enabled       = NULL;\r
-               compression   = NULL;\r
-               \r
-               if (vpnsrctemp[strlen(vpnsrctemp) - 1] == '\n')\r
-                       vpnsrctemp[strlen(vpnsrctemp) - 1] = '\0';\r
-               name          = strtok (vpnsrctemp, ",");\r
-               left          = strtok (NULL, ",");\r
-               left_nexthop  = strtok (NULL, ",");\r
-               left_subnet   = strtok (NULL, ",");\r
-               right         = strtok (NULL, ",");\r
-               right_nexthop = strtok (NULL, ",");\r
-               right_subnet  = strtok (NULL, ",");\r
-               secret        = strtok (NULL, ",");\r
-               enabled       = strtok (NULL, ",");\r
-               compression   = strtok (NULL, ",");\r
-               if (!(name && left && left_subnet &&\r
-                       right && right_subnet &&\r
-                       secret && enabled && compression ))\r
-                       continue;\r
-\r
-               /* Try and guess what side IPCop is on; defaults to left */\r
-               if (strstr(greennetaddr, right_subnet)) {\r
-                       sprintf (vpndsttemp, "%d,%s,%s,,net,psk,%s,right,,%s,,%s,%s,,%s,,,,,,,,,,,,,RED\n",\r
-                                                       count, enabled, name, secret, right_subnet,\r
-                                                       left, left_subnet, compression);\r
-               } else {\r
-                       sprintf (vpndsttemp, "%d,%s,%s,,net,psk,%s,left,,%s,,%s,%s,,%s,,,,,,,,,,,,,RED\n",\r
-                                                       count, enabled, name, secret, left_subnet,\r
-                                                       right, right_subnet, compression);\r
-               }\r
-               fputs(vpndsttemp, vpn2);\r
-\r
-               count++;\r
-       }\r
-\r
-       /* Close source and destination vpn files */\r
-       fclose (vpn1);\r
-       fclose (vpn2);\r
-\r
-       /* Move the new vpn file */\r
-       rename ("/harddisk" CONFIG_ROOT "/vpn/config.new",\r
-               "/harddisk" CONFIG_ROOT "/vpn/config");\r
-       chown  ("/harddisk" CONFIG_ROOT "/vpn/config", 99, 99);\r
-\r
-       return 0;\r
-}\r
-\r
-void _convert_ppp_settings_V140() {\r
-       DIR *dirp;\r
-       struct dirent *dp;\r
-       char filename[STRING_SIZE];\r
-       \r
-       dirp = opendir( "/harddisk" CONFIG_ROOT "/ppp" );\r
-       while ( (dp = readdir( dirp )) != NULL ) {\r
-               if ( strstr( dp->d_name, "settings" ) == dp->d_name ) {\r
-                       snprintf (filename, STRING_SIZE-1, "%s/%s", \r
-                               "/harddisk" CONFIG_ROOT "/ppp", dp->d_name);\r
-                       replace (filename, "PERSISTENT=on", "RECONNECTION=persistent");\r
-                       replace (filename, "DIALONDEMAND=on", "RECONNECTION=dialondemand");\r
-                       replace (filename, "MODULATION=GDTM", "MODULATION=GDMT");\r
-                       chown (filename, 99, 99);\r
-               }       \r
-       }\r
-       (void) closedir( dirp );\r
-}\r
-\r
-void _convert_net_settings_V140(){\r
-       replace ("/harddisk" CONFIG_ROOT "/ethernet/settings", "eepro100", "e100");\r
-       chown   ("/harddisk" CONFIG_ROOT "/ethernet/settings", 99, 99);\r
-}\r
-\r
-void _convert_keymap() {\r
-       replace("/harddisk" CONFIG_ROOT "/main/settings", "KEYMAP=/lib/kbd", "KEYMAP=/usr/share/kbd");\r
-       replace("/harddisk" CONFIG_ROOT "/main/settings", ".kmap.gz", ".map.gz");\r
-       chown  ("/harddisk" CONFIG_ROOT "/main/settings", 99, 99);\r
-}\r
-\r
-void _convert_speedtouch() {\r
-       FILE *speedtchbootfile;\r
-       FILE *speedtchfirmfile;\r
-\r
-       if (( speedtchfirmfile = fopen ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4.bin", "r")))\r
-       {\r
-               fclose (speedtchfirmfile);\r
-               if  ((speedtchbootfile = fopen ("/harddisk" CONFIG_ROOT "/alcatelusb/boot.v4.bin", "r")))  {\r
-                       fclose (speedtchbootfile);\r
-                       system("/bin/cat /harddisk" CONFIG_ROOT "/alcatelusb/boot.v4.bin "\r
-                               "/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4.bin"\r
-                               "> /harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4_b.bin");\r
-                       remove ("/harddisk" CONFIG_ROOT "/alcatelusb/boot.v4.bin");\r
-                       remove ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4.bin");\r
-                       chown ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4_b.bin", 99, 99);\r
-               }\r
-       }\r
-\r
-       if (( speedtchfirmfile = fopen ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v123.bin", "r"))) {\r
-               fclose (speedtchfirmfile);\r
-               system("/bin/cat /harddisk" CONFIG_ROOT "/alcatelusb/boot.v123.bin "\r
-                       "/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v123.bin"\r
-                       "> /harddisk" CONFIG_ROOT "/alcatelusb/firmware.v0123.bin");\r
-               remove ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v123.bin");\r
-       }\r
-\r
-       remove ("/harddisk" CONFIG_ROOT "/alcatelusb/boot.v123.bin");\r
-\r
-       rename ("/harddisk" CONFIG_ROOT "/alcatelusb/mgmt.o", "/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v0123.bin");\r
-       chown ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v0123.bin", 99, 99);\r
-}\r
-\r
-void _convert_isapnp() {\r
-       FILE *isapnpfile;\r
-\r
-       mkdir ("/harddisk" CONFIG_ROOT "/isapnp", S_IRWXU|S_IRWXG|S_IRWXO );\r
-       if (( isapnpfile = fopen ("/harddisk/etc/isapnp.conf", "r"))) {\r
-               fclose (isapnpfile);\r
-               rename ("/harddisk/etc/isapnp.conf", "/harddisk" CONFIG_ROOT "/isapnp/isapnp.conf");\r
-       } else {\r
-               if (( isapnpfile = fopen ("/harddisk" CONFIG_ROOT "/isapnp/isapnp.conf", "r"))) {\r
-                       fclose(isapnpfile);\r
-               } else {\r
-                       isapnpfile = fopen ("/harddisk" CONFIG_ROOT "/isapnp/isapnp.conf", "w");\r
-                       fclose(isapnpfile);\r
-               }\r
-       }\r
-}\r
-\r
-int upgrade_v130_v140() {\r
-       _del_setup_user();\r
-       _del_useless_user_group();\r
-       _add_logwatch_user();\r
-       _add_sshd_user();\r
-       _add_dnsmasq_user();\r
-       _add_cron_user();\r
-       _add_sysklogd_user();\r
-       _del_pulsardsl_dir();\r
-       _del_fritzdsl_dir();\r
-       _convert_vpn();\r
-       _handledomainname();\r
-       _fixsquid();\r
-       _fixeagleusb();\r
-       _create_nobody_dir();\r
-       _convert_ppp_settings_V140();\r
-       _convert_net_settings_V140();\r
-       _fixdhcp_30();\r
-       _convert_keymap();\r
-       _convert_speedtouch();\r
-       _convert_isapnp();\r
-\r
-       return 0;\r
-}\r
+/*
+ * This file is part of the IPCop Firewall.
+ *
+ * IPCop is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * IPCop is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with IPCop; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ * Copyright 2002: Mark Wormgoor <mark@wormgoor.com>
+ * 
+ * $Id: upgrade-v130-v140.c,v 1.12.2.35 2004/11/11 09:40:03 alanh Exp $
+ * 
+ */
+
+#include "install.h"
+
+extern char **ctr;
+int _handledomainname(void)
+{
+       char domainname[STRING_SIZE] = "localdomain";
+       struct keyvalue *kv = initkeyvalues();
+       char *values[] = { domainname, NULL };  /* pointers for the values. */
+       struct newtWinEntry entries[] =
+               { { "", &values[0], 0,}, { NULL, NULL, 0 } };
+       int rc;
+       int result;
+       
+       if (!(readkeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings")))
+       {
+               freekeyvalues(kv);
+               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               return 0;
+       }       
+       
+       findkey(kv, "DOMAINNAME", domainname);
+
+       /* already have a domainname */
+       if (strlen(domainname))
+               return 0;
+       
+       for (;;)
+       {       
+               rc = newtWinEntries(ctr[TR_DOMAINNAME], ctr[TR_ENTER_DOMAINNAME],
+                       50, 5, 5, 40, entries, ctr[TR_OK], ctr[TR_CANCEL], NULL);       
+               
+               if (rc == 1)
+               {
+                       strcpy(domainname, values[0]);
+                       if (strchr(domainname, ' '))
+                               errorbox(ctr[TR_DOMAINNAME_CANNOT_CONTAIN_SPACES]);
+                       else
+                       {                       
+                               replacekeyvalue(kv, "DOMAINNAME", domainname);
+                               writekeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings");
+                               result = 1;
+                               break;
+                       }
+               }
+               else
+               {
+                       result = 0;
+                       break;
+               }
+       }
+       free(values[0]);
+       freekeyvalues(kv);
+       
+       return result;
+}      
+
+int _add_logwatch_user() {
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel logwatch");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel logwatch");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 102 logwatch");
+       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 102 -g logwatch -d /var/log/logwatch -s /bin/false logwatch");
+    
+       return 0;
+}
+
+int _fixsquid() {
+       FILE *squidreadfile;
+       FILE *squidwritefile;
+       FILE *aclreadfile;
+       char hostname[STRING_SIZE] = "";
+       char domainname[STRING_SIZE] = "";
+       char squidtemp[STRING_SIZE];
+       struct keyvalue *kv = initkeyvalues();
+       int already_upgraded = 0;
+       int updated = 0;
+
+       if (!(squidreadfile = fopen ("/harddisk" CONFIG_ROOT "/proxy/squid.conf", "r"))) return 1;
+       if (!(squidwritefile = fopen ("/harddisk" CONFIG_ROOT "/proxy/squid.conf.new", "w"))) 
+       {
+               fclose(squidreadfile);
+               return 1;
+       }
+
+       if (!(readkeyvalues(kv, "/harddisk" CONFIG_ROOT "/main/settings")))
+       {
+               fclose (squidwritefile);
+               fclose (squidreadfile);
+               freekeyvalues(kv);
+               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               return 1;
+       }
+
+       findkey(kv, "HOSTNAME", hostname);
+       findkey(kv, "DOMAINNAME", domainname);
+       freekeyvalues(kv);
+
+        while (fgets (squidtemp, STRING_SIZE, squidreadfile) != NULL) {
+               /* this will fail if we've already been upgraded, which is ok */
+               if (!strncmp(squidtemp, "reply_body_max_size 0 KB", 24)) {
+                       sprintf(squidtemp, "reply_body_max_size 0 allow all\n");
+               }
+               if (!strncmp(squidtemp, "cache_store_log /var/log/squid/store.log", 40)) {
+                       sprintf(squidtemp, "cache_store_log none\n");
+               }
+               fputs(squidtemp, squidwritefile);
+
+               /* so for us developers we skip already upgraded squiddies */
+               if (!strncmp(squidtemp, "visible_hostname", 16)) {
+                       already_upgraded = 1;
+               }
+
+               /* Check for the new acl's */
+               if (!strncmp(squidtemp, "__GREEN_IP__", 12)) {
+                       updated = 1;
+               }
+       }
+       if (!already_upgraded) {
+               sprintf(squidtemp, "visible_hostname %s.%s\n", hostname, domainname);
+               fputs(squidtemp, squidwritefile);
+       }
+
+       fclose (squidwritefile);
+       fclose (squidreadfile);
+
+       rename ("/harddisk" CONFIG_ROOT "/proxy/squid.conf.new",
+               "/harddisk" CONFIG_ROOT "/proxy/squid.conf");
+
+       replace("/harddisk" CONFIG_ROOT "/proxy/squid.conf", "cache_dir ufs", "cache_dir aufs");
+
+       if (!updated) {
+               rename ("/harddisk" CONFIG_ROOT "/proxy/acl",
+                       "/harddisk" CONFIG_ROOT "/proxy/acl.old");
+               rename ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4",
+                       "/harddisk" CONFIG_ROOT "/proxy/acl");
+       } else {
+               if (!(aclreadfile = fopen ("/harddisk" CONFIG_ROOT "/proxy/acl", "r"))) {
+                       rename ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4",
+                               "/harddisk" CONFIG_ROOT "/proxy/acl");
+               } else {
+                       unlink ("/harddisk" CONFIG_ROOT "/proxy/acl-1.4");
+                       fclose(aclreadfile);
+               }
+       }
+
+       chown  ("/harddisk" CONFIG_ROOT "/proxy/squid.conf", 99, 99);
+       chown  ("/harddisk" CONFIG_ROOT "/proxy/acl", 99, 99);
+       return 0;
+}
+
+int _fixeagleusb() {
+       FILE *eaglereadfile;
+       FILE *eaglewritefile;
+       char eagletemp[STRING_SIZE];
+       int already_upgraded = 0;
+
+       if (!(eaglereadfile  = fopen ("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf", "r"))) return 1;
+       if (!(eaglewritefile = fopen ("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf.new", "w"))) 
+       {
+               fclose(eaglereadfile);
+               return 1;
+       }
+
+        while (fgets (eagletemp, STRING_SIZE, eaglereadfile) != NULL) {
+               /* so for us developers we skip already upgraded configs */
+               if (!strncmp(eagletemp, "<eaglectrl>", 11)) {
+                       already_upgraded = 1;
+               }
+       }
+
+       rewind(eaglereadfile);
+       if (!already_upgraded)
+               fprintf(eaglewritefile, "<eaglectrl>\n");
+       while (fgets (eagletemp, STRING_SIZE, eaglereadfile) != NULL)
+               fputs(eagletemp, eaglewritefile);
+       if (!already_upgraded)
+               fprintf(eaglewritefile, "</eaglectrl>\n");
+
+       fclose (eaglewritefile);
+       fclose (eaglereadfile);
+
+       rename ("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf.new",
+               "/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf");
+
+       replace("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf", "Linetype=00000001", "Linetype=0A");
+
+       chown  ("/harddisk" CONFIG_ROOT "/eagle-usb/eagle-usb.conf", 99, 99);
+       unlink("/harddisk" CONFIG_ROOT "/eagle-usb/dsp_code_pots.bin");
+       unlink("/harddisk" CONFIG_ROOT "/eagle-usb/dsp_code_isdn.bin");
+       return 0;
+}
+
+int _fixdhcp_30() {
+       FILE *dhcpreadfile;
+       FILE *dhcpwritefile;
+       char dhcptemp[STRING_SIZE];
+
+       if (!(dhcpreadfile = fopen ("/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf", "r"))) return 1;
+       if (!(dhcpwritefile = fopen ("/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf.new", "w"))) 
+       {
+               fclose(dhcpreadfile);
+               return 1;
+       }
+       fprintf (dhcpwritefile, "authoritative;\n");
+       fprintf (dhcpwritefile, "deny bootp;\n");
+       fprintf (dhcpwritefile, "ddns-update-style none;\n");
+       while (fgets (dhcptemp, STRING_SIZE, dhcpreadfile) != NULL) {
+               int write = 1;
+
+               /* so for us developers we skip already upgraded dhcp files */
+               if (!strncmp(dhcptemp, "authoritative", 13)) {
+                       write = 0;
+               }
+               /* so for us developers we skip already upgraded dhcp files */
+               if (!strncmp(dhcptemp, "ddns-update-style", 17)) {
+                       write = 0;
+               }
+               /* so for us developers we skip already upgraded dhcp files */
+               if (!strncmp(dhcptemp, "deny bootp", 10)) {
+                       write = 0;
+               }
+
+               if (write)
+                       fputs(dhcptemp, dhcpwritefile);
+       }
+
+       fclose(dhcpreadfile);
+       fclose(dhcpwritefile);
+
+       rename ("/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf.new",
+               "/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf");
+       chown  ("/harddisk" CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);
+
+       /* This one will get converted again furthur down */
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "WINS=", "WINS1=");
+
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "START_ADDR=", "START_ADDR_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "END_ADDR=", "END_ADDR_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "DOMAIN_NAME=", "DOMAIN_NAME_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "DEFAULT_LEASE_TIME=", "DEFAULT_LEASE_TIME_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "MAX_LEASE_TIME=", "MAX_LEASE_TIME_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "DNS1=", "DNS1_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "DNS2=", "DNS2_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "WINS1=", "WINS1_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "WINS2=", "WINS2_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "ENABLE=", "ENABLE_GREEN=");
+       replace("/harddisk" CONFIG_ROOT "/dhcp/settings", "range dynamic-bootp", "range");
+       chown  ("/harddisk" CONFIG_ROOT "/dhcp/settings", 99, 99);
+
+       if ((dhcpreadfile = fopen ("/harddisk" CONFIG_ROOT "/dhcp/enable", "r")))
+       {
+               fclose(dhcpreadfile);
+               rename ("/harddisk" CONFIG_ROOT "/dhcp/enable",
+                       "/harddisk" CONFIG_ROOT "/dhcp/enable_green");
+               chown  ("/harddisk" CONFIG_ROOT "/dhcp/enable_green", 99, 99);
+       }
+
+       return 0;
+}
+
+int _add_sshd_user() {
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel sshd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel sshd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 74 sshd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 74 -g sshd -d /var/empty/sshd -s /bin/false -M sshd");
+    
+       return 0;
+}
+
+int _add_dnsmasq_user() {
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel dnsmasq");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel dnsmasq");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 103 dnsmasq");
+       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 103 -g dnsmasq -d / -s /bin/false -M dnsmasq");
+    
+       return 0;
+}
+
+int _add_cron_user() {
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel cron");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel cron");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 104 cron");
+       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 104 -g cron -d / -s /bin/false -M cron");
+    
+       return 0;
+}
+
+int _add_sysklogd_user() {
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel syslogd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel syslogd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 105 syslogd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 105 -g syslogd -d / -s /bin/false -M syslogd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel klogd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel klogd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupadd -g 106 klogd");
+       mysystem("/bin/chroot /harddisk /usr/sbin/useradd  -u 106 -g klogd -d / -s /bin/false -M klogd");
+    
+       return 0;
+}
+
+int _del_setup_user() {
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel setup");
+    
+       return 0;
+}
+
+int _create_nobody_dir(){
+       mysystem("/bin/chroot /harddisk /usr/sbin/usermod -d /home/nobody nobody");
+
+       return 0;
+}
+
+int _del_useless_user_group()
+{
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel games");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel games");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel news");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel news");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel ftp");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel gopher");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel lp");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel uucp");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel adm");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel adm");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel operator");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel sync");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel shutdown");
+       mysystem("/bin/chroot /harddisk /usr/sbin/userdel halt");
+       mysystem("/bin/chroot /harddisk /usr/sbin/groupdel man");
+       return 0;
+}
+
+void _del_pulsardsl_dir()
+{
+       mysystem("/bin/chroot /harddisk /bin/rm -rf " CONFIG_ROOT "/pulsardsl");
+}
+
+void _del_fritzdsl_dir()
+{
+       mysystem("/bin/chroot /harddisk /bin/rm -rf " CONFIG_ROOT "/fritzdsl");
+}
+
+int _convert_vpn() {
+       int count=1;
+       FILE *vpn1, *vpn2;
+       char vpnip[STRING_SIZE] = "";
+       char greennetaddr[STRING_SIZE] = "";
+       struct keyvalue *kv = initkeyvalues();
+       char vpnsrctemp[STRING_SIZE], vpndsttemp[STRING_SIZE];
+       char *name, *left, *left_nexthop, *left_subnet, *right, *right_nexthop, *right_subnet, *secret, *enabled, *compression;
+
+       if (!(vpn1 = fopen ("/harddisk" CONFIG_ROOT "/vpn/config", "r"))) return 1;
+       if (!(vpn2 = fopen ("/harddisk" CONFIG_ROOT "/vpn/config.new", "w"))) 
+       {
+               fclose(vpn1);
+               return 1;
+       }
+
+       if (!(readkeyvalues(kv, "/harddisk" CONFIG_ROOT "/ethernet/settings")))
+       {
+               fclose (vpn1);
+               fclose (vpn2);
+               freekeyvalues(kv);
+               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               return 0;
+       }
+
+       findkey(kv, "GREEN_NETADDRESS", greennetaddr);
+       freekeyvalues(kv);
+
+       kv = initkeyvalues();
+       if (!(readkeyvalues(kv, "/harddisk" CONFIG_ROOT "/vpn/settings")))
+       {
+               fclose (vpn1);
+               fclose (vpn2);
+               freekeyvalues(kv);
+               errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);
+               return 0;
+       }       
+       
+       /* if no VPN_IP is defined, we must turn it off to force the user
+        * to enter a value once upgraded */
+       findkey(kv, "VPN_IP", vpnip);
+       if (strlen(vpnip) == 0) {
+               replacekeyvalue(kv, "ENABLED", "off");
+               writekeyvalues(kv, "/harddisk" CONFIG_ROOT "/vpn/settings");
+       }
+       freekeyvalues(kv);
+
+        while (fgets (vpnsrctemp, STRING_SIZE, vpn1) != NULL) {
+               if (isdigit (vpnsrctemp[0])) {
+                       /* Already converted to new format */
+                       fputs(vpnsrctemp, vpn2);
+                       continue;
+               }
+
+               name          = NULL;
+               left          = NULL;
+               left_nexthop  = NULL;
+               left_subnet   = NULL;
+               right         = NULL;
+               right_nexthop = NULL;
+               right_subnet  = NULL;
+               secret        = NULL;
+               enabled       = NULL;
+               compression   = NULL;
+               
+               if (vpnsrctemp[strlen(vpnsrctemp) - 1] == '\n')
+                       vpnsrctemp[strlen(vpnsrctemp) - 1] = '\0';
+               name          = strtok (vpnsrctemp, ",");
+               left          = strtok (NULL, ",");
+               left_nexthop  = strtok (NULL, ",");
+               left_subnet   = strtok (NULL, ",");
+               right         = strtok (NULL, ",");
+               right_nexthop = strtok (NULL, ",");
+               right_subnet  = strtok (NULL, ",");
+               secret        = strtok (NULL, ",");
+               enabled       = strtok (NULL, ",");
+               compression   = strtok (NULL, ",");
+               if (!(name && left && left_subnet &&
+                       right && right_subnet &&
+                       secret && enabled && compression ))
+                       continue;
+
+               /* Try and guess what side IPCop is on; defaults to left */
+               if (strstr(greennetaddr, right_subnet)) {
+                       sprintf (vpndsttemp, "%d,%s,%s,,net,psk,%s,right,,%s,,%s,%s,,%s,,,,,,,,,,,,,RED\n",
+                                                       count, enabled, name, secret, right_subnet,
+                                                       left, left_subnet, compression);
+               } else {
+                       sprintf (vpndsttemp, "%d,%s,%s,,net,psk,%s,left,,%s,,%s,%s,,%s,,,,,,,,,,,,,RED\n",
+                                                       count, enabled, name, secret, left_subnet,
+                                                       right, right_subnet, compression);
+               }
+               fputs(vpndsttemp, vpn2);
+
+               count++;
+       }
+
+       /* Close source and destination vpn files */
+       fclose (vpn1);
+       fclose (vpn2);
+
+       /* Move the new vpn file */
+       rename ("/harddisk" CONFIG_ROOT "/vpn/config.new",
+               "/harddisk" CONFIG_ROOT "/vpn/config");
+       chown  ("/harddisk" CONFIG_ROOT "/vpn/config", 99, 99);
+
+       return 0;
+}
+
+void _convert_ppp_settings_V140() {
+       DIR *dirp;
+       struct dirent *dp;
+       char filename[STRING_SIZE];
+       
+       dirp = opendir( "/harddisk" CONFIG_ROOT "/ppp" );
+       while ( (dp = readdir( dirp )) != NULL ) {
+               if ( strstr( dp->d_name, "settings" ) == dp->d_name ) {
+                       snprintf (filename, STRING_SIZE-1, "%s/%s", 
+                               "/harddisk" CONFIG_ROOT "/ppp", dp->d_name);
+                       replace (filename, "PERSISTENT=on", "RECONNECTION=persistent");
+                       replace (filename, "DIALONDEMAND=on", "RECONNECTION=dialondemand");
+                       replace (filename, "MODULATION=GDTM", "MODULATION=GDMT");
+                       chown (filename, 99, 99);
+               }       
+       }
+       (void) closedir( dirp );
+}
+
+void _convert_net_settings_V140(){
+       replace ("/harddisk" CONFIG_ROOT "/ethernet/settings", "eepro100", "e100");
+       chown   ("/harddisk" CONFIG_ROOT "/ethernet/settings", 99, 99);
+}
+
+void _convert_keymap() {
+       replace("/harddisk" CONFIG_ROOT "/main/settings", "KEYMAP=/lib/kbd", "KEYMAP=/usr/share/kbd");
+       replace("/harddisk" CONFIG_ROOT "/main/settings", ".kmap.gz", ".map.gz");
+       chown  ("/harddisk" CONFIG_ROOT "/main/settings", 99, 99);
+}
+
+void _convert_speedtouch() {
+       FILE *speedtchbootfile;
+       FILE *speedtchfirmfile;
+
+       if (( speedtchfirmfile = fopen ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4.bin", "r")))
+       {
+               fclose (speedtchfirmfile);
+               if  ((speedtchbootfile = fopen ("/harddisk" CONFIG_ROOT "/alcatelusb/boot.v4.bin", "r")))  {
+                       fclose (speedtchbootfile);
+                       system("/bin/cat /harddisk" CONFIG_ROOT "/alcatelusb/boot.v4.bin "
+                               "/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4.bin"
+                               "> /harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4_b.bin");
+                       remove ("/harddisk" CONFIG_ROOT "/alcatelusb/boot.v4.bin");
+                       remove ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4.bin");
+                       chown ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v4_b.bin", 99, 99);
+               }
+       }
+
+       if (( speedtchfirmfile = fopen ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v123.bin", "r"))) {
+               fclose (speedtchfirmfile);
+               system("/bin/cat /harddisk" CONFIG_ROOT "/alcatelusb/boot.v123.bin "
+                       "/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v123.bin"
+                       "> /harddisk" CONFIG_ROOT "/alcatelusb/firmware.v0123.bin");
+               remove ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v123.bin");
+       }
+
+       remove ("/harddisk" CONFIG_ROOT "/alcatelusb/boot.v123.bin");
+
+       rename ("/harddisk" CONFIG_ROOT "/alcatelusb/mgmt.o", "/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v0123.bin");
+       chown ("/harddisk" CONFIG_ROOT "/alcatelusb/firmware.v0123.bin", 99, 99);
+}
+
+void _convert_isapnp() {
+       FILE *isapnpfile;
+
+       mkdir ("/harddisk" CONFIG_ROOT "/isapnp", S_IRWXU|S_IRWXG|S_IRWXO );
+       if (( isapnpfile = fopen ("/harddisk/etc/isapnp.conf", "r"))) {
+               fclose (isapnpfile);
+               rename ("/harddisk/etc/isapnp.conf", "/harddisk" CONFIG_ROOT "/isapnp/isapnp.conf");
+       } else {
+               if (( isapnpfile = fopen ("/harddisk" CONFIG_ROOT "/isapnp/isapnp.conf", "r"))) {
+                       fclose(isapnpfile);
+               } else {
+                       isapnpfile = fopen ("/harddisk" CONFIG_ROOT "/isapnp/isapnp.conf", "w");
+                       fclose(isapnpfile);
+               }
+       }
+}
+
+int upgrade_v130_v140() {
+       _del_setup_user();
+       _del_useless_user_group();
+       _add_logwatch_user();
+       _add_sshd_user();
+       _add_dnsmasq_user();
+       _add_cron_user();
+       _add_sysklogd_user();
+       _del_pulsardsl_dir();
+       _del_fritzdsl_dir();
+       _convert_vpn();
+       _handledomainname();
+       _fixsquid();
+       _fixeagleusb();
+       _create_nobody_dir();
+       _convert_ppp_settings_V140();
+       _convert_net_settings_V140();
+       _fixdhcp_30();
+       _convert_keymap();
+       _convert_speedtouch();
+       _convert_isapnp();
+
+       return 0;
+}
index 61bf4b7ca10e261bfd7463ed1129387f851718f4..90bba2caf20ae5c87940bb8abf1a70f714991c9a 100644 (file)
-/*\r
- * This file is part of the IPCop Firewall.\r
- *\r
- * IPCop is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * IPCop is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with IPCop; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
- *\r
- * Copyright 2002: Mark Wormgoor <mark@wormgoor.com>\r
- * \r
- * $Id: usb.c,v 1.9.2.8 2005/12/10 00:18:23 franck78 Exp $\r
- * \r
- */\r
-\r
-#include "install.h"\r
-\r
-int usbuhci = 0;\r
-int usbohci = 0;\r
-int ehcihcd = 0;\r
-\r
-int initialize_usb() {\r
-    modprobe("sd_mod");\r
-    modprobe("sr_mod");\r
-    modprobe("usb-storage");\r
-\r
-    if (ehcihcd) {\r
-       rmmod("ehci-hcd");\r
-       ehcihcd = 0;\r
-    }\r
-    if (usbohci) {\r
-       rmmod("usb-ohci");\r
-       usbohci = 0;\r
-    }\r
-    if (usbuhci) {\r
-       rmmod("usb-uhci");\r
-       usbuhci = 0;\r
-    }\r
-\r
-    if (modprobe("ehci-hcd") == 0) ehcihcd = 1;\r
-    if (modprobe("usb-ohci") == 0) usbohci = 1;\r
-    if (modprobe("usb-uhci") == 0) usbuhci = 1;\r
-\r
-    modprobe("hid");\r
-    modprobe("keybdev");\r
-    return 0;\r
-}\r
-\r
-int write_usb_modules_conf() {\r
-    int index = 0;\r
-    FILE *handle;\r
-\r
-    if (!(handle = fopen("/harddisk/etc/modules.conf", "a")))\r
-       return 0;\r
-\r
-#if 0 /* we don't do this yet, because one of the drivers has a problem \r
-       * with it */\r
-    if (ehcihcd) {\r
-       fprintf(handle,"alias usb-controller");\r
-       if (index)\r
-               fprintf(handle,"%d",index);\r
-       fprintf(handle," ehci-hcd\n");\r
-       index++;\r
-    }\r
-#endif\r
-\r
-    if (usbohci) {\r
-       fprintf(handle,"alias usb-controller");\r
-       if (index)\r
-               fprintf(handle,"%d",index);\r
-       fprintf(handle," usb-ohci\n");\r
-       index++;\r
-    }\r
-\r
-    if (usbuhci) {\r
-       fprintf(handle,"alias usb-controller");\r
-       if (index)\r
-               fprintf(handle,"%d",index);\r
-       fprintf(handle," usb-uhci\n");\r
-       index++;\r
-    }\r
-    fclose(handle);\r
-    \r
-    return 0;\r
-}\r
-\r
-/* checkusb().\r
-    Scans the named partitions and returns true if USB-removable.\r
-    a bug? in "cat /proc/partitions" with superfloppy scheme device\r
-    make them appearing always with four 'false' partitions:\r
-    sda and sda1 sda2 sda3 sda4.\r
-    No easy way to decide if /dev/sda1 exists or not.\r
-*/\r
-int checkusb(char *partition)\r
-{\r
-       FILE *f = NULL;\r
-       char filename[STRING_SIZE];\r
-       char buffer[STRING_SIZE];\r
-       char *pchar = &buffer[0];\r
-       if (!(f = fopen("/proc/partitions", "r")))\r
-               return 0;\r
-\r
-       short int major = 0, minor = 0;                 \r
-       while (fgets(buffer, STRING_SIZE, f))   {\r
-           /* look for partition*/     \r
-           if (strstr (buffer, partition)) {\r
-               major = atoi (buffer);\r
-               if (major != 8) break ; /* not scsi */\r
-               //get minor\r
-               while (*pchar != '8') pchar++;\r
-               minor = atoi (++pchar);\r
-               break;\r
-           }\r
-       }\r
-       fclose(f);\r
-       if (major != 8) return 0; /* nothing found */\r
-       \r
-       //now check for usb-storage-MINOR\r
-       minor >>= 4; // get index from minor\r
-       sprintf (filename, "/proc/scsi/usb-storage-%d/%d", minor,minor);\r
-\r
-       if (!(f = fopen(filename, "r")))\r
-               return 0;\r
-       int count = 0;\r
-       while (fgets(buffer, STRING_SIZE, f))   {\r
-           if (strstr(buffer,"usb-storage")) count++;\r
-           if (strstr(buffer,"SCSI")) count++;\r
-           if (strstr(buffer,"Attached: Yes")) count++;\r
-       }\r
-       fclose(f);\r
-       \r
-       return (count==3 ? 1 : 0);\r
-}\r
+/*
+ * This file is part of the IPCop Firewall.
+ *
+ * IPCop is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * IPCop is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with IPCop; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ * Copyright 2002: Mark Wormgoor <mark@wormgoor.com>
+ * 
+ * $Id: usb.c,v 1.9.2.8 2005/12/10 00:18:23 franck78 Exp $
+ * 
+ */
+
+#include "install.h"
+
+int usbuhci = 0;
+int usbohci = 0;
+int ehcihcd = 0;
+
+int initialize_usb() {
+    modprobe("sd_mod");
+    modprobe("sr_mod");
+    modprobe("usb-storage");
+
+    if (ehcihcd) {
+       rmmod("ehci-hcd");
+       ehcihcd = 0;
+    }
+    if (usbohci) {
+       rmmod("usb-ohci");
+       usbohci = 0;
+    }
+    if (usbuhci) {
+       rmmod("usb-uhci");
+       usbuhci = 0;
+    }
+
+    if (modprobe("ehci-hcd") == 0) ehcihcd = 1;
+    if (modprobe("usb-ohci") == 0) usbohci = 1;
+    if (modprobe("usb-uhci") == 0) usbuhci = 1;
+
+    modprobe("hid");
+    modprobe("keybdev");
+    return 0;
+}
+
+int write_usb_modules_conf() {
+    int index = 0;
+    FILE *handle;
+
+    if (!(handle = fopen("/harddisk/etc/modules.conf", "a")))
+       return 0;
+
+#if 0 /* we don't do this yet, because one of the drivers has a problem 
+       * with it */
+    if (ehcihcd) {
+       fprintf(handle,"alias usb-controller");
+       if (index)
+               fprintf(handle,"%d",index);
+       fprintf(handle," ehci-hcd\n");
+       index++;
+    }
+#endif
+
+    if (usbohci) {
+       fprintf(handle,"alias usb-controller");
+       if (index)
+               fprintf(handle,"%d",index);
+       fprintf(handle," usb-ohci\n");
+       index++;
+    }
+
+    if (usbuhci) {
+       fprintf(handle,"alias usb-controller");
+       if (index)
+               fprintf(handle,"%d",index);
+       fprintf(handle," usb-uhci\n");
+       index++;
+    }
+    fclose(handle);
+    
+    return 0;
+}
+
+/* checkusb().
+    Scans the named partitions and returns true if USB-removable.
+    a bug? in "cat /proc/partitions" with superfloppy scheme device
+    make them appearing always with four 'false' partitions:
+    sda and sda1 sda2 sda3 sda4.
+    No easy way to decide if /dev/sda1 exists or not.
+*/
+int checkusb(char *partition)
+{
+       FILE *f = NULL;
+       char filename[STRING_SIZE];
+       char buffer[STRING_SIZE];
+       char *pchar = &buffer[0];
+       if (!(f = fopen("/proc/partitions", "r")))
+               return 0;
+
+       short int major = 0, minor = 0;                 
+       while (fgets(buffer, STRING_SIZE, f))   {
+           /* look for partition*/     
+           if (strstr (buffer, partition)) {
+               major = atoi (buffer);
+               if (major != 8) break ; /* not scsi */
+               //get minor
+               while (*pchar != '8') pchar++;
+               minor = atoi (++pchar);
+               break;
+           }
+       }
+       fclose(f);
+       if (major != 8) return 0; /* nothing found */
+       
+       //now check for usb-storage-MINOR
+       minor >>= 4; // get index from minor
+       sprintf (filename, "/proc/scsi/usb-storage-%d/%d", minor,minor);
+
+       if (!(f = fopen(filename, "r")))
+               return 0;
+       int count = 0;
+       while (fgets(buffer, STRING_SIZE, f))   {
+           if (strstr(buffer,"usb-storage")) count++;
+           if (strstr(buffer,"SCSI")) count++;
+           if (strstr(buffer,"Attached: Yes")) count++;
+       }
+       fclose(f);
+       
+       return (count==3 ? 1 : 0);
+}