home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / mtools / part02 / mrd.c < prev    next >
C/C++ Source or Header  |  1987-08-27  |  3KB  |  131 lines

  1. /*
  2.  * Delete a MSDOS sub directory
  3.  *
  4.  * Emmet P. Gray            US Army, HQ III Corps & Fort Hood
  5.  * ...!ihnp4!uiucuxc!fthood!egray    Attn: AFZF-DE-ENV
  6.  *                     Directorate of Engineering & Housing
  7.  *                     Environmental Management Office
  8.  *                     Fort Hood, TX 76544-5057
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include "msdos.h"
  13.  
  14. int fd;                /* the file descriptor for the floppy */
  15. int dir_start;            /* starting sector for directory */
  16. int dir_len;            /* length of directory (in sectors) */
  17. int dir_entries;        /* number of directory entries */
  18. int dir_chain[25];        /* chain of sectors in directory */
  19. int clus_size;            /* cluster size (in sectors) */
  20. int fat_len;            /* length of FAT table (in sectors) */
  21. int num_clus;            /* number of available clusters */
  22. unsigned char *fatbuf;        /* the File Allocation Table */
  23. char *mcwd;            /* the Current Working Directory */
  24.  
  25. main(argc, argv)
  26. int argc;
  27. char *argv[];
  28. {
  29.     int ismatch, entry, start, isempty();
  30.     char *filename, *newfile, text[4], tname[9], *getname();
  31.     char *strncpy(), *pathname, *getpath(), *unixname();
  32.     void exit();
  33.     struct directory *dir, *search();
  34.  
  35.     if (init(2)) {
  36.         fprintf(stderr, "mrd: Cannot initialize diskette\n");
  37.         exit(1);
  38.     }
  39.                     /* only 1 directory ! */
  40.     if (argc != 2) {
  41.         fprintf(stderr, "Usage: mrd <MSDOS directory>\n");
  42.         exit(1);
  43.     }
  44.  
  45.     filename = getname(argv[1]);
  46.     pathname = getpath(argv[1]);
  47.     if (subdir(pathname))
  48.         exit(1);
  49.     ismatch = 0;
  50.     for (entry=0; entry<dir_entries; entry++) {
  51.         dir = search(entry);
  52.                     /* if empty */
  53.         if (dir->name[0] == NULL)
  54.             break;
  55.                     /* if erased */
  56.         if (dir->name[0] == 0xe5)
  57.             continue;
  58.                     /* if not dir */
  59.         if (!(dir->attr & 0x10))
  60.             continue;
  61.         strncpy(tname, dir->name, 8);
  62.         strncpy(text, dir->ext, 3);
  63.         newfile = unixname(tname, text);
  64.         if (!strcmp(newfile, filename)) {
  65.             start = dir->start[1]*0x100 + dir->start[0];
  66.             if (!isempty(start)) {
  67.                 fprintf(stderr, "mrd: Directory '%s' is not empty\n", filename);
  68.                 exit(1);
  69.             }
  70.             if (!start) {
  71.                 fprintf(stderr, "mrd: Can't remove root directory\n");
  72.                 exit(1);
  73.             }
  74.             zapit(start);
  75.             dir->name[0] = 0xe5;
  76.             writedir(entry, dir);
  77.             ismatch = 1;
  78.         }
  79.     }
  80.     if (!ismatch) {
  81.         fprintf(stderr, "mrd: Directory '%s' not found\n", filename);
  82.         exit(1);
  83.     }
  84.                     /* update the FAT sectors */
  85.     writefat();
  86.     close(fd);
  87.     exit(0);
  88. }
  89.  
  90. /*
  91.  * See if directory is empty.  Returns 1 if empty, 0 if not.  Can't use
  92.  * subdir() and search() as it would clobber the globals.
  93.  */
  94.  
  95. int
  96. isempty(fat)
  97. int fat;
  98. {
  99.     int i, next, buflen, sector, getfat();
  100.     unsigned char tbuf[1024];
  101.     void perror(), exit();
  102.  
  103.     while (1) {
  104.         sector = (fat-2)*clus_size + dir_start + dir_len;
  105.         move(sector);
  106.         buflen = clus_size * MSECSIZ;
  107.         if (read(fd, tbuf, buflen) != buflen) {
  108.             perror("isempty: read");
  109.             exit(1);
  110.         }
  111.                     /* check first character of name */
  112.         for (i=0; i<MSECSIZ; i+=MDIRSIZ) {
  113.             if (tbuf[i] == '.')
  114.                 continue;
  115.             if (tbuf[i] != NULL && tbuf[i] != 0xe5)
  116.                 return(0);
  117.         }
  118.                     /* get next cluster number */
  119.         next = getfat(fat);
  120.         if (next == -1) {
  121.             fprintf(stderr, "isempty: FAT problem\n");
  122.             exit(1);
  123.         }
  124.                     /* end of cluster chain */
  125.         if (next >= 0xff8)
  126.             break;
  127.         fat = next;
  128.     }
  129.     return(1);
  130. }
  131.