home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / source / doslist.lha / doslist.c < prev    next >
C/C++ Source or Header  |  1988-08-22  |  5KB  |  211 lines

  1. /* Copyright 1988, Commodore-Amiga, Inc.
  2.            Andy Finkel
  3.    This program may be distributed freely as long as this
  4.    notice remains intact
  5. */
  6.  
  7. #include "exec/types.h"
  8. #include "exec/libraries.h"
  9. #include "exec/memory.h"
  10. #include "/usr/skipper/andy/V/includes/libraries/dos.h"
  11. #include "/usr/skipper/andy/V/includes/libraries/dosextens.h"
  12. #include "/usr/skipper/andy/V/includes/libraries/filehandler.h"
  13.  
  14. #define QTOUPPER(c)      ((c)>='a'&&(c)<='z'?(c)-'a'+'A':(c))
  15. #define MAXCHARS    4096
  16.  
  17. UBYTE *buffer,*point, *base;    /* for the output buffer */
  18. int len;
  19.  
  20. extern struct Library *DOSBase;
  21.  
  22. main(argc,argv)
  23. int argc;
  24. UBYTE *argv[];
  25. {
  26. ULONG type;
  27. BPTR seglist;
  28. struct MsgPort *task;
  29. UBYTE *name, *handler, *devicename,*p;
  30. ULONG  deviceunit,deviceflags;
  31. ULONG file;
  32. int i;
  33. BOOL flags[3];        /* used for argument parsing */
  34.  
  35. struct  DosLibrary   *dosLibrary;
  36. struct  RootNode     *RootNode;
  37. struct  DosInfo      *dosInfo;
  38. struct  DosList      *DevInfo;
  39. struct  FileSysStartupMsg *startup;
  40. struct  DosEnvec *env;
  41. UBYTE b[255];
  42.  
  43.     if(*argv[argc-1]=='?') {
  44.     printf("Usage: %ls DEVS|VOLS|DIRS\n",argv[0]);
  45.     exit(0);
  46.     }
  47.  
  48.     if(argc == 1) {
  49.     flags[0]=TRUE;
  50.     flags[1]=TRUE;
  51.     flags[2]=TRUE;
  52.     }
  53.     else {
  54.     flags[0]=0;
  55.     flags[1]=0;
  56.     flags[2]=0;
  57.  
  58.         for(i=1; i<argc; i++) {
  59.         if (!(strcmpi("devs",argv[i])))flags[0]=TRUE;
  60.         if (!(strcmpi("vols",argv[i])))flags[1]=TRUE;
  61.         if (!(strcmpi("dirs",argv[i])))flags[2]=TRUE;
  62.     }
  63.     }
  64. dosLibrary = (struct DosLibrary *)DOSBase;
  65. RootNode = (struct RootNode *)dosLibrary->dl_Root;
  66. dosInfo = (struct DosInfo *)BADDR(RootNode->rn_Info);
  67. DevInfo = (struct DosList *)BADDR(dosInfo->di_DevInfo);
  68.  
  69. if(!(buffer=(UBYTE *)AllocMem(MAXCHARS,MEMF_PUBLIC|MEMF_CLEAR)))exit(20);
  70. point = buffer;
  71.  
  72. Forbid();
  73. /* walk the device list */
  74. while ((DevInfo != NULL) && (!(SetSignal(0,0) & SIGBREAKF_CTRL_C))) { 
  75.  
  76.     type = DevInfo->dol_Type;
  77.     task = DevInfo->dol_Task;
  78.     name = (char *)BADDR(DevInfo->dol_Name)+1;
  79.  
  80.     if((type == DLT_DEVICE) && (flags[0])) {
  81.         sprintf(b,"Device: %ls at %lx, task is %lx ",name,DevInfo,task);
  82.     bp(b);
  83.     if(task)bp("(resident)\n");
  84.     else {
  85.         bp(" (not resident)\n");
  86.  
  87.         seglist = DevInfo->dol_misc.dol_handler.dol_SegList;
  88.         if(seglist==0) {
  89.         sprintf(b,"   code not in memory\n");
  90.         bp(b);
  91.         }
  92.         else {
  93.         sprintf(b,"  code is at %lx\n",BADDR(seglist));
  94.         bp(b);
  95.         }
  96.         handler=(char *)BADDR(DevInfo->dol_misc.dol_handler.dol_Handler)+1;
  97.         if(handler) {
  98.         sprintf(b,"  handler is  %ls\n\017",handler);
  99.         bp(b);
  100.         }
  101.         sprintf(b,"  stacksize is %ld\n",
  102.         DevInfo->dol_misc.dol_handler.dol_StackSize);
  103.         bp(b);
  104.         sprintf(b,"  priority is %ld\n",
  105.         DevInfo->dol_misc.dol_handler.dol_Priority);
  106.         bp(b);
  107.         sprintf(b,"  globvec is  %lx\n",
  108.         BADDR(DevInfo->dol_misc.dol_handler.dol_GlobVec));
  109.         bp(b);
  110.     }
  111.     if(DevInfo->dol_misc.dol_handler.dol_Startup > 2) {
  112.         startup=(struct FileSysStartupMsg *)
  113.         BADDR(DevInfo->dol_misc.dol_handler.dol_Startup);
  114.         devicename  = (char *)BADDR(startup->fssm_Device)+1;
  115.         env  = (struct DosEnvec *)(BADDR(startup->fssm_Environ));
  116.         deviceunit  = startup->fssm_Unit;
  117.         deviceflags = startup->fssm_Flags;
  118.         sprintf(b,"  Environment vector size %ld\n",(ULONG)env->de_TableSize);
  119.         bp(b);
  120.         sprintf(b,"|     Device name is %s, unit is %ld\n",
  121.         devicename,deviceunit);
  122.         bp(b);
  123.         sprintf(b,"|     Surfaces = %ld, BlocksPerTrack = %ld\n",
  124.         env->de_Surfaces,env->de_BlocksPerTrack);
  125.         bp(b);
  126.         sprintf(b,"|     Reserved = %ld, LowCyl=%ld, HighCyl=%ld\n",
  127.         env->de_Reserved,env->de_LowCyl,env->de_HighCyl);
  128.         bp(b);
  129.         sprintf(b,"|     NumNuffers = %ld, BufMemType = %ld\n",
  130.         env->de_NumBuffers,env->de_BufMemType);
  131.         bp(b);
  132.         if(env->de_TableSize > 12) {
  133.             sprintf(b,"|     MaxTransfer = %ld, Mask = %lx, BootPri = %ld\n",
  134.             env->de_MaxTransfer,env->de_Mask, env->de_BootPri);
  135.         bp(b);
  136.             sprintf(b,"|     DosType is %lx\n",env->de_DosType);
  137.         bp(b);
  138.         }
  139.     }
  140.     else bp("  No environment vector\n");
  141.     }
  142.     else if ((type == DLT_VOLUME) & (flags[1])) {
  143.         sprintf(b,"Volume: %ls at %lx, File task is %lx ",name,DevInfo,task);
  144.     bp(b);
  145.     if (task)bp("[Mounted]\n");
  146.     else bp("[Not Mounted]\n");
  147.     sprintf(b,"  LockList is %lx\n",
  148.         BADDR(DevInfo->dol_misc.dol_volume.dol_LockList));
  149.     bp(b);
  150.         sprintf(b,"  DiskType is %lx\n",
  151.         DevInfo->dol_misc.dol_volume.dol_DiskType);
  152.     bp(b);
  153.     }
  154.     else if ((type == DLT_DIRECTORY) && (flags[2])) {
  155.         sprintf(b,"Directory: %ls at %lx, FileSystem task is %lx, lock is %lx\n",name,DevInfo,task,DevInfo->dol_Lock);
  156.     bp(b);
  157.     }
  158.     DevInfo = (struct DosList *)BADDR(DevInfo->dol_Next);
  159. }
  160.  
  161. Permit();
  162.     len = point-buffer;
  163.     point = buffer;
  164.     base = buffer;
  165.     for(i=0; i<len; i++) {
  166.     if((UBYTE)*point++ == 0) {
  167.         printf("%s",base);
  168.         base = point;
  169.     }
  170.     }
  171.  
  172. FreeMem(buffer,MAXCHARS);
  173. exit(0);
  174. }
  175.  
  176. strcmpi(str1, str2)
  177. char *str1,*str2;
  178. {
  179.         UBYTE *astr =str1;
  180.     UBYTE *bstr =str2;
  181.     UBYTE c;
  182.  
  183.     while ( (c = QTOUPPER(*astr)) && (c == QTOUPPER(*bstr)))
  184.     astr++, bstr++;
  185.     if( ! c ) return ( 0 );
  186.     if( c < *bstr ) return( -1 );
  187.     return( 1 );
  188. }
  189.  
  190.  
  191. strlen( str )
  192. UBYTE *str;
  193. {
  194.     UBYTE *pt ;
  195.  
  196.     for ( pt=str ; *pt != '\0' ; pt++ );
  197.     return( pt-str );
  198. }
  199.  
  200.  
  201. bp(s)
  202. UBYTE *s;
  203. {
  204. int i;
  205.  
  206. i=strlen(s);
  207. if((point+i) < (buffer+MAXCHARS))sprintf(point,s);
  208. point += (i+1);
  209. }
  210.  
  211.