home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 118.lha / showlocks.c < prev    next >
C/C++ Source or Header  |  1986-11-20  |  4KB  |  141 lines

  1. /*
  2.  *    showlocks.c
  3.  *
  4.  * Written 13-Mar-88 by Chuck McManis
  5.  * Copyright 1988 Charles McManis, All rights reserved. 
  6.  * This file may be freely redistributed and used as long as this notice remains
  7.  * with it.
  8.  *
  9.  * This program will list out all of the locks that are being held on the 
  10.  * specified volume. You can enter either a volume name or disk device.
  11.  *
  12.  * The output of this program is :
  13.  *    Lock #0 : 'Path'
  14.  *    Lock #1 : 'Path'
  15.  *    ...
  16.  */
  17.  
  18. #include <exec/types.h>
  19. #include <exec/memory.h>
  20. #include <libraries/dos.h>
  21. #include <libraries/dosextens.h>
  22.  
  23. extern struct DosLibrary *DOSBase;
  24. char    *GetPath();
  25.  
  26. void
  27. main(argc,argv)
  28.  
  29. int    argc;
  30. char    *argv[];
  31.  
  32. {
  33.   int            j,NumVols;
  34.   struct DeviceList    *dl,*vols[20];
  35.   struct RootNode    *rn;
  36.   struct DosInfo    *di;
  37.   char            *t,tmpname[40];
  38.  
  39.  
  40.   if (argc != 2) {
  41.     printf("Usage is : ShowLocks Volumename:\n");
  42.     exit(0);
  43.   }
  44.  
  45.   NumVols=0;
  46.   if (strcmp(argv[1],"all") == 0) {
  47.     /* Find the device list */
  48.     rn = (struct RootNode *)DOSBase->dl_Root;
  49.     di = (struct DosInfo  *)BADDR(rn->rn_Info);
  50.     /* While searching the list we lock out Multitasking */
  51.     Forbid();
  52.     for (dl = (struct DeviceList *)BADDR(di->di_DevInfo); dl;
  53.      dl = (struct DeviceList *)BADDR(dl->dl_Next)) 
  54.       if (dl->dl_Type == DLT_VOLUME) vols[NumVols++] = dl;
  55.     Permit(); /* Back to multitasking mode */
  56.   }
  57.  
  58.   printf("Lock Monitor, prints out outstanding locks on a given volume.\n");
  59.   if (NumVols) {
  60.     for (j=0; j<NumVols; j++) {
  61.       t = (char *)BADDR(vols[j]->dl_Name);
  62.       t++; /* point past the length */
  63.       strcpy(tmpname,t);   /* Put the name in here... */
  64.       strcat(tmpname,":"); /* and append a colon ... */
  65.       /*BUG*BUG*BUG*BUG*BUG*BUG*BUG*BUG*BUG*/
  66.       /* Delete this line when you get 1.3 */
  67.       if (strcmp(t,"RAM Disk") == 0) continue;
  68.       if (vols[j]->dl_Task) {
  69.         printf("Locks held on Volume %s\n",tmpname);
  70.     PrintLocks(tmpname);
  71.       } else printf("Volume %s is not mounted.\n",tmpname);
  72.     } 
  73.   } else {
  74.     printf("Locks held on Volume %s\n",argv[1]);
  75.     PrintLocks(argv[1]);
  76.   }
  77. }
  78.  
  79. PrintLocks(str)
  80.  
  81. char *str;
  82. {
  83.   ULONG            thislock;
  84.   struct FileLock     *fl;
  85.   int            i;
  86.  
  87.   thislock = Lock(str,ACCESS_READ);
  88.   i = 0;
  89.   for (fl = (struct FileLock *)(BADDR(thislock)); fl;
  90.        fl = (struct FileLock *)(BADDR(fl->fl_Link))) 
  91.       printf("    Lock #%d : '%s'\n",i++,GetPath((ULONG)(fl) >> 2));
  92.   if (thislock) UnLock(thislock);
  93.   return(0);
  94. }
  95.  
  96. /*
  97.  * Function GetPath()
  98.  *
  99.  * This function will return a pointer to a string with the path of
  100.  * the passed lock.
  101.  */
  102. char *
  103. GetPath(Lck)
  104.  
  105. ULONG    Lck;
  106.  
  107. {
  108.  
  109.   static char    LockPath[256];
  110.   UWORD        FDATA[sizeof(struct FileInfoBlock)/2+1];
  111.   ULONG        CurLock,NewLock;
  112.   char        *s;
  113.   struct FileInfoBlock    *fi;
  114.  
  115.  
  116.   /* Initialize LockPath to the NULL string */
  117.   LockPath[0]  = '\0';
  118.   if ((Lck == 0) || (Lck == ~0L))
  119.     return(LockPath); /* If Lock is on root (0) return */
  120.  
  121.   /* Initialize fi so that it is on a long word boundary */
  122.   if ((long)(FDATA) & 2) fi = (struct FileInfoBlock *)(&FDATA[1]);
  123.   else fi = (struct FileInfoBlock *)FDATA;
  124.  
  125.   CurLock = DupLock(Lck); /* Make a copy of the Lock passed */
  126.   while (CurLock != NULL) {
  127.     Examine(CurLock,fi);
  128.     if ((CurLock != 0) && (fi->fib_DiskKey != 0)) {
  129.       if (strlen(LockPath)) strins(LockPath,"/");
  130.       strins(LockPath,fi->fib_FileName);
  131.     }
  132.     NewLock = ParentDir(CurLock);
  133.     UnLock(CurLock);
  134.     CurLock = NewLock;
  135.   }
  136.   /* Fix up the volume name to include a colon */
  137.   for (s = LockPath; *s; s++) if (*s == '/') {*s = ':'; break;}
  138.   if (!(*s)) strcat(LockPath,":"); 
  139.   return(LockPath);
  140. }
  141.