home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 255.lha / free / free.c < prev    next >
C/C++ Source or Header  |  1989-05-25  |  4KB  |  150 lines

  1. /*   Free.c  -  (c) 1989  Mike 'Sirius' Stilson - Sirius Software
  2.  *   Ver1.0    January 1989.  Written, Tested, Debugged, Re-Tested, and Finished.
  3.  *   Ver2.0 May 1989.  Ported to Lattice 5.0.2, Made re-entrant/pure. Added
  4.  *                     Prototypes, and report the filesystem.
  5.  *          Should work under Manx, remove the prototypes & use +l to compile.
  6.  *          LMK Makefile provided for lattice.
  7.  *
  8.  *            Display free/total bytes & blocks, name, and FileSys for a volume.
  9.  */
  10.  
  11. #include <exec/types.h>
  12. #include <exec/memory.h>
  13. #include <libraries/dos.h>
  14. #include <libraries/dosextens.h>
  15. #include <proto/dos.h>
  16. #include <proto/exec.h>
  17.  
  18. /* Structure for all the variables we'll use */
  19. struct Variables {
  20.     struct InfoData *idata;
  21.     struct FileLock *lock;
  22.     BPTR   mylock;
  23.     struct DeviceList *dev;
  24.     char   name[80];
  25.     char  *temp;
  26.     ULONG  usedbytes,
  27.            totalbytes,
  28.            freebytes,
  29.            bpb;
  30. };
  31.  
  32. /* Macro to convert a BPTR to a C Pointer.  Just for readability */
  33. #define BPTR_TO_C(cast, var) ((struct cast *)(BADDR((ULONG)var)))
  34.  
  35. /* Function prototypes.. */
  36. extern __stdargs int printf(char *,...);
  37. extern __stdargs int strlen(char *);
  38. extern __stdargs void strncpy(char *, char *, int);
  39. extern __stdargs void exit(long);
  40.  
  41. int   main(int, char **av);
  42. char *GetName(struct Variables *);
  43. void  GetFree(struct Variables *);
  44. void  Oops(struct Variables *, int);
  45.  
  46. main(ac,av)
  47. int ac; char *av[];
  48. {
  49.  
  50.     /* Declare a pointer to our variable structure */
  51.     register struct Variables *Var;
  52.  
  53.     /* Allocate space for our variables */
  54.     if(!(Var=(struct Variables *)
  55.         AllocMem(sizeof(struct Variables),MEMF_PUBLIC|MEMF_CLEAR))) {
  56.         printf("Cannot allocate space for variables.\n");
  57.         Oops(Var,0);
  58.     }
  59.  
  60.     /* space for InfoData structure..  must be chip */
  61.     if(!(Var->idata=(struct InfoData *)
  62.         AllocMem(sizeof(struct InfoData),MEMF_CLEAR|MEMF_CHIP))) {
  63.         printf("Unable to allocate space.\n");
  64.         Oops(Var,1);
  65.     }
  66.  
  67.     /* Lock the drive */
  68.     if((Var->mylock=Lock(av[1],ACCESS_READ))==NULL) {
  69.         printf("Attempt to lock %s failed.\n",av[1]);
  70.         Oops(Var,2);
  71.     }
  72.  
  73.     /* Fill the infodata structure */
  74.     if(!(Info(Var->mylock,Var->idata))) {
  75.         printf("Unable to obtain info for device %s.\n",av[1]);
  76.         Oops(Var,3);
  77.     }
  78.  
  79.     /* Get the volume name.  */
  80.     printf("Volume Name: [1;4m%s[0m[%dC",GetName(Var),19-strlen(Var->name));
  81.  
  82.     /* Get and display the free space for this volume */
  83.     GetFree(Var);
  84.  
  85.     Oops(Var,3);
  86. }
  87.  
  88. void Oops(Var,level)
  89. struct Variables *Var;
  90. int level;
  91. {
  92.     switch(level) {
  93.         case 3: UnLock((BPTR)Var->mylock);
  94.         case 2: FreeMem(Var->idata,sizeof(struct InfoData));
  95.         case 1: FreeMem(Var,sizeof(struct Variables));
  96.         case 0: exit(0);
  97.     }
  98. }
  99.  
  100.  
  101. /*
  102.  *  The devicelist is the only way I've managed to get the Volume name.
  103.  *  InfoData->id_VolumeNode->ln_Name doesn't seem to work.
  104.  */
  105.  
  106. char *GetName(Var)
  107. struct Variables *Var;
  108. {
  109.  
  110.     Forbid();
  111.  
  112.         Var->lock = BPTR_TO_C(FileLock, Var->mylock);
  113.         Var->dev = BPTR_TO_C(DeviceList, Var->lock->fl_Volume);
  114.         Var->temp = (char *)BADDR(Var->dev->dl_Name);
  115.         strncpy(Var->name, &Var->temp[1], Var->temp[0]);
  116.         Var->name[Var->temp[0]] = NULL;
  117.  
  118.     Permit();
  119.  
  120.     return(Var->name);
  121. }
  122.  
  123.  
  124. static char *FileSystem[] = {"OFS", "FFS", "???"};
  125.  
  126. void GetFree(Var)
  127. struct Variables *Var;
  128. {
  129.     Var->bpb         =  Var->idata->id_BytesPerBlock;
  130.     Var->usedbytes   =  Var->bpb * Var->idata->id_NumBlocksUsed;
  131.     Var->totalbytes  =  Var->bpb * Var->idata->id_NumBlocks;
  132.     Var->freebytes   =  Var->totalbytes - Var->usedbytes;
  133.  
  134.     switch(Var->bpb) {
  135.         case 488: Var->bpb=0;
  136.                   break;
  137.         case 512: Var->bpb=1;
  138.                   break;
  139.             /* The only two DOS knows about for now.. */
  140.         default:  Var->bpb=2;
  141.                   break;
  142.     }
  143.  
  144.     printf("FileSystem: %3s\n",FileSystem[Var->bpb]);
  145.     printf("Total bytes: %-7ld\t\tFree Bytes: %-7ld\n",Var->totalbytes,Var->freebytes);
  146.     printf("Total blocks: %-7ld\t\tFree Blocks: %-7ld\n\n",Var->idata->id_NumBlocks,
  147.         (Var->idata->id_NumBlocks - Var->idata->id_NumBlocksUsed));
  148. }
  149.  
  150.