From d6aaa55d70613baaf1a0925b6e4984fff60e7367 Mon Sep 17 00:00:00 2001 From: ms Date: Thu, 16 Feb 2006 21:18:00 +0000 Subject: [PATCH] =?utf8?q?Neuer=20Installer=20eingef=C3=BCgt...?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.ipfire.org/svn/ipfire/1.4/source@37 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- src/install+setup/install/cdrom.c | 72 +- src/install+setup/install/config.c | 250 +- src/install+setup/install/ide.c | 122 +- src/install+setup/install/install.h | 184 +- src/install+setup/install/install2.c | 837 ++++--- src/install+setup/install/main.c | 2102 ++++++++--------- src/install+setup/install/net.c | 154 +- src/install+setup/install/nic.c | 196 +- src/install+setup/install/pcmcia.c | 664 +++--- src/install+setup/install/pcmcia.h | 1228 +++++----- src/install+setup/install/probescsi.sh | 128 +- src/install+setup/install/scsi.c | 56 +- src/install+setup/install/upgrade-v12-v13.c | 680 +++--- src/install+setup/install/upgrade-v130-v140.c | 1154 ++++----- src/install+setup/install/usb.c | 282 +-- 15 files changed, 4049 insertions(+), 4060 deletions(-) diff --git a/src/install+setup/install/cdrom.c b/src/install+setup/install/cdrom.c index eb21c8601..f0510e92f 100644 --- a/src/install+setup/install/cdrom.c +++ b/src/install+setup/install/cdrom.c @@ -1,36 +1,36 @@ -/* 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; -} +/* 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; +} diff --git a/src/install+setup/install/config.c b/src/install+setup/install/config.c index bd9bea285..89cfa5921 100644 --- a/src/install+setup/install/config.c +++ b/src/install+setup/install/config.c @@ -1,125 +1,125 @@ -/* 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; -} +/* 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; +} diff --git a/src/install+setup/install/ide.c b/src/install+setup/install/ide.c index 05e4ee748..dfde3a983 100644 --- a/src/install+setup/install/ide.c +++ b/src/install+setup/install/ide.c @@ -1,61 +1,61 @@ -/* 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'; -} - +/* 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'; +} + diff --git a/src/install+setup/install/install.h b/src/install+setup/install/install.h index a58304942..c04984fb5 100644 --- a/src/install+setup/install/install.h +++ b/src/install+setup/install/install.h @@ -1,92 +1,92 @@ -/* 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[]; +/* 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[]; diff --git a/src/install+setup/install/install2.c b/src/install+setup/install/install2.c index 18ffc97a1..b724c9e02 100644 --- a/src/install+setup/install/install2.c +++ b/src/install+setup/install/install2.c @@ -1,424 +1,413 @@ -/* 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.3 2006/01/31 00:51:50 franck78 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(int upgrade_level) { - mysystem("/bin/chroot /harddisk /bin/cp -af "TMP_EXTRACT_CH"/. /"); - /* Upgrade necessary files from v1.2 to v1.3 to v1.4 */ - switch (upgrade_level) { - case 1: - upgrade_v12_v13(); - upgrade_v130_v140(); - case 2: //some 1.4 files format changed - //between 1.4.0 & 1.4.11 If possible de determine backup/version - //the update code should go here - } -} - -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]); -/* - // build now the device node - runcommandwithstatus("echo 'cd /dev; ./make_devices'>/harddisk/X;" - "chroot /harddisk chmod +x /X;" - "chroot /harddisk /X;" - "chroot /harddisk rm /X" - , ctr[TR_INSTALLING_FILES]); -*/ - /* 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(0); - 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(1); - 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; -} - +/* 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; +} + diff --git a/src/install+setup/install/main.c b/src/install+setup/install/main.c index e3d9772a7..4b17e2e18 100644 --- a/src/install+setup/install/main.c +++ b/src/install+setup/install/main.c @@ -1,1051 +1,1051 @@ -/* 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-.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); -} +/* 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-.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); +} diff --git a/src/install+setup/install/net.c b/src/install+setup/install/net.c index 296b0fe95..2aa84d5d1 100644 --- a/src/install+setup/install/net.c +++ b/src/install+setup/install/net.c @@ -1,77 +1,77 @@ -/* 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; -} +/* 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; +} diff --git a/src/install+setup/install/nic.c b/src/install+setup/install/nic.c index 5ae74e56d..23c90f59e 100644 --- a/src/install+setup/install/nic.c +++ b/src/install+setup/install/nic.c @@ -1,98 +1,98 @@ -/* 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 -#include -#include - -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; -} - +/* 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 +#include +#include + +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; +} + diff --git a/src/install+setup/install/pcmcia.c b/src/install+setup/install/pcmcia.c index 4bf5432e2..048f97989 100644 --- a/src/install+setup/install/pcmcia.c +++ b/src/install+setup/install/pcmcia.c @@ -1,332 +1,332 @@ -/* - * 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 - * . 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 -#else -#include -#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; -} +/* + * 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 + * . 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 +#else +#include +#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; +} diff --git a/src/install+setup/install/pcmcia.h b/src/install+setup/install/pcmcia.h index 7b81dc4dc..d172caa1c 100644 --- a/src/install+setup/install/pcmcia.h +++ b/src/install+setup/install/pcmcia.h @@ -1,614 +1,614 @@ -/* - * 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 - * . 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; +/* + * 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 + * . 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; diff --git a/src/install+setup/install/probescsi.sh b/src/install+setup/install/probescsi.sh index 6b1cd598c..54256cd28 100644 --- a/src/install+setup/install/probescsi.sh +++ b/src/install+setup/install/probescsi.sh @@ -1,64 +1,64 @@ -#!/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 +#!/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 diff --git a/src/install+setup/install/scsi.c b/src/install+setup/install/scsi.c index 495030ad1..96bf787d5 100644 --- a/src/install+setup/install/scsi.c +++ b/src/install+setup/install/scsi.c @@ -1,28 +1,28 @@ -/* 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 - * - * $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 ); -} +/* 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 + * + * $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 ); +} diff --git a/src/install+setup/install/upgrade-v12-v13.c b/src/install+setup/install/upgrade-v12-v13.c index b8e838ee7..7ba750148 100644 --- a/src/install+setup/install/upgrade-v12-v13.c +++ b/src/install+setup/install/upgrade-v12-v13.c @@ -1,340 +1,340 @@ -/* - * 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 - * - * $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; -} +/* + * 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 + * + * $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; +} diff --git a/src/install+setup/install/upgrade-v130-v140.c b/src/install+setup/install/upgrade-v130-v140.c index adcd2366f..1437877e0 100644 --- a/src/install+setup/install/upgrade-v130-v140.c +++ b/src/install+setup/install/upgrade-v130-v140.c @@ -1,577 +1,577 @@ -/* - * 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 - * - * $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, "", 11)) { - already_upgraded = 1; - } - } - - rewind(eaglereadfile); - if (!already_upgraded) - fprintf(eaglewritefile, "\n"); - while (fgets (eagletemp, STRING_SIZE, eaglereadfile) != NULL) - fputs(eagletemp, eaglewritefile); - if (!already_upgraded) - fprintf(eaglewritefile, "\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; -} +/* + * 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 + * + * $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, "", 11)) { + already_upgraded = 1; + } + } + + rewind(eaglereadfile); + if (!already_upgraded) + fprintf(eaglewritefile, "\n"); + while (fgets (eagletemp, STRING_SIZE, eaglereadfile) != NULL) + fputs(eagletemp, eaglewritefile); + if (!already_upgraded) + fprintf(eaglewritefile, "\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; +} diff --git a/src/install+setup/install/usb.c b/src/install+setup/install/usb.c index 61bf4b7ca..90bba2caf 100644 --- a/src/install+setup/install/usb.c +++ b/src/install+setup/install/usb.c @@ -1,141 +1,141 @@ -/* - * 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 - * - * $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); -} +/* + * 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 + * + * $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); +} -- 2.39.2