home *** CD-ROM | disk | FTP | other *** search
/ back2roots/padua / padua.7z / padua / misc / remlock.lzh / RemLock.mod < prev    next >
Encoding:
Text File  |  1989-07-03  |  2.3 KB  |  94 lines

  1. (*
  2.   :Program.       RemLock
  3.   :Author.        Volker Rudolph
  4.   :Address.       Medicusstr. 31 / 6750 Kaiserslautern
  5.   :Phone.         0631/17160
  6.   :ShortCut.      [vor]
  7.   :Version.       1.0
  8.   :Date.          30.7.89
  9.   :Copyright.     PD
  10.   :Language.      Modula-II
  11.   :Translator.    M2Amiga 3.2d
  12.   :Imports.       Printf [vor], ARP [fbs]
  13.   :Contents.      Entfernt ⁿberflⁿssige File-Locks
  14.   :Usage.         RemLock <DeviceName>
  15. *)
  16.  
  17. MODULE RemLock;
  18.  
  19. FROM Arts IMPORT Terminate,CurrentLevel;
  20. FROM Arguments IMPORT GetArg,NumArgs;
  21. FROM ARP IMPORT PathName,dSize;
  22. FROM Conversions IMPORT StrToVal;
  23. FROM Dos IMPORT Lock,UnLock,FileLockPtr,sharedLock;
  24. FROM Exec IMPORT Forbid,Permit;
  25. FROM Printf IMPORT L,writeProc,Printf0,Printf1,Printf2;
  26. FROM Terminal IMPORT WriteString,ReadLn;
  27. FROM SYSTEM IMPORT ADDRESS,BPTR,ADR;
  28.  
  29. CONST
  30.   MaxLocks = 1000;
  31.   MaxDirs = 10;
  32.  
  33. TYPE
  34.   LockCount = [1..MaxLocks];
  35.  
  36. VAR
  37.   lockArr:ARRAY LockCount OF FileLockPtr;
  38.   path:ARRAY [1..dSize*MaxDirs] OF CHAR;
  39.   str:ARRAY [1..80] OF CHAR;
  40.   select:LONGINT;
  41.   lockNum:LockCount;
  42.   len:INTEGER;
  43.   i:LockCount;
  44.   sign:BOOLEAN;
  45.   error:BOOLEAN;
  46.  
  47.   PROCEDURE ReadLocks(path:ARRAY OF CHAR):LockCount;
  48.   VAR
  49.     startLock:FileLockPtr;
  50.     lock:FileLockPtr;
  51.     count:LockCount;
  52.   BEGIN
  53.     startLock := Lock(ADR(path),sharedLock);
  54.     IF startLock = NIL THEN
  55.       Printf1("Can't open %s.\n",ADR(path));
  56.       Terminate(CurrentLevel());
  57.     END; (* IF *)
  58.     lock := startLock^.link;
  59.     count := 1;
  60.     Forbid;
  61.     WHILE (lock # NIL) AND (count < MaxLocks) DO
  62.       lockArr[count] := lock;
  63.       INC(count);
  64.       lock := lock^.link;
  65.     END; (* WHILE *)
  66.     Permit;
  67.     UnLock(startLock);
  68.     RETURN count;
  69.   END ReadLocks;
  70.  
  71. BEGIN
  72.   writeProc := WriteString;
  73.   GetArg(1,str,len);
  74.   IF (NumArgs() # 1) OR ((str[1] = '?') AND (str[2] = 0C)) THEN
  75.     Printf0("RemLock 1989 by Volker Rudolph\n");
  76.     Printf0("Usage:\n  RemLock DeviceName\\A\n");
  77.     Terminate(CurrentLevel());
  78.   END; (* IF *)
  79.   lockNum := ReadLocks(str);
  80.   FOR i := 1 TO lockNum DO
  81.     len := PathName(lockArr[i],ADR(path),MaxDirs);
  82.     Printf2("%2ld: %s\n",i,ADR(path));
  83.   END; (* FOR *)
  84.   Printf0("Lock-number : ");
  85.   ReadLn(str,len);
  86.   StrToVal(str,select,sign,10,error);
  87.   IF error OR sign OR (select = 0) OR (select > L(lockNum)) THEN
  88.     Printf0("\nNothing happened.\n");
  89.   ELSE
  90.     UnLock(lockArr[select]);
  91.     Printf0("\nLock removed.\n");
  92.   END; (* IF *)
  93. END RemLock.
  94.