summaryrefslogtreecommitdiff
path: root/mclasserase.c
diff options
context:
space:
mode:
Diffstat (limited to 'mclasserase.c')
-rw-r--r--mclasserase.c351
1 files changed, 351 insertions, 0 deletions
diff --git a/mclasserase.c b/mclasserase.c
new file mode 100644
index 0000000..fb610eb
--- /dev/null
+++ b/mclasserase.c
@@ -0,0 +1,351 @@
+/* Copyright 2003 Stefan Feuz, Lukas Meyer, Thomas Locher
+ * Copyright 2004,2006,2007,2009 Alain Knaff.
+ * This file is part of mtools.
+ *
+ * Mtools 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Mtools 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 Mtools. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Filename:
+ * mclasserase.c
+ *
+ * Original Creation Date:
+ * 05.III.2003
+ *
+ * Copyright:
+ * GPL
+ *
+ * Programmer:
+ * Stefan Feuz, Lukas Meyer, Thomas Locher
+ */
+
+#include "sysincludes.h"
+#include "msdos.h"
+#include "mtools.h"
+#include "vfat.h"
+#include "mainloop.h"
+#include "fsP.h"
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#include "file.h"
+
+#include <unistd.h>
+#include <stdio.h>
+
+/**
+ * Prints the Usage Message to STDOUT<br>
+ *
+ * @author stefan feuz<br>
+ * stefan.feuz@ruag.com
+ *
+ * @param n.a.
+ *
+ * @returns n.a.
+ *
+ */
+static void usage(int ret) NORETURN;
+static void usage(int ret)
+{
+ fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate);
+ fprintf(stderr, "Usage: %s [-d] drive:\n", progname);
+ exit(ret);
+}
+
+/**
+ * Delete all files on a Drive.<br>
+ *
+ * @author Lukas Meyer<br>
+ * lukas.meyer@ruag.com
+ * @version 0.4, 11.12.2003
+ *
+ * @param drive the drive to erase
+ * @param debug 1: stop after each erase cycle, 0: normal mode
+ *
+ * @returns n.a.
+ *
+ */
+static void do_mclasserase(char drive,int debug)
+{
+ struct device dev; /* Device information structure */
+ union bootsector boot;
+
+ int media; /* Just used to enter some in find_device */
+ char name[EXPAND_BUF];
+ Stream_t *Stream;
+ struct label_blk_t *labelBlock;
+
+ FILE * fDevice; /* Stores device's file descriptor */
+
+ char cCardType[12];
+
+ char drivel[3]; /* Stores the drive letter */
+
+
+ int i = 0;
+
+ /* FILE *forf; */
+
+ char dummy[2]; /* dummy input for debugging purposes.. */
+ int icount=0;
+ int iTotalErase = 0;
+
+ const int cycles = 3; /* How many times we'll overwrite the media */
+ char odat[cycles]; /* Data for each overwrite procedure */
+
+ /* Creating values for overwrite */
+ odat[0]=0xff;
+ odat[1]=0x00;
+ odat[2]=0xff;
+
+
+ if (debug == 1)
+ printf("cycles: %i, odats: %i,%i,%i\n",cycles,odat[0],odat[1],odat[2]);
+
+
+
+ /* Reading parameters from card. Exit with -1 if failed. */
+ if(! (Stream = find_device(drive, O_RDONLY, &dev, &boot,
+ name, &media, 0, NULL)))
+ exit(1);
+
+ FREE(&Stream);
+
+ /* Determine the FAT - type */
+#if 0
+ if(WORD(fatlen)) {
+ labelBlock = &bbelBlock = &boot->ext.old.labelBlock;
+ } else {
+ labelBlock = &boot->ext.fat32.labelBlock;
+ }
+#endif
+
+ /* we use only FAT12/16 ...*/
+ labelBlock = &boot.boot.ext.old.labelBlock;
+
+ /* store card type */
+ sprintf(cCardType, "%11.11s", labelBlock->label);
+
+ if (debug == 1)
+ {
+ printf("Using Device: %s\n",name);
+ printf("Card-Type detected: %s\n",cCardType);
+ }
+
+ /* Forming cat command to overwrite the medias content. */
+ sprintf( drivel, "%c:", tolower(drive) );
+
+#if 0
+ media_sectors = dev.tracks * dev.sectors;
+ sector_size = WORD(secsiz) * dev.heads;
+
+
+ printf(mcat);
+ printf("\n%d\n", media_sectors);
+ printf("%d\n", sector_size);
+#endif
+
+ /*
+ * Overwrite device
+ */
+ for( i=0; i < cycles; i++){
+
+ if (debug==1)
+ {
+ printf("Erase Cycle %i, writing data: 0x%2.2x...\n",i+1,odat[i]);
+ }
+
+ fDevice = fopen(name,"ab+");
+
+ if (fDevice == 0)
+ {
+ perror("Error opening device");
+ exit(-1);
+ }
+
+
+ if (debug==1)
+ {
+ printf("Open successful...\n");
+ printf("Flushing device after 32 kBytes of data...\n");
+ printf("Erasing:");
+ fflush( stdout );
+ }
+
+ /* iTotalErase = 0; */
+
+ /*
+ * overwrite the whole device
+ */
+ while ((feof(fDevice)==0) && (ferror(fDevice)==0))
+ {
+
+ fputc(odat[i],fDevice);
+
+ icount++;
+ if (icount > (32 * 1024))
+ {
+ /* flush device every 32KB of data...*/
+ fflush( fDevice );
+
+ iTotalErase += icount;
+ if (debug == 1)
+ {
+ printf(".");
+ fflush( stdout );
+ }
+ icount=0;
+ }
+ }
+
+ if (debug==1)
+ {
+ printf("\nPress <ENTER> to continue\n");
+ printf("Press <x> and <ENTER> to abort\n");
+
+ if(scanf("%c",dummy) < 1)
+ printf("Input error\n");
+ fflush( stdin );
+
+ if (strcmp(dummy,"x") == 0)
+ {
+ printf("exiting.\n");
+ exit(0);
+ }
+ }
+
+ fclose(fDevice);
+
+ }
+
+
+ /*
+ * Format device using shell script
+ */
+ if (debug == 0)
+ {
+ /* redirect STDERR and STDOUT to the black hole... */
+ if (dup2(open("/dev/null", O_WRONLY), STDERR_FILENO) != STDERR_FILENO)
+ printf("Error with dup2() stdout\n");
+ if (dup2(open("/dev/null", O_WRONLY), STDOUT_FILENO) != STDOUT_FILENO)
+ printf("Error with dup2() stdout\n");
+ }
+
+ if (debug == 1)
+ printf("Calling amuFormat.sh with args: %s,%s\n",cCardType,drivel);
+
+ execlp("amuFormat.sh","",cCardType,drivel,NULL);
+
+ /* we never come back...(we shouldn't come back ...) */
+ exit(-1);
+
+}
+
+
+/**
+ * Total Erase of Data on a Disk. After using mclasserase there wont
+ * be ANY bits of old files on the disk.<br>
+ * </b>
+ * @author stefan feuz<br>
+ * thomas locher<br>
+ * stefan.feuz@ruag.com
+ * thomas.locher@ruag.com
+ * @version 0.3, 02.12.2003
+ *
+ * @param argc generated automatically by operating systems
+ * @param **argv1 generated automatically by operating systems
+ * @param type generated automatically by operating systems
+ *
+ * @param -d stop after each erase cycle, for testing purposes
+ *
+ * @returns int 0 if all is well done<br>
+ * int -1 if there is something wrong
+ *
+ * @info mclasserase [-p tempFilePath] [-d] drive:
+ *
+ *
+ */
+void mclasserase(int argc, char **argv, int type UNUSEDP)
+{
+ /* declaration of all variables */
+ int c;
+ int debug=0;
+ /* char* tempFilePath=NULL; */
+ char drive='a';
+
+ int extern optind;
+
+ destroy_privs();
+
+ /* check and read command line arguments */
+#ifdef DEBUG
+ printf("mclasserase: argc = %i\n",argc);
+#endif
+ /* check num of arguments */
+ if(helpFlag(argc, argv))
+ usage(0);
+ if ( (argc != 2) & (argc != 3) & (argc != 4))
+ { /* wrong num of arguments */
+ printf ("mclasserase: wrong num of args\n");
+ usage(1);
+ }
+ else
+ { /* correct num of arguments */
+ while ((c = getopt(argc, argv, "+p:dh")) != EOF)
+ {
+ switch (c)
+ {
+
+ case 'd':
+
+ printf("=============\n");
+ printf("Debug Mode...\n");
+ printf("=============\n");
+ debug = 1;
+ break;
+ case 'p':
+ printf("option -p not implemented yet\n");
+ break;
+ case 'h':
+ usage(0);
+ case '?':
+ usage(1);
+ default:
+ break;
+ }
+ }
+#ifdef DEBUG
+ printf("mclasserase: optind = %i\n",optind);
+ /* look for the drive to erase */
+ printf("mclasserase: searching drive\n");
+#endif
+ for(; optind < argc; optind++)
+ {
+ if(!argv[optind][0] || argv[optind][1] != ':')
+ {
+ usage(1);
+ }
+ drive = toupper(argv[optind][0]);
+ }
+ }
+#ifdef DEBUG
+ printf("mclasserase: found drive %c\n", drive);
+#endif
+ /* remove all data on drive, you never come back if drive does
+ * not exist */
+
+ do_mclasserase(drive,debug);
+
+ exit (0);
+}