home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / 32dudf12.zip / src / df.c next >
C/C++ Source or Header  |  1994-01-01  |  4KB  |  164 lines

  1. /*************************************************
  2.  * DF (*nix like) for  OS/2 v2.x & DOS
  3.  * Copyright (c) 1993,1994 Timo Kokkonen.
  4.  *
  5.  * compiler: Borland C++ for OS/2 or DOS
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <dir.h>
  11. #include <dos.h>
  12.  
  13. #ifdef __OS2__
  14.  #define INCL_DOSFILEMGR
  15.  #define INCL_DOSMISC
  16.  #include <os2.h>
  17.  #define VERSION_BITS "32"
  18. #else
  19.  #define VERSION_BITS "16"
  20. #endif
  21.  
  22. #define RELEASE_DATE "01-Jan-94"
  23. #define VERSION_NO   "1.11"
  24.  
  25.  
  26. /**********************************************************************/
  27.  
  28. int getDiskSize(unsigned char drive,unsigned long *size,
  29.                     unsigned long *free,
  30.                     unsigned long *clustersize)
  31. {
  32.   struct diskfree_t       data;
  33.  
  34.   if(_dos_getdiskfree(drive,&data)==0) {
  35.     *size=(unsigned long)data.total_clusters*data.bytes_per_sector*
  36.       data.sectors_per_cluster;
  37.     *free=(unsigned long)data.avail_clusters*data.bytes_per_sector*
  38.       data.sectors_per_cluster;
  39.     *clustersize=(unsigned long)data.bytes_per_sector*
  40.          data.sectors_per_cluster;
  41.     return 1;
  42.   }
  43.   *size=*free=*clustersize=0;
  44.   return 0;
  45. }
  46.  
  47. void getDiskLabel(unsigned char drive, char *label)
  48. {
  49.  #ifdef __OS2__
  50.   struct {
  51.     ULONG volID;
  52.     BYTE  labellen;
  53.     char  label[40];
  54.   } buf;
  55.   if (DosQueryFSInfo(drive,2,&buf,sizeof(buf))!=0) strcpy(label,"");
  56.     else strncpy(label,buf.label,40);
  57.  #else
  58.   struct ffblk ffblk;
  59.   char a[10] = " :\*.*";
  60.   a[0]=drive+64;
  61.   if (!findfirst(a,&ffblk,FA_LABEL)) {
  62.    strcpy(label,ffblk.ff_name);
  63.   } else {
  64.    strcpy(label,"");
  65.   }
  66.  #endif
  67. }
  68.  
  69. char *getIFSname(int drive)
  70. {
  71.    static char    ifs_name[256];
  72.  
  73.  #ifdef __OS2__
  74.    char        devicename[3];
  75.    ULONG        ordinal,infolevel;
  76.    APIRET    rc;
  77.    struct {
  78.      USHORT a,b,c,d;
  79.      CHAR data[9000];
  80.    } Buffer;
  81.    ULONG    BufferLen;
  82.  
  83.    devicename[0]=64+drive;
  84.    devicename[1]=':';
  85.    devicename[2]=0;
  86.    infolevel=1;
  87.    BufferLen=sizeof(Buffer);
  88.  
  89.    rc = DosQueryFSAttach(devicename,ordinal,infolevel,
  90.              (void*)&Buffer,&BufferLen);
  91.    if (rc!=0) return 0;
  92.    if (Buffer.c>sizeof(ifs_name)) Buffer.c=sizeof(ifs_name);
  93.    memcpy(ifs_name,&Buffer.data[Buffer.b+1],Buffer.c+1);
  94.    return ifs_name;
  95.  #else
  96.    // code for DOS
  97.    struct fatinfo data;
  98.    getfat(drive,&data);
  99.    switch (data.fi_fatid) {
  100.      case 0xfff0: strcpy(ifs_name,"other"); break;
  101.      default: strcpy(ifs_name,"FAT");
  102.    }
  103.    // sprintf(ifs_name,"%x",data.fi_fatid);
  104.    return ifs_name;
  105.  #endif
  106. }
  107.  
  108. #ifdef __MSDOS__
  109. int DriveExists(unsigned char drive)
  110. {
  111.  struct fcb fcb;
  112.  char a[20] = " :foo.oof";
  113.  a[0]=drive+64;
  114.  return (int)(parsfnm(a,&fcb,1));
  115. }
  116. #endif
  117.  
  118.  
  119. int main(void)
  120. {
  121.   int maxdrives,curdrive, x;
  122.   unsigned long disksize,diskfree,clustersize,sizesum=0,freesum=0;
  123.   unsigned long capacity;
  124.   char label[41],file_system[256];
  125.  
  126.   #ifdef __OS2__
  127.    DosError(FERR_DISABLEHARDERR|FERR_ENABLEEXCEPTION);
  128.   #endif
  129.  
  130.   printf("\nDF/" VERSION_BITS "bit v" VERSION_NO
  131.      "     Copyright (c) Timo Kokkonen, OH6LXV  "
  132.      "             " RELEASE_DATE "\n\n");
  133.  
  134.   curdrive=getdisk();
  135.   maxdrives=setdisk(curdrive);
  136.   if (maxdrives-2<=0) return 1;
  137.  
  138.   printf("disk               free       used      total capacity  cluster   file system\n");
  139.   for(x=3;x<=maxdrives;x++) {
  140.     label[0]=0;
  141.     file_system[0]=0;
  142.     #ifdef __MSDOS__
  143.     if (!DriveExists(x)) continue;
  144.     #endif
  145.     if (getDiskSize(x,&disksize,&diskfree,&clustersize)) {
  146.       getDiskLabel(x,label);
  147.       strcpy(file_system,getIFSname(x));
  148.     }
  149.     sizesum+=disksize; freesum+=diskfree;
  150.     if (disksize==0) capacity=0;
  151.       else capacity=((disksize-diskfree)/(disksize/100));
  152.  
  153.     printf("%c:%-12s %8luk  %8luk  %8luk  %3lu%%  %5lu bytes   %-8s \n",
  154.        x+64,label,diskfree/1024,(disksize-diskfree)/1024,disksize/1024,
  155.        capacity,clustersize,file_system);
  156.   }
  157.  
  158.   printf("\nTotal:        %9luk %9luk %9luk  %3lu%% \n",
  159.      freesum/1024,(sizesum-freesum)/1024,sizesum/1024,
  160.      (sizesum-freesum)/(sizesum/100));
  161.  
  162.   return 0;
  163. }
  164.