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

  1. /*
  2.  * Make 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 entry, slot, fat, dot, subdir();
  30.     char *filename, *newfile, *fixname(), *strncpy(), *unixname();
  31.     char *getpath(), *pathname, tname[9], text[4], *fixed;
  32.     void exit();
  33.     struct directory *dir, *search(), *mk_entry();
  34.  
  35.     if (init(2)) {
  36.         fprintf(stderr, "mmd: Cannot initialize diskette\n");
  37.         exit(1);
  38.     }
  39.                     /* only 1 directory ! */
  40.     if (argc != 2) {
  41.         fprintf(stderr, "Usage: mmd <MSDOS directory>\n");
  42.         exit(1);
  43.     }
  44.     fixed = fixname(argv[1]);
  45.     filename = unixname(fixed, fixed+8);
  46.     pathname = getpath(argv[1]);
  47.     if (strcmp(fixed+8, "   ")) {
  48.         fprintf(stderr, "mmd: Directory names cannot have extensions\n");
  49.         exit(1);
  50.     }
  51.     if (subdir(pathname))
  52.         exit(1);
  53.                     /* see if exists and get slot */
  54.     slot = -1;
  55.     dot = 0;
  56.     for (entry=0; entry<dir_entries; entry++) {
  57.         dir = search(entry);
  58.                     /* if empty */
  59.         if (dir->name[0] == NULL) {
  60.             if (slot < 0)
  61.                 slot = entry;
  62.             break;
  63.         }
  64.                     /* if erased */
  65.         if (dir->name[0] == 0xe5) {
  66.             if (slot < 0)
  67.                 slot = entry;
  68.             continue;
  69.         }
  70.                     /* if not a directory */
  71.         if (!(dir->attr & 0x10))
  72.             continue;
  73.         strncpy(tname, dir->name, 8);
  74.         strncpy(text, dir->ext, 3);
  75.         newfile = unixname(tname, text);
  76.                     /* save the 'dot' directory info */
  77.         if (!strcmp(".", newfile))
  78.             dot = dir->start[1]*0x100 + dir->start[0];
  79.  
  80.         if (!strcmp(filename, newfile)) {
  81.             fprintf(stderr, "mmd: Directory '%s' already exists\n", filename);
  82.             exit(1);
  83.         }
  84.     }
  85.                     /* no '.' entry means root directory */
  86.     if (dot == 0 && slot < 0) {
  87.         printf(stderr, "mmd: No directory slots\n");
  88.         exit(1);
  89.     }
  90.                     /* make the directory grow */
  91.     if (dot && slot < 0) {
  92.         if (grow(dot)) {
  93.             fprintf(stderr, "mmd: Disk full\n");
  94.             exit(1);
  95.         }
  96.                     /* first slot in 'new' directory */
  97.         slot = entry;
  98.     }
  99.     fat = nextfat(0);
  100.     if (fat == -1) {
  101.         fprintf(stderr, "mmd: Disk full\n");
  102.         exit(1);
  103.     }
  104.                     /* make directory entry */
  105.     dir = mk_entry(fixed, 0x10, fat, 0);
  106.     if (dir != NULL) {
  107.         writedir(slot, dir);
  108.                     /* write the cluster */
  109.         putfat(fat, 0xfff);
  110.         putcluster(fat, dot);
  111.     }
  112.                     /* write FAT sectors */
  113.     writefat();
  114.     close(fd);
  115.     exit(0);
  116. }
  117.  
  118. putcluster(dot, dot_dot)        /* write the cluster */
  119. int dot;
  120. int dot_dot;
  121. {
  122.     long start;
  123.     void exit(), perror();
  124.     int buflen;
  125.     static struct directory dirs[32];
  126.     struct directory *mk_entry();
  127.  
  128.     start = (dot - 2)*clus_size + dir_start + dir_len;
  129.     move(start);
  130.  
  131.     buflen = clus_size * MSECSIZ;
  132.                     /* make the '.' and '..' entries */    
  133.     dirs[0] = *mk_entry(".          ", 0x10, dot, 0);
  134.     dirs[1] = *mk_entry("..         ", 0x10, dot_dot, 0);
  135.  
  136.     if (write(fd, (char *) &dirs[0], buflen) != buflen) {
  137.         perror("putcluster: write");
  138.         exit(1);
  139.     }
  140.     return;
  141. }
  142.  
  143. int
  144. nextfat(last)                /* returns next free cluster */
  145. int last;
  146. {
  147.     static int i;
  148.  
  149.     for (i=last+1; i<num_clus+2; i++) {
  150.         if (!getfat(i))
  151.             return(i);
  152.     }
  153.     return(-1);
  154. }
  155.