home *** CD-ROM | disk | FTP | other *** search
/ Micro R&D 1 / MicroRD-CD-ROM-Vol1-1994.iso / os20 / cli / duu.lha / duu.c < prev    next >
C/C++ Source or Header  |  1992-06-30  |  4KB  |  177 lines

  1. #include <workbench/startup.h>
  2. #include <intuition/intuitionbase.h>
  3. #include <dos/dos.h>
  4. #include <dos/exall.h>
  5. #include <exec/memory.h>
  6. #include <functions.h>
  7. #include <stdio.h>
  8.  
  9. #define NAME        "Drawer Usage Utility"
  10. #define VERSION        "2"
  11. #define REVISION    "0a"
  12. #define TITLE        NAME" "VERSION"."REVISION
  13.  
  14. char version[] = "\0$VER: "TITLE;
  15. char copyright[] =
  16.     "This software is Public Domain\n"
  17.     "written by Stefan Reisner, 1992";
  18.  
  19. struct IntuitionBase *IntuitionBase;
  20.  
  21. /* count objects in specified directory (recursively) */
  22. int get_quantities( BPTR lock,
  23.     ULONG *nfiles, ULONG *ndrawers, ULONG *nbytes,
  24.     ULONG *nsoftlinks, ULONG *nlinkfiles, ULONG *nlinkdirs )
  25. {
  26.     BPTR oldCurDir, sublock;
  27.     struct ExAllControl *eac;
  28.     #define EAD_SIZE 1024
  29.     void *EAData;
  30.     int status = 0;    /* assume failure */
  31.  
  32.     oldCurDir = CurrentDir( lock );
  33.  
  34.     if( eac = AllocDosObject( DOS_EXALLCONTROL, NULL ) )
  35.     {
  36.         eac->eac_LastKey = 0;
  37.         eac->eac_MatchString = NULL;
  38.         eac->eac_MatchFunc = NULL;
  39.         if( EAData = AllocMem( EAD_SIZE, MEMF_PUBLIC ) )
  40.         {
  41.             int more;
  42.  
  43.             status = 1;    /* assume success */
  44.             do
  45.             {
  46.                 struct ExAllData *ead;
  47.                 long err;
  48.  
  49.                 more = ExAll( lock, EAData, EAD_SIZE, ED_SIZE, eac );
  50.  
  51.                 err = IoErr();
  52.  
  53.                 if( (!more) && ( err != ERROR_NO_MORE_ENTRIES ) )
  54.                 {
  55.                     status = 0;
  56.                     break;
  57.                 }
  58.  
  59.                 if( !eac->eac_Entries )
  60.                     continue;
  61.                 ead = (struct ExAllData *)EAData;
  62.                 do
  63.                 {
  64.                     switch( ead->ed_Type )
  65.                     {
  66.                     case ST_FILE:
  67.                         (*nfiles)++;
  68.                         *nbytes += ead->ed_Size;
  69.                         break;
  70.                     case ST_USERDIR:
  71.                     case ST_ROOT:
  72.                         (*ndrawers)++;
  73.                         *nbytes += ead->ed_Size;
  74.                         if( sublock = Lock( ead->ed_Name, ACCESS_READ ) )
  75.                         {
  76.                             get_quantities( sublock,
  77.                                 nfiles, ndrawers, nbytes,
  78.                                 nsoftlinks, nlinkfiles, nlinkdirs );
  79.                             UnLock( sublock );
  80.                         }
  81.                         else
  82.                             status = 0;
  83.                         break;
  84.                     case ST_SOFTLINK:
  85.                         (*nsoftlinks)++;
  86.                         break;
  87.                     case ST_LINKFILE:
  88.                         (*nlinkfiles)++;
  89.                         break;
  90.                     case ST_LINKDIR:
  91.                         (*nlinkdirs)++;
  92.                         break;
  93.                     }
  94.                     ead = ead->ed_Next;
  95.                 } while( ead );
  96.             } while( more );
  97.             FreeMem( EAData, EAD_SIZE );
  98.         }
  99.         FreeDosObject( DOS_EXALLCONTROL, eac );
  100.     }
  101.     CurrentDir( oldCurDir );
  102.     return status;
  103. }
  104.  
  105. int display_quantities( BPTR lock )
  106. {
  107.     ULONG nbytes = 0, nfiles = 0, ndrawers = 0,
  108.         nsoftlinks = 0, nlinkfiles = 0, nlinkdirs = 0;
  109.     struct FileInfoBlock *fib;
  110.     int status = 0;
  111.  
  112.     if( get_quantities( lock, &nfiles, &ndrawers, &nbytes,
  113.     &nsoftlinks, &nlinkfiles, &nlinkdirs ) )
  114.         if( fib = AllocDosObject( DOS_FIB, NULL ) )
  115.         {
  116.             struct EasyStruct easy =
  117.             {
  118.                 sizeof( struct EasyStruct ),
  119.                 0,
  120.                 TITLE,
  121.                 "Drawer %s contains:\n\n"
  122.                 "%ld bytes (user data) in\n\n"
  123.                 "%ld file(s)\n"
  124.                 "%ld subdrawer(s)\n"
  125.                 "%ld soft link(s)\n"
  126.                 "%ld (hard) file link(s)\n"
  127.                 "%ld (hard) directory link(s)\n\n"
  128.                 "%s\n",
  129.                 "Ok"
  130.             };
  131.  
  132.             Examine( lock, fib );
  133.             EasyRequest( NULL, &easy, NULL,
  134.                 fib->fib_FileName, nbytes, nfiles, ndrawers,
  135.                 nsoftlinks, nlinkfiles, nlinkdirs, copyright );
  136.             FreeDosObject( DOS_FIB, fib );
  137.             status = 1;
  138.         }
  139.     return status;
  140. }
  141.  
  142. void main( int argc, struct WBStartup *argmsg )
  143. {
  144.     struct WBArg *wb_arg;
  145.     int iarg, status = RETURN_OK;
  146.  
  147.     if( argc )
  148.     {
  149.         fprintf( stderr,
  150.             "Usage : %s can only be used as a Workbench tool.\n"
  151.             "        Apply it to a Workbench drawer or disk in order\n"
  152.             "        to learn how many bytes of disk storage, files,\n"
  153.             "        subdrawers, soft and hard links it contains.\n"
  154.             "%s\n",
  155.             ((char **)argmsg)[0], copyright );
  156.         SetIoErr( ERROR_OBJECT_WRONG_TYPE );
  157.         exit( RETURN_ERROR );
  158.     }
  159.     if( IntuitionBase =
  160.     (struct IntuitionBase *)OpenLibrary( "intuition.library", 0 ) )
  161.     {
  162.         for( iarg = 0; iarg < argmsg->sm_NumArgs; iarg++ )
  163.         {
  164.             wb_arg = argmsg->sm_ArgList + iarg;
  165.             if( wb_arg->wa_Lock && !wb_arg->wa_Name[0] )
  166.             {
  167.                 if( !display_quantities( wb_arg->wa_Lock ) )
  168.                     status = RETURN_ERROR;
  169.             }
  170.         }
  171.         CloseLibrary( &IntuitionBase->LibNode );
  172.     }
  173.     if( status != RETURN_OK )
  174.         DisplayBeep( IntuitionBase->ActiveScreen );
  175.     exit( status );
  176. }
  177.