home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / prog / source / doshandl.lha / No.6 < prev    next >
Text File  |  1988-05-14  |  7KB  |  262 lines

  1. #include "exec/types.h"
  2. #include "exec/libraries.h"
  3. #include "exec/memory.h"
  4. #include "libraries/dos.h"
  5. #include "libraries/dosextens.h"
  6.  
  7. #define QTOUPPER(c)      ((c)>='a'&&(c)<='z'?(c)-'a'+'A':(c))
  8. #define MAXCHARS    4096
  9.  
  10. #undef  BADDR
  11. #define BADDR(x)        ((APTR)((LONG)x << 2))
  12.  
  13. struct DosList {
  14.     BPTR                dol_Next;        /* bptr to next device list */
  15.     LONG                dol_Type;        /* see DLT below */
  16.     struct MsgPort     *dol_Task;        /* ptr to handler task */
  17.     BPTR                dol_Lock;
  18.     union {
  19.     struct {
  20.         BSTR            *dol_Handler;
  21.         LONG            dol_StackSize;
  22.         LONG            dol_Priority;
  23.         ULONG            dol_Startup;
  24.         BPTR                dol_SegList;
  25.         BPTR                dol_GlobVec;
  26.     } dol_handler;
  27.  
  28.        struct {
  29.         struct DateStamp        dol_VolumeDate;  /* creation date */
  30.         BPTR                    dol_LockList;    /* outstanding locks */
  31.         LONG                    dol_DiskType;    /* 'DOS', etc */
  32.     } dol_volume;
  33.  
  34.     } dol_misc;
  35.  
  36.     BSTR                *dol_Name;        /* bptr to bcpl name */
  37. };
  38.  
  39. struct DosEnvec {
  40.     ULONG de_TableSize;      /* Size of Environment vector */
  41.     ULONG de_SizeBlock;      /* in longwords: standard value is 128 */
  42.     ULONG de_SecOrg;         /* not used; must be 0 */
  43.     ULONG de_Surfaces;       /* # of heads (surfaces). drive specific */
  44.     ULONG de_SectorPerBlock; /* not used; must be 1 */
  45.     ULONG de_BlocksPerTrack; /* blocks per track. drive specific */
  46.     ULONG de_Reserved;       /* DOS reserved blocks at start of partition. */
  47.     ULONG de_PreAlloc;       /* DOS reserved blocks at end of partition */
  48.     ULONG de_Interleave;     /* usually 0 */
  49.     ULONG de_LowCyl;         /* starting cylinder. typically 0 */
  50.     ULONG de_HighCyl;        /* max cylinder.  drive specific */
  51.     ULONG de_NumBuffers;     /* Initial # DOS of buffers.  */
  52.     ULONG de_BufMemType;     /* type of mem to allocate for buffers */
  53.     ULONG de_MaxTransfer;    /* Maximum number of blocks to transfer at a time */
  54.     ULONG de_Mask;           /* Address Mask to block out certain memory */
  55.     LONG  de_BootPri;        /* Boot priority for autoboot */
  56.     ULONG de_DosType;        /* ASCII (HEX) string showing filesystem type;
  57.                  * 0X444F5300 is old filesystem,
  58.                  * 0X444F5301 is fast file system */
  59. };
  60.  
  61. struct FileSysStartupMsg {
  62. ULONG       fssm_Unit;      /* exec unit number for this device */
  63. BSTR        fssm_Device;    /* null terminated bstring to the device name */
  64. BPTR        fssm_Environ;   /* ptr to environment table (see above) */
  65. ULONG       fssm_Flags;     /* flags for OpenDevice() */
  66. };
  67.  
  68. UBYTE *buffer,*point, *base;    /* for the output buffer */
  69. int len;
  70.  
  71. extern struct Library *DOSBase;
  72.  
  73. main(argc,argv)
  74. int argc;
  75. UBYTE *argv[];
  76. {
  77. ULONG type;
  78. BPTR seglist;
  79. struct MsgPort *task;
  80. UBYTE *name, *handler, *devicename,*p;
  81. ULONG  deviceunit,deviceflags;
  82. ULONG file;
  83. int i;
  84. BOOL flags[3];        /* used for argument parsing */
  85.  
  86. struct  DosLibrary   *dosLibrary;
  87. struct  RootNode     *RootNode;
  88. struct  DosInfo      *dosInfo;
  89. struct  DosList      *DevInfo;
  90. struct  FileSysStartupMsg *startup;
  91. struct  DosEnvec *env;
  92. UBYTE b[255];
  93.  
  94.     if(*argv[argc-1]=='?') {
  95.     printf("Usage: %ls DEVS|VOLS|DIRS\n",argv[0]);
  96.     exit(0);
  97.     }
  98.  
  99.     if(argc == 1) {
  100.     flags[0]=TRUE;
  101.     flags[1]=TRUE;
  102.     flags[2]=TRUE;
  103.     }
  104.     else {
  105.     flags[0]=0;
  106.     flags[1]=0;
  107.     flags[2]=0;
  108.  
  109.         for(i=1; i<argc; i++) {
  110.         if (!(strcmpi("devs",argv[i])))flags[0]=TRUE;
  111.         if (!(strcmpi("vols",argv[i])))flags[1]=TRUE;
  112.         if (!(strcmpi("dirs",argv[i])))flags[2]=TRUE;
  113.     }
  114.     }
  115. dosLibrary = (struct DosLibrary *)DOSBase;
  116. RootNode = (struct RootNode *)dosLibrary->dl_Root;
  117. dosInfo = (struct DosInfo *)BADDR(RootNode->rn_Info);
  118. DevInfo = (struct DosList *)BADDR(dosInfo->di_DevInfo);
  119.  
  120. if(!(buffer=(UBYTE *)AllocMem(MAXCHARS,MEMF_PUBLIC|MEMF_CLEAR)))exit(20);
  121. point = buffer;
  122.  
  123. Forbid();
  124. /* walk the device list */
  125. while ((DevInfo != NULL) && (!(SetSignal(0,0) & SIGBREAKF_CTRL_C))) { 
  126.  
  127.     type = DevInfo->dol_Type;
  128.     task = DevInfo->dol_Task;
  129.     name = (char *)BADDR(DevInfo->dol_Name)+1;
  130.  
  131.     if((type == DLT_DEVICE) && (flags[0])) {
  132.         sprintf(b,"Device: %ls at %lx, task is %lx ",name,DevInfo,task);
  133.     bp(b);
  134.     if(task)bp("(resident)\n");
  135.     else {
  136.         bp(" (not resident)\n");
  137.  
  138.         seglist = DevInfo->dol_misc.dol_handler.dol_SegList;
  139.         if(seglist==0) {
  140.         sprintf(b,"   code not in memory\n");
  141.         bp(b);
  142.         }
  143.         else {
  144.         sprintf(b,"  code is at %lx\n",BADDR(seglist));
  145.         bp(b);
  146.         }
  147.         handler=(char *)BADDR(DevInfo->dol_misc.dol_handler.dol_Handler)+1;
  148.         if(handler) {
  149.         sprintf(b,"  handler is  %ls\n\017",handler);
  150.         bp(b);
  151.         }
  152.         sprintf(b,"  stacksize is %ld\n",
  153.         DevInfo->dol_misc.dol_handler.dol_StackSize);
  154.         bp(b);
  155.         sprintf(b,"  priority is %ld\n",
  156.         DevInfo->dol_misc.dol_handler.dol_Priority);
  157.         bp(b);
  158.         sprintf(b,"  globvec is  %lx\n",
  159.         BADDR(DevInfo->dol_misc.dol_handler.dol_GlobVec));
  160.         bp(b);
  161.     }
  162.     if(DevInfo->dol_misc.dol_handler.dol_Startup > 2) {
  163.         startup=(struct FileSysStartupMsg *)
  164.         BADDR(DevInfo->dol_misc.dol_handler.dol_Startup);
  165.         devicename  = (char *)BADDR(startup->fssm_Device)+1;
  166.         env  = (struct DosEnvec *)(BADDR(startup->fssm_Environ));
  167.         deviceunit  = startup->fssm_Unit;
  168.         deviceflags = startup->fssm_Flags;
  169.         sprintf(b,"  Environment vector size %ld\n",(ULONG)env->de_TableSize);
  170.         bp(b);
  171.         sprintf(b,"|     Device name is %s, unit is %ld\n",
  172.         devicename,deviceunit);
  173.         bp(b);
  174.         sprintf(b,"|     Surfaces = %ld, BlocksPerTrack = %ld\n",
  175.         env->de_Surfaces,env->de_BlocksPerTrack);
  176.         bp(b);
  177.         sprintf(b,"|     Reserved = %ld, LowCyl=%ld, HighCyl=%ld\n",
  178.         env->de_Reserved,env->de_LowCyl,env->de_HighCyl);
  179.         bp(b);
  180.         sprintf(b,"|     NumNuffers = %ld, BufMemType = %ld\n",
  181.         env->de_NumBuffers,env->de_BufMemType);
  182.         bp(b);
  183.         if(env->de_TableSize > 12) {
  184.             sprintf(b,"|     MaxTransfer = %ld, Mask = %lx, BootPri = %ld\n",
  185.             env->de_MaxTransfer,env->de_Mask, env->de_BootPri);
  186.         bp(b);
  187.             sprintf(b,"|     DosType is %lx\n",env->de_DosType);
  188.         bp(b);
  189.         }
  190.     }
  191.     else bp("  No environment vector\n");
  192.     }
  193.     else if ((type == DLT_VOLUME) & (flags[1])) {
  194.         sprintf(b,"Volume: %ls at %lx, File task is %lx ",name,DevInfo,task);
  195.     bp(b);
  196.     if (task)bp("[Mounted]\n");
  197.     else bp("[Not Mounted]\n");
  198.     sprintf(b,"  LockList is %lx\n",
  199.         BADDR(DevInfo->dol_misc.dol_volume.dol_LockList));
  200.     bp(b);
  201.         sprintf(b,"  DiskType is %lx\n",
  202.         DevInfo->dol_misc.dol_volume.dol_DiskType);
  203.     bp(b);
  204.     }
  205.     else if ((type == DLT_DIRECTORY) && (flags[2])) {
  206.         sprintf(b,"Directory: %ls at %lx, FileSystem task is %lx, lock is %lx\n",name,DevInfo,task,DevInfo->dol_Lock);
  207.     bp(b);
  208.     }
  209.     DevInfo = (struct DosList *)BADDR(DevInfo->dol_Next);
  210. }
  211.  
  212. Permit();
  213.     len = point-buffer;
  214.     point = buffer;
  215.     base = buffer;
  216.     for(i=0; i<len; i++) {
  217.     if((UBYTE)*point++ == 0) {
  218.         printf("%s",base);
  219.         base = point;
  220.     }
  221.     }
  222.  
  223. FreeMem(buffer,MAXCHARS);
  224. exit(0);
  225. }
  226.  
  227. strcmpi(str1, str2)
  228. char *str1,*str2;
  229. {
  230.         UBYTE *astr =str1;
  231.     UBYTE *bstr =str2;
  232.     UBYTE c;
  233.  
  234.     while ( (c = QTOUPPER(*astr)) && (c == QTOUPPER(*bstr)))
  235.     astr++, bstr++;
  236.     if( ! c ) return ( 0 );
  237.     if( c < *bstr ) return( -1 );
  238.     return( 1 );
  239. }
  240.  
  241.  
  242. strlen( str )
  243. UBYTE *str;
  244. {
  245.     UBYTE *pt ;
  246.  
  247.     for ( pt=str ; *pt != '\0' ; pt++ );
  248.     return( pt-str );
  249. }
  250.  
  251.  
  252. bp(s)
  253. UBYTE *s;
  254. {
  255. int i;
  256.  
  257. i=strlen(s);
  258. if((point+i) < (buffer+MAXCHARS))sprintf(point,s);
  259. point += (i+1);
  260. }
  261.  
  262.