home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 6 File / 06-File.zip / DU_DF2.ZIP / DF.C < prev    next >
C/C++ Source or Header  |  1991-03-28  |  2KB  |  86 lines

  1. /* df.c
  2.  * returns info on file system of specified drive
  3.  */
  4.  
  5. #define INCL_DOS
  6. #include <os2.h>
  7. #include <stdlib.h>
  8. #include <ctype.h>
  9.  
  10. main(int argc, char *argv[])
  11. {
  12.     unsigned long map;            /* map of all disk drives      */
  13.     unsigned drive;               /* drive number                */
  14.                                   /* 0=default, 1=A, 2=B, etc.   */
  15.     int i;
  16.  
  17.     if ( argc > 1 ) {
  18.     for (i=1; i<argc; i++ ) {
  19.         if ( isalpha( *argv[i] ) ) drive = toupper( *argv[i] ) - 'A' + 1;
  20.         else drive = atoi( argv[i] );
  21.             print_info( drive );
  22.     }
  23.     }
  24.     else {
  25.     DosQCurDisk( &drive, &map );
  26.  
  27.     map >>= 2;
  28.     i = 2;
  29.     while ( map ) {
  30.         drive = map - ( ( map >> 1 ) << 1);
  31.         if ( drive )  print_info( i+1 );
  32.         map >>= 1;
  33.         i++;
  34.     
  35.     }
  36.     }
  37.  
  38.     exit(0);
  39. }
  40.  
  41. int print_info(int drive)
  42. {
  43.     struct _FSALLOCATE buffer;    /* defined in bsedos.h         */
  44.     unsigned size;                /* size of buffer              */
  45.     unsigned rc;                  /* return code                 */
  46.     unsigned long bytes_free, bytes_total, cluster;
  47.     int      a, b, c, d, p;
  48.     char    aa[4], cc[4];
  49.     struct _FSINFO     vol;
  50.  
  51.     size = sizeof(struct _FSALLOCATE);
  52.     if (rc = DosQFSInfo(drive, 1, (unsigned char far *)&buffer, size)) {
  53.         printf("DosQFSInfo level 1 error=%u on drive %c:\n",
  54.         rc, 'A'+drive-1 );
  55.         return 1;
  56.     }
  57.     
  58.     size = sizeof(struct _FSINFO);
  59.     if (rc = DosQFSInfo(drive, 2, (unsigned char far *)&vol, size)) {
  60.         printf("DosQFSInfo level 1 error=%u on drive %c:\n",
  61.         rc, 'A'+drive-1 );
  62.         return 1;
  63.     }
  64.  
  65.     cluster = buffer.cbSector * buffer.cSectorUnit;
  66.     bytes_free = cluster * buffer.cUnitAvail ;
  67.     bytes_free /= 1024;
  68.     bytes_total = cluster * buffer.cUnit ;
  69.     bytes_total /= 1024;
  70.  
  71.     p = (bytes_total - bytes_free) * 100 / bytes_total;
  72.     a = bytes_free / 1000 ;
  73.     b = bytes_free - (a * 1000);
  74.     c = bytes_total / 1000;
  75.     d = bytes_total - (c * 1000);
  76.     if ( a ) itoa( a, aa, 10 );
  77.     else strcpy( aa, "   " );
  78.     if ( c ) itoa( c, cc, 10 );
  79.     else strcpy( cc, "   " );
  80.     printf("%c:%3s%c%03uK free,%4s%c%03uK total, %d%% used,",
  81.            'A'+drive-1, aa, a?',':' ', b, cc, c?',':' ', d, p );
  82.     printf(" cluster = %ld, volume = %s\n",
  83.            cluster, vol.vol.szVolLabel );
  84.     return 0;
  85. }
  86.