From: Gilles E. <ges...@us...> - 2007-09-26 22:17:06
|
Update of /cvsroot/ipcop/ipcop/src/misc-progs In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv9205/src/misc-progs Modified Files: Tag: IPCOP_v1_4_0 ipcopbackup.c Log Message: Fix ipcopbackup when floppy controller is not disabled on mainboard and you attempt to use usb floppy. In that case, updfstab make the usb floppy appear as /dev/floppy1 So look for /dev/floppy1 if access to /dev/floppy fail As a side effect, this will make ipcopbackup work on the second floppy of a mainboard if the first floppy has no media inserted. As we now need to check /dev/floppy and /dev/floppy1, move that part of the code to a function I find that writing to disk using dd to detect a media available does not work on usb floppy, even the same dd command work from the prompt. Replacing the dd command with a simple echo to disk work, so use that. In the echo command, I need to place the redirection 2>/dev/null before the redirection to the device or an error is emitted when the media is not available Test if /dev/floppy(1) is a symlink to a real device. If not a file with /dev/floppy(1) name could be created Index: ipcopbackup.c =================================================================== RCS file: /cvsroot/ipcop/ipcop/src/misc-progs/ipcopbackup.c,v retrieving revision 1.8.2.15 retrieving revision 1.8.2.16 diff -C2 -d -r1.8.2.15 -r1.8.2.16 *** ipcopbackup.c 22 Sep 2007 06:44:01 -0000 1.8.2.15 --- ipcopbackup.c 26 Sep 2007 22:17:07 -0000 1.8.2.16 *************** *** 37,40 **** --- 37,42 ---- char temptestfilename[STRING_SIZE]; char tmpdir[STRING_SIZE]; + char command[STRING_SIZE]; + struct stat st; void exithandler(void) *************** *** 53,69 **** } int main(void) { int count, systeminclude, userinclude, tempfile; char buffer[STRING_SIZE]; - char command[STRING_SIZE]; - struct stat st; struct statvfs statvfsbuf; double spaceavailable; if (!(initsetuid())) exit(1); ! /* Error are directly displayed to the GUI, so they don't need program name */ if (close(0)) { fprintf(stderr, "Couldn't close 0\n"); exit(1); } if (open("/dev/zero", O_RDONLY) != 0) { --- 55,92 ---- } + /* Check for floppy disk in disk drive before continuing + * Check for write protected floppy by writing to disk + * Return 0 : success or 1 : no media or no device */ + int testfloppywrite(char *device) + { + /* Test if floppy dev exist as symlink to real dev before testing media + * or dd could create a file with that floppy device name */ + lstat(device, &st); + if (S_ISLNK(st.st_mode)) { + /* symlink point to a real dev, so continue */ + /* dd does not work inside ipcopbackup detecting an absent + * media on usb floppy but work with standard floppy + * replacing it with a simple echo work for me + * (at least with my USB FDC GOLD-1.11 ) Gilles */ + snprintf (command, STRING_SIZE-1, + "/bin/echo 'test' 2>/dev/null >%s", device); + return safe_system(command); /* 1 failure */ + } else { + return 1; + } + } + int main(void) { int count, systeminclude, userinclude, tempfile; char buffer[STRING_SIZE]; struct statvfs statvfsbuf; double spaceavailable; + char floppydev[13]; /* /dev/floppy or /dev/floppy1 */ if (!(initsetuid())) exit(1); ! /* Error are directly displayed to the GUI, so include program name is useless */ if (close(0)) { fprintf(stderr, "Couldn't close 0\n"); exit(1); } if (open("/dev/zero", O_RDONLY) != 0) { *************** *** 128,134 **** close (tempfile); ! /* Make sure floppy device name is up to date */ safe_system ("/usr/sbin/updfstab"); /* Test compressed files size less than maximum floppy size * Very basic, better than nothing, check only max size (1440 kB) --- 151,171 ---- close (tempfile); ! /* Make sure floppy device name is up to date ! * If a floppy controller is enabled on mainboard (even with no floppy) ! * and an usb floppy controller exist, usb floppy appear as /dev/floppy1. */ safe_system ("/usr/sbin/updfstab"); + /* Darren Critchley - check for floppy disk in disk drive before continuing */ + /* First try on /dev/floppy, if that fail, try on /dev/floppy1 */ + strcpy(floppydev, "/dev/floppy"); + if (testfloppywrite(floppydev)) { + /* test the other */ + strcpy(floppydev, "/dev/floppy1"); + if (testfloppywrite(floppydev)) { + fprintf(stderr, "Error with bad, write protected or no media in floppy drive\n" ); + exit(1); + } + } + /* Test compressed files size less than maximum floppy size * Very basic, better than nothing, check only max size (1440 kB) *************** *** 161,184 **** MAX_FLOPPY_SIZE); exit(1); - } else { - fprintf(stdout, "Backup size: %ld / %d B\n", st.st_size, MAX_FLOPPY_SIZE); - fflush(stdout); /* ensure Backup size will be displayed first on GUI*/ } unlink (temptestfilename); - /* Darren Critchley - check for floppy disk in disk drive before continuing */ - /* Test too write protected floppy */ - snprintf (command, STRING_SIZE-1, - "dd if=/dev/zero of=/dev/floppy bs=1k count=1 2> /dev/null"); - if (safe_system(command)) { - fprintf(stderr,"Error with bad, write protected or no floppy in drive\n" ); - exit(1); - } - /* Clearing disk */ snprintf (command, STRING_SIZE-1, ! "/bin/dd if=/dev/zero of=/dev/floppy bs=1k 2> /dev/null"); safe_system (command); /* Start tarring files to floppy */ snprintf (command, STRING_SIZE-1, --- 198,212 ---- MAX_FLOPPY_SIZE); exit(1); } unlink (temptestfilename); /* Clearing disk */ snprintf (command, STRING_SIZE-1, ! "/bin/dd if=/dev/zero of=%s bs=1k 2> /dev/null", floppydev); safe_system (command); + fprintf(stdout, "%s Backup size: %ld / %d B\n", floppydev, st.st_size, MAX_FLOPPY_SIZE); + fflush(stdout); /* ensure Backup size will be displayed first on GUI*/ + /* Start tarring files to floppy */ snprintf (command, STRING_SIZE-1, *************** *** 186,191 **** " -X " CONFIG_ROOT "/backup/exclude.system" " -X " CONFIG_ROOT "/backup/exclude.user" ! " -C / -czf /dev/floppy &>/dev/null", ! tempincfilename); safe_system (command); --- 214,219 ---- " -X " CONFIG_ROOT "/backup/exclude.system" " -X " CONFIG_ROOT "/backup/exclude.user" ! " -C / -czf %s &>/dev/null", ! tempincfilename, floppydev); safe_system (command); *************** *** 200,204 **** /* Test untarring files from compressed archive */ ! snprintf (command, STRING_SIZE-1, "/bin/tar -C %s -xzvf /dev/floppy", tmpdir); if (safe_system (command)) { fprintf (stderr, "Error while verifying backup\n"); --- 228,232 ---- /* Test untarring files from compressed archive */ ! snprintf (command, STRING_SIZE-1, "/bin/tar -C %s -xzvf %s", tmpdir, floppydev); if (safe_system (command)) { fprintf (stderr, "Error while verifying backup\n"); |