From d17bc87aa9db6895e99b3a8c5f46ae934fc931fa Mon Sep 17 00:00:00 2001 From: Olivier Blin Date: Mon, 4 Jun 2007 13:48:15 +0000 Subject: add Flash rescue (from Brazilian team) --- rescue-Flash/build | 32 ++++ rescue-Flash/flash-rescue-gui.c | 274 ++++++++++++++++++++++++++++++++ rescue-Flash/scripts/backup_systemloop | 106 ++++++++++++ rescue-Flash/scripts/clear_systemloop | 85 ++++++++++ rescue-Flash/scripts/rescue_common | 149 +++++++++++++++++ rescue-Flash/scripts/reset_rootpass | 100 ++++++++++++ rescue-Flash/scripts/reset_userpass | 111 +++++++++++++ rescue-Flash/scripts/restore_systemloop | 167 +++++++++++++++++++ rescue-Flash/scripts/test_badblocks | 69 ++++++++ 9 files changed, 1093 insertions(+) create mode 100755 rescue-Flash/build create mode 100644 rescue-Flash/flash-rescue-gui.c create mode 100755 rescue-Flash/scripts/backup_systemloop create mode 100755 rescue-Flash/scripts/clear_systemloop create mode 100644 rescue-Flash/scripts/rescue_common create mode 100755 rescue-Flash/scripts/reset_rootpass create mode 100755 rescue-Flash/scripts/reset_userpass create mode 100755 rescue-Flash/scripts/restore_systemloop create mode 100755 rescue-Flash/scripts/test_badblocks diff --git a/rescue-Flash/build b/rescue-Flash/build new file mode 100755 index 000000000..cc6ece4d1 --- /dev/null +++ b/rescue-Flash/build @@ -0,0 +1,32 @@ +#!/bin/sh + +output_name="FLASHRESCUE" +output_file="flashrescue.iso" + +rm -f $output + +echo -n "Gerando imagem ISO de $output_name: " + +cd root + +genisoimage -o ../$output_file \ + -b i586/isolinux/isolinux.bin \ + -c i586/isolinux/boot.cat \ + -input-charset ISO-8859-1 \ + -no-emul-boot \ + -boot-load-size 4 \ + -J -R -l \ + -quiet \ + -V $output_name \ + -boot-info-table . + +if [ $? -eq 0 ]; then + output_size=$(ls -lah ../$output_file | awk '{ print $5 }') + echo "ok [$output_size]." + md5=$(md5sum ../$output_file | awk '{ print $1 }') + echo " md5: $md5" +else + echo "erro." +fi + +cd - > /dev/null diff --git a/rescue-Flash/flash-rescue-gui.c b/rescue-Flash/flash-rescue-gui.c new file mode 100644 index 000000000..f2e17d6a3 --- /dev/null +++ b/rescue-Flash/flash-rescue-gui.c @@ -0,0 +1,274 @@ +/* + * Guillaume Cottenceau (gc@mandrakesoft.com) + * + * Copyright 2001-2007 Mandrakesoft + * + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#define _USE_BSD +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "config-stage1.h" +#include "frontend.h" +#include "tools.h" + +#ifndef LINE_MAX +#define LINE_MAX 2048 +#endif + +char * env[] = { + "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin", + "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib:/usr/X11R6/lib:/mnt/usr/X11R6/lib", + "HOME=/", + "TERM=linux", + "TERMINFO=/etc/terminfo", + NULL +}; + +/* pause() already exists and causes the invoking process to sleep + until a signal is received */ +static void PAUSE(void) +{ + unsigned char t; + fflush(stdout); + read(0, &t, 1); +} + +/* this is duplicated from `init.c', don't edit here */ +static inline _syscall3(int, reboot, int, magic, int, magic2, int, flag); + +#define LOOP_CLR_FD 0x4C01 + +void del_loop(char *device) +{ + int fd; + if ((fd = open(device, O_RDONLY, 0)) < 0) { + printf("del_loop open failed\n"); + return; + } + + if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { + printf("del_loop ioctl failed"); + return; + } + + close(fd); +} + +struct filesystem { + char * dev; + char * name; + char * fs; + int mounted; +}; + +void unmount_filesystems(void) +{ + struct filesystem fs[500]; + int i, nb, fd, size, numfs = 0; + char *buf, *p; + + printf("unmounting filesystems...\n"); + + fd = open("/proc/mounts", O_RDONLY, 0); + if (fd == -1) { + printf("ERROR: failed to open /proc/mounts"); + sleep(2); + return; + } + + buf = (char *) malloc(LINE_MAX); + if (buf == NULL) { + printf("ERROR: not enough memory"); + sleep(2); + return; + } + bzero(buf, LINE_MAX); + size = read(fd, buf, LINE_MAX - 1); + close(fd); + + p = buf; + while (*p) { + + fs[numfs].mounted = 1; + fs[numfs].dev = p; + while (*p != ' ') + p++; + + *p++ = '\0'; + fs[numfs].name = p; + while (*p != ' ') + p++; + + *p++ = '\0'; + fs[numfs].fs = p; + while (*p != ' ') + p++; + + *p++ = '\0'; + while (*p != '\n') + p++; + p++; + if (strcmp(fs[numfs].name, "/") != 0) + /* skip if root, no need to take initrd root + in account */ + numfs++; + } + + /* multiple passes trying to umount everything */ + do { + nb = 0; + for (i = 0; i < numfs; i++) { + if (fs[i].mounted && umount(fs[i].name) == 0) { + if (strncmp(fs[i].dev + sizeof("/dev/") - 1, + "loop", sizeof("loop") - 1) == 0) + del_loop(fs[i].dev); + + printf("\t%s\n", fs[i].name); + fs[i].mounted = 0; + nb++; + } + } + } while (nb); + + for (i = nb = 0; i < numfs; i++) { + if (fs[i].mounted) { + printf("\t%s umount failed\n", fs[i].name); + if (strcmp(fs[i].fs, "ext2") == 0) + /* don't count not-ext2 umount failed */ + nb++; + } + } + + if (nb) { + printf("failed to umount some filesystems\n"); + while (1); + } +} + +void probe_that_type(void) { } + +int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))) +{ + enum return_type results; + + char rootpass[] = "Reset Root Password"; + char userpass[] = "Reset User Password"; + char factory[] = "Reset to Factory Defaults"; + char backup[] = "Backup User Files"; + char restore[] = "Restore User Files from Backup"; + char badblocks[] = "Test Key for Badblocks"; + char reboot_[] = "Reboot"; + + char * actions[] = { rootpass, userpass, factory, backup, restore, + badblocks, reboot_, NULL }; + char * choice; + + init_frontend("Welcome to " DISTRIB_NAME " Rescue (" + DISTRIB_VERSION ") " __DATE__ " " __TIME__); + + do { + int pid; + char * binary = NULL; + + choice = ""; + results = ask_from_list("Please choose the desired action.", + actions, &choice); + + if (ptr_begins_static_str(choice, rootpass)) { + binary = "/usr/bin/reset_rootpass"; + } + if (ptr_begins_static_str(choice, userpass)) { + binary = "/usr/bin/reset_userpass"; + } + if (ptr_begins_static_str(choice, factory)) { + binary = "/usr/bin/clear_systemloop"; + } + if (ptr_begins_static_str(choice, backup)) { + binary = "/usr/bin/backup_systemloop"; + } + if (ptr_begins_static_str(choice, restore)) { + binary = "/usr/bin/restore_systemloop"; + } + if (ptr_begins_static_str(choice, badblocks)) { + binary = "/usr/bin/test_badblocks"; + } + if (ptr_begins_static_str(choice, reboot_)) { + finish_frontend(); + sync(); sync(); + sleep(2); + unmount_filesystems(); + sync(); sync(); + printf("rebooting system\n"); + sleep(2); + reboot(0xfee1dead, 672274793, 0x01234567); + } + + if (binary) { + + int wait_status; + + suspend_to_console(); + pid = fork(); + if (pid == -1) { /* error forking */ + + printf("Can't fork()\n"); + return 33; + + } else if (pid == 0) { /* child */ + + char * child_argv[2]; + child_argv[0] = binary; + child_argv[1] = NULL; + + execve(child_argv[0], child_argv, env); + printf("Can't execute binary (%s)\n\n", binary); + PAUSE(); + + return 33; + } else { /* parent */ + + while (wait4(-1, &wait_status, 0, NULL) != pid) + ; + + printf(""); + PAUSE(); + resume_from_suspend(); + if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) { + error_message("Program exited abnormally (return code %d).", + WEXITSTATUS(wait_status)); + if (WIFSIGNALED(wait_status)) + error_message("(received signal %d)", + WTERMSIG(wait_status)); + } + } + } + + } while (results == RETURN_OK); + + finish_frontend(); + printf("Bye.\n"); + + return 0; +} diff --git a/rescue-Flash/scripts/backup_systemloop b/rescue-Flash/scripts/backup_systemloop new file mode 100755 index 000000000..65c3185e6 --- /dev/null +++ b/rescue-Flash/scripts/backup_systemloop @@ -0,0 +1,106 @@ +#!/bin/bash + +# import functions library +source rescue_common + +tmpdir="/tmp/flash-rescue-root" +rootdir="$tmpdir/pen" + +function prepare() { + + mkdir -p $rootdir + + if ! mount_usbroot $rootdir; then + return 1 + fi + + if [ x"$version" = x"1.0" ]; then + mkdir -p $tmpdir/shared + if ! mount_sharedroot $tmpdir/shared; then + return 1 + fi + fi + + if [ ! -d $dir ]; then + mkdir $dir + fi + + return 0 +} + +function doit() { + + clear + echo + echo -n 'Creating backup file. This can take some time: ' + + bzip2 -c $loop > $target 2> /tmp/rescue-backup.err & + + sleep 2 + + while ps | grep -q bzip2; do + progress + done + + sync + + echo + echo + + errsize=$(ls -la /tmp/rescue-backup.err | cut -d' ' -f5) + if [ $errsize -ne 0 ]; then + echo "Error compressing user files into $target" + return 1 + else + echo 'Backup file created!' + fi + + echo + + return 0 +} + +function cleanup() { + + if [ x"$version" = x"1.0" ]; then + umount $tmpdir/shared > /dev/null 2>&1 + rmdir $tmpdir/shared + fi + + umount $rootdir > /dev/null 2>&1 + rmdir $rootdir $tmpdir 2> /dev/null + + return 0 +} + +clear +trap cleanup SIGINT + +version="" +if ! insert_pendrive; then + exit 1 +fi + +if [ x"$version" = x"1.0" ]; then + dir="$tmpdir/shared/backup" + loop="$rootdir/loopbacks/system.loop" +else + dir="$rootdir/backup" + loop="$rootdir/.loopbacks/system.loop" +fi + +file="backup-$(date +%Y%m%d).bz2" +target="$dir/$file" + +if ! prepare; then + cleanup + exit 1 +fi + +if ! doit; then + cleanup + exit 1 +fi + +cleanup +exit 0 diff --git a/rescue-Flash/scripts/clear_systemloop b/rescue-Flash/scripts/clear_systemloop new file mode 100755 index 000000000..159f22119 --- /dev/null +++ b/rescue-Flash/scripts/clear_systemloop @@ -0,0 +1,85 @@ +#!/bin/bash + +# import functions library +source rescue_common + +tmpdir="/tmp/flash-rescue-root" +rootdir="$tmpdir/pen" + +function prepare() { + + mkdir -p $rootdir + + if ! mount_usbroot $rootdir; then + return 1 + fi + + return 0 +} + +function doit() { + + clear + echo + echo "WARNING!" + echo + echo "Mandriva Flash will be reseted to factory defaults!" + echo -n "All user files, customizations and new packages installed " + echo "will be removed." + echo + echo -n "Do you want to continue? [N/y] " + read confirm + + if [ x"$confirm" = x"y" -o x"$confirm" = x"Y" ]; then + + if [ ! -f $loop ]; then + dd if=/dev/zero of=$loop bs=4000000 count=100 + fi + + /sbin/mkfs.ext2 -q -F $loop + + echo + if [ $? -ne 0 ]; then + echo 'Error reseting device to factory defaults' + return 1 + else + echo 'Mandriva Flash was restored to factory defaults!' + fi + fi + + echo + + return 0 +} + +function cleanup() { + + umount $rootdir > /dev/null 2>&1 + rmdir $rootdir $tmpdir 2> /dev/null +} + +clear +trap cleanup SIGINT + +version="" +if ! insert_pendrive; then + exit 1 +fi + +if [ x"$version" = x"1.0" ]; then + loop="$rootdir/loopbacks/system.loop" +else + loop="$rootdir/.loopbacks/system.loop" +fi + +if ! prepare; then + cleanup + exit 1 +fi + +if ! doit; then + cleanup + exit 1 +fi + +cleanup diff --git a/rescue-Flash/scripts/rescue_common b/rescue-Flash/scripts/rescue_common new file mode 100644 index 000000000..61718d52c --- /dev/null +++ b/rescue-Flash/scripts/rescue_common @@ -0,0 +1,149 @@ +#!/bin/bash + +function detect_version() { + + _tmpdir="/tmp/$$" + + mkdir -p $_tmpdir + + nash --force > /dev/null 2>&1 < /dev/null + rmdir $_tmpdir 2> /dev/null +} + +function check_vendor() { + + # list of supported vendors/models + + # mandriva flash 1.0 (france) + vendors[0]="13fe" + models[0]="1a00" + # mandriva flash 1.0 (brazil) + vendors[1]="0930" + models[1]="653e" + # mandriva flash 4GB (france) + vendors[2]="13fe" + models[2]="1d00" + + rc=1 + + mount -t usbfs none /proc/bus/usb + + i=0 + while [ ! -z "${vendors[$i]}" ]; do + + grep "P:" /proc/bus/usb/devices | grep -q \ + "Vendor=${vendors[$i]} ProdID=${models[$i]}" + if [ $? -eq 0 ]; then + rc=0 + break + fi + + let i++ + done + + umount /proc/bus/usb + + return $rc +} + +function insert_pendrive() { + + _tmpdir="/tmp/rescue-temp" + mkdir -p $_tmpdir + + modprobe usb-storage > /dev/null 2>&1 + modprobe vfat > /dev/null 2>&1 + + echo + echo -n 'Please insert your Mandriva Flash pen drive and press ENTER when ready: ' + read READY + echo + echo -n 'Detecting pen drive: ' + + for ((i=0; $i <= 15 ; i++)); do + nash --force > /dev/null 2>&1 < /dev/null + return 1 + fi + + cat /proc/mounts | grep $_tmpdir | cut -d' ' -f1 | \ + sed 's/[0-9]*$//g' > /tmp/rescue-device + umount $_tmpdir + rmdir $_tmpdir 2> /dev/null + + detect_version + + return 0 + fi + done + + rmdir $_tmpdir 2> /dev/null + + echo + echo + echo "Couldn't detect Mandriva Flash pen drive!" + echo + + return 1 +} + +function mount_usbroot() { + + nash --force > /dev/null 2>&1 < /dev/null 2>&1 < /dev/null 2>&1 + modprobe squashfs > /dev/null 2>&1 + modprobe loop > /dev/null 2>&1 + + mkdir -p $rootdir + mkdir -p $tmpdir/squash + mkdir -p $tmpdir/user + mkdir -p $tmpdir/union + + if ! mount_usbroot $rootdir; then + return 1 + fi + + mount -t squashfs -o loop $sfs_loop $tmpdir/squash > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "Error mounting distrib.sqfs" + return 1 + fi + + mount -t ext2 -o loop $sys_loop $tmpdir/user > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "Error mounting system.loop" + return 1 + fi + + mount -t unionfs -o dirs=$tmpdir/user=rw:$tmpdir/squash=ro \ + none $tmpdir/union + if [ $? -ne 0 ]; then + echo "Error creating union of distrib.sqfs and system.loop" + return 1 + fi + + chroot $tmpdir/union /etc/init.d/keytable start &> /dev/null + chroot $tmpdir/union /usr/bin/unicode_start + + return 0 +} + +function doit() { + + clear + echo + chroot $tmpdir/union passwd root + echo + echo + + return 0 +} + +function cleanup() { + + chroot $tmpdir/union /usr/bin/unicode_stop + + umount $tmpdir/union > /dev/null 2>&1 + umount $tmpdir/user > /dev/null 2>&1 + umount $tmpdir/squash > /dev/null 2>&1 + umount $rootdir > /dev/null 2>&1 + + rmdir $tmpdir/union $tmpdir/user $tmpdir/squash 2> /dev/null + rmdir $rootdir $tmpdir 2> /dev/null +} + +clear +trap cleanup SIGINT + +version="" +if ! insert_pendrive; then + exit 1 +fi + +if [ x"$version" = x"1.0" ]; then + sys_loop="$rootdir/loopbacks/system.loop" + sfs_loop="$rootdir/loopbacks/distrib.sqfs" +else + sys_loop="$rootdir/.loopbacks/system.loop" + sfs_loop="$rootdir/.loopbacks/distrib.sqfs" +fi + +if ! prepare; then + cleanup + exit 1 +fi + +if ! doit; then + cleanup + exit 1 +fi + +cleanup +exit 0 diff --git a/rescue-Flash/scripts/reset_userpass b/rescue-Flash/scripts/reset_userpass new file mode 100755 index 000000000..d34b629bf --- /dev/null +++ b/rescue-Flash/scripts/reset_userpass @@ -0,0 +1,111 @@ +#!/bin/bash + +# import functions library +source rescue_common + +tmpdir="/tmp/flash-rescue-root" +rootdir="$tmpdir/pen" + +function prepare() { + + modprobe unionfs > /dev/null 2>&1 + modprobe squashfs > /dev/null 2>&1 + modprobe loop > /dev/null 2>&1 + + mkdir -p $rootdir + mkdir -p $tmpdir/squash + mkdir -p $tmpdir/user + mkdir -p $tmpdir/union + + if ! mount_usbroot $rootdir; then + return 1 + fi + + mount -t squashfs -o loop $sfs_loop $tmpdir/squash > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "Error mounting distrib.sqfs" + return 1 + fi + + mount -t ext2 -o loop $sys_loop $tmpdir/user > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "Error mounting system.loop" + return 1 + fi + + mount -t unionfs -o dirs=$tmpdir/user=rw:$tmpdir/squash=ro \ + none $tmpdir/union > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "Error creating union of distrib.sqfs and system.loop" + return 1 + fi + + chroot $tmpdir/union /etc/init.d/keytable start &> /dev/null + chroot $tmpdir/union /usr/bin/unicode_start + + return 0 +} + +function doit() { + + username=$(tail -1 $tmpdir/union/etc/passwd | cut -d ':' -f1) + + clear + echo + echo -n "What is your username? [$username] " + read name + + if [ -z "$name" ]; then + name="$username" + fi + + echo + echo + chroot $tmpdir/union passwd $name + echo + echo + + return 0 +} + +function cleanup() { + + chroot $tmpdir/union /usr/bin/unicode_stop + + umount $tmpdir/union > /dev/null 2>&1 + umount $tmpdir/user > /dev/null 2>&1 + umount $tmpdir/squash > /dev/null 2>&1 + umount $rootdir > /dev/null 2>&1 + + rmdir $tmpdir/union $tmpdir/user $tmpdir/squash 2> /dev/null + rmdir $rootdir $tmpdir 2> /dev/null +} + +clear +trap cleanup SIGINT + +version="" +if ! insert_pendrive; then + exit 1 +fi + +if [ x"$version" = x"1.0" ]; then + sys_loop="$rootdir/loopbacks/system.loop" + sfs_loop="$rootdir/loopbacks/distrib.sqfs" +else + sys_loop="$rootdir/.loopbacks/system.loop" + sfs_loop="$rootdir/.loopbacks/distrib.sqfs" +fi + +if ! prepare; then + cleanup + exit 1 +fi + +if ! doit; then + cleanup + exit 1 +fi + +cleanup +exit 0 diff --git a/rescue-Flash/scripts/restore_systemloop b/rescue-Flash/scripts/restore_systemloop new file mode 100755 index 000000000..39c56e030 --- /dev/null +++ b/rescue-Flash/scripts/restore_systemloop @@ -0,0 +1,167 @@ +#!/bin/bash + +# import functions library +source rescue_common + +tmpdir="/tmp/flash-rescue-root" +rootdir="$tmpdir/pen" + +function prepare() { + + mkdir -p $rootdir + + if ! mount_usbroot $rootdir; then + return 1 + fi + + if [ x"$version" = x"1.0" ]; then + mkdir -p $tmpdir/shared + if ! mount_sharedroot $tmpdir/shared; then + return 1 + fi + fi + + return 0 +} + +function doit() { + + if [ ! -d $dir ]; then + echo + echo "Can't find a backup directory in the Share partition" + echo + return 0 + fi + + cd $dir + i=1 + for file in $(ls -c1 backup-*.bz2 2> /dev/null | sort -r | head -10); do + files[$i]="$file" + let i++ + done + cd - > /dev/null + + if [ $i -eq 1 ]; then + echo + echo 'No backup files found!' + echo + return 0 + fi + + while [ true ]; do + + clear + echo + echo "The following backup files were found:" + echo + + i=1 + while [ -n "${files[$i]}" ]; do + echo "[$i] ${files[$i]}" + let i++ + done + let i-- + echo + echo '[0] Cancel / Return to main menu' + + echo + echo 'Select from the list above, the file that you want to restore.' + echo 'The most recent files come first in the list.' + echo + echo -n "What backup file do you want to restore? [1] " + read option + + if [ -z "$option" ]; then + option=1 + fi + if [ x"$option" = x"0" ]; then + return 0 + fi + + if [ ! -f $dir/${files[$option]} ]; then + echo + echo "Error reading backup file ${files[$option]}!" + echo + echo -n 'Do you want to restore another backup file? [N/y] ' + read confirm + + if [ x"$confirm" = x"y" -o x"$confirm" = x"Y" ]; then + continue + else + return 0 + fi + else + + echo + echo -n 'Restoring backup file. This can take some time: ' + + bunzip2 -c $dir/${files[$option]} > $loop \ + 2> /tmp/rescue-backup.err & + + sleep 2 + + while ps | grep -q bunzip2; do + progress + done + + sync + echo + echo + + errsize=$(ls -la /tmp/rescue-backup.err | cut -d' ' -f5) + if [ $errsize -ne 0 ]; then + echo 'Error restoring user files!' + echo + return 1 + else + echo 'Backup file restored!' + echo + break + fi + fi + done + + return 0 +} + +function cleanup() { + + if [ x"$version" = x"1.0" ]; then + umount $tmpdir/shared > /dev/null 2>&1 + rmdir $tmpdir/shared 2> /dev/null + fi + + umount $rootdir > /dev/null 2>&1 + rmdir $rootdir $tmpdir 2> /dev/null + + return 0 +} + +clear +trap cleanup SIGINT + +version="" +if ! insert_pendrive; then + exit 1 +fi + +if [ x"$version" = x"1.0" ]; then + dir="$tmpdir/shared/backup" + loop="$rootdir/loopbacks/system.loop" +else + dir="$rootdir/backup" + loop="$rootdir/.loopbacks/system.loop" +fi + +if ! prepare; then + cleanup + exit 1 +fi + +if ! doit; then + cleanup + exit 1 +fi + +cleanup +exit 0 diff --git a/rescue-Flash/scripts/test_badblocks b/rescue-Flash/scripts/test_badblocks new file mode 100755 index 000000000..3fb1f34d8 --- /dev/null +++ b/rescue-Flash/scripts/test_badblocks @@ -0,0 +1,69 @@ +#!/bin/bash + +# import functions library +source rescue_common + +tmpdir="/tmp/flash-rescue-root" +rootdir="$tmpdir/pen" + +function prepare() { + + return 0 +} + +function doit() { + + clear + echo + echo "WARNING!" + echo + echo "Searching for bad blocks in Mandriva Flash is a slow process." + echo + echo -n "Do you want to continue? [N/y] " + read confirm + + echo + echo + + device=$(cat /tmp/rescue-device) + + if [ x"$confirm" = x"y" -o x"$confirm" = x"Y" ]; then + + /sbin/badblocks -n -v -s ${device}1 + if [ x"$version" = x"1.0" ]; then + /sbin/badblocks -n -v -s ${device}2 + fi + fi + + echo + echo 'Bad blocks scan completed!' + echo + + return 0 +} + +function cleanup() { + + umount $rootdir > /dev/null 2>&1 + rmdir $rootdir $tmpdir 2> /dev/null +} + +clear +trap cleanup SIGINT + +version="" +if ! insert_pendrive; then + exit 1 +fi + +if ! prepare; then + cleanup + exit 1 +fi + +if ! doit; then + cleanup + exit 1 +fi + +cleanup -- cgit v1.2.1