home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / filesyst / dosfs / dosfsck_.z / dosfsck_ / dosfsck / dosfsck.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-05-10  |  2.6 KB  |  111 lines

  1. /* dosfsck.c  -  User interface */
  2.  
  3. /* Written 1993 by Werner Almesberger */
  4.  
  5.  
  6. #include <stdio.h>
  7. #include <unistd.h>
  8. #include <getopt.h>
  9.  
  10. #include "common.h"
  11. #include "dosfsck.h"
  12. #include "io.h"
  13. #include "boot.h"
  14. #include "fat.h"
  15. #include "file.h"
  16. #include "check.h"
  17.  
  18.  
  19. int interactive = 0,list = 0,test = 0,verbose = 0,write_immed = 0;
  20. void *mem_queue = NULL;
  21.  
  22.  
  23. static void usage(char *name)
  24. {
  25.     fprintf(stderr,"usage: %s [ -aflrtvVw ] [ -d path -d ... ] "
  26.       "[ -u path -u ... ]\n%15sdevice\n",name,"");
  27.     fprintf(stderr,"  -a       automatically repair the file system\n");
  28.     fprintf(stderr,"  -d path  drop that file\n");
  29.     fprintf(stderr,"  -f       salvage unused chains to files\n");
  30.     fprintf(stderr,"  -l       list path names\n");
  31.     fprintf(stderr,"  -r       interactively repair the file system\n");
  32.     fprintf(stderr,"  -t       test for bad clusters\n");
  33.     fprintf(stderr,"  -u path  try to undelete that (non-directory) file\n");
  34.     fprintf(stderr,"  -v       verbose mode\n");
  35.     fprintf(stderr,"  -V       perform a verification pass\n");
  36.     fprintf(stderr,"  -w       write changes to disk immediately\n");
  37.     exit(2);
  38. }
  39.  
  40.  
  41. int main(int argc,char **argv)
  42. {
  43.     DOS_FS fs;
  44.     int rw,salvage_files,verify,c;
  45.  
  46.     rw = salvage_files = verify = 0;
  47.     while ((c = getopt(argc,argv,"ad:flrtu:vVw")) != EOF)
  48.     switch (c) {
  49.         case 'a':
  50.         rw = 1;
  51.         break;
  52.         case 'd':
  53.         file_add(optarg,fdt_drop);
  54.         break;
  55.         case 'f':
  56.         salvage_files = 1;
  57.         break;
  58.         case 'l':
  59.         list = 1;
  60.         break;
  61.         case 'r':
  62.         rw = 1;
  63.         interactive = 1;
  64.         break;
  65.         case 't':
  66.         test = 1;
  67.         break;
  68.         case 'u':
  69.         file_add(optarg,fdt_undelete);
  70.         break;
  71.         case 'v':
  72.         verbose = 1;
  73.         printf("dosfsck 0.1 (May 8 1993)\n");
  74.         break;
  75.         case 'V':
  76.         verify = 1;
  77.         break;
  78.         case 'w':
  79.         write_immed = 1;
  80.         break;
  81.         default:
  82.         usage(argv[0]);
  83.     }
  84.     if ((test || write_immed) && !rw) {
  85.     fprintf(stderr,"-t and -w require -a or -r\n");
  86.     exit(2);
  87.     }
  88.     if (optind != argc-1) usage(argv[0]);
  89.     fs_open(argv[optind],rw);
  90.     read_boot(&fs);
  91.     if (verify) printf("Starting check/repair pass.\n");
  92.     while (read_fat(&fs), scan_root(&fs)) qfree(&mem_queue);
  93.     if (test) fix_bad(&fs);
  94.     if (salvage_files) reclaim_file(&fs);
  95.     else reclaim_free(&fs);
  96.     file_unused();
  97.     qfree(&mem_queue);
  98.     if (verify) {
  99.     printf("Starting verification pass.\n");
  100.     read_fat(&fs);
  101.     scan_root(&fs);
  102.     reclaim_free(&fs);
  103.     qfree(&mem_queue);
  104.     }
  105.     if (fs_changed() && rw)
  106.     if (interactive)
  107.         rw = get_key("yn","Perform changes ? (y/n)") == 'y';
  108.     else printf("Performing changes.\n");
  109.     return fs_close(rw) ? 1 : 0;
  110. }
  111.