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

  1. /*
  2.  * Display a MSDOS 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 i, entry, files, blocks, subdir(), fargn, wide;
  30.     long size;
  31.     char name[9], ext[4], *date, *time, *convdate(), *convtime();
  32.     char *strncpy(), *dirname, *getname(), *getpath(), *pathname, sep;
  33.     char *newfile, *filename, *malloc(), *unixname(), volume[12];
  34.     char *strcpy(), *strcat();
  35.     void exit();
  36.     struct directory *dir, *search();
  37.  
  38.     if (init(0)) {
  39.         fprintf(stderr, "mdir: Cannot initialize diskette\n");
  40.         exit(1);
  41.     }
  42.                     /* find the volume label */
  43.     reset_dir();
  44.     for (entry=0; entry<dir_entries; entry++) {
  45.         dir = search(entry);
  46.         strncpy(name, dir->name, 8);
  47.         strncpy(ext, dir->ext, 3);
  48.                     /* if empty */
  49.         if (dir->name[0] == NULL)
  50.             break;
  51.                     /* if not volume label */
  52.         if (!(dir->attr & 0x08))
  53.             continue;
  54.         strcpy(volume, name);
  55.         strcat(volume, ext);
  56.         break;
  57.     }
  58.     if (volume[0] == NULL)
  59.         printf(" Volume in drive has no label\n");
  60.     else
  61.         printf(" Volume in drive is %s\n", volume);
  62.     fargn = 1;
  63.     wide = 0;
  64.                     /* first argument number */
  65.     if (argc > 1) {
  66.         if (!strcmp(argv[1], "-w")) {
  67.             wide = 1;
  68.             fargn = 2;
  69.         }
  70.     }
  71.                     /* fake an argument */
  72.     if (argc == fargn) {
  73.         argv[argc] = ".";
  74.         argc++;
  75.     }
  76.     files = 0;
  77.     for (i=fargn; i<argc; i++) {
  78.         filename = getname(argv[i]);
  79.         pathname = getpath(argv[i]);
  80.                     /* move to first guess subdirectory */
  81.                     /* required by isdir() */
  82.         if (subdir(pathname))
  83.             continue;
  84.         if (isdir(filename)) {
  85.             dirname = malloc(strlen(argv[i])+1);
  86.             strcpy(dirname, pathname);
  87.             if (strcmp(pathname,"/") && strcmp(pathname, "\\")) {
  88.                 if (*pathname != NULL)
  89.                     strcat(dirname, "/");
  90.             }
  91.             strcat(dirname, filename);
  92.                     /* move to real subdirectory */
  93.             if (subdir(dirname))
  94.                 continue;
  95.             filename = "*";
  96.         }
  97.         if (*filename == NULL)
  98.             filename = "*";
  99.         if (*dirname == '/' || *dirname == '\\')
  100.             printf(" Directory for %s\n\n", dirname);
  101.         else if (!strcmp(dirname, "."))
  102.             printf(" Directory for %s\n\n", mcwd);
  103.         else {
  104.             if (strlen(mcwd) == 1 || !strlen(dirname))
  105.                 sep = NULL;
  106.             else
  107.                 sep = '/';
  108.             printf(" Directory for %s%c%s\n\n", mcwd, sep, dirname);
  109.         }
  110.         for (entry=0; entry<dir_entries; entry++) {
  111.             dir = search(entry);
  112.             strncpy(name, dir->name, 8);
  113.             strncpy(ext, dir->ext, 3);
  114.             newfile = unixname(name, ext);
  115.                     /* if empty */
  116.             if (dir->name[0] == NULL)
  117.                 break;
  118.                     /* if erased */
  119.             if (dir->name[0] == 0xe5)
  120.                 continue;
  121.                     /* if a volume label */
  122.             if (dir->attr & 0x08)
  123.                 continue;
  124.             if (!match(newfile, filename))
  125.                 continue;
  126.             files++;
  127.             if (wide && files != 1) {
  128.                 if (!((files-1) % 5))
  129.                     putchar('\n');
  130.             }
  131.             date = convdate(dir->date[1], dir->date[0]);
  132.             time = convtime(dir->time[1], dir->time[0]);
  133.             size = dir->size[2]*0x10000 + dir->size[1]*0x100 + dir->size[0];
  134.                     /* is a subdirectory */
  135.             if (dir->attr & 0x10) {
  136.                 if (wide)
  137.                     printf("%-15.15s", name);
  138.                 else
  139.                     printf("%8s     <DIR>      %s  %s\n", name, date, time);
  140.                 continue;
  141.             }
  142.             if (wide)
  143.                 printf("%-9.9s%-6.6s", name, ext);
  144.             else
  145.                 printf("%8s %3s %8d   %s  %s\n", name, ext, size, date, time);
  146.         }
  147.         if (argc > 2)
  148.             putchar('\n');
  149.     }
  150.     blocks = getfree() * MSECSIZ;
  151.     if (!files)
  152.         printf("File '%s' not found\n", filename);
  153.     else
  154.         printf("     %3d File(s)     %6ld bytes free\n", files, blocks);
  155.     close(fd);
  156.     exit(0);
  157. }
  158.  
  159. /*
  160.  * Get the amount of free space on the diskette
  161.  */
  162.  
  163. int getfree()
  164. {
  165.     int i;
  166.     static int total;
  167.  
  168.     total = 0;
  169.     for (i=2; i<num_clus+2; i++) {
  170.                     /* if getfat returns zero */
  171.         if (!getfat(i))
  172.             total += clus_size;
  173.     }
  174.     return(total);
  175. }
  176.