home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / OB3.2D2.DMS / in.adf / Module / SecureDos.mod < prev    next >
Encoding:
Text File  |  1994-08-05  |  4.2 KB  |  218 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                                                                         *)
  3. (*  Amiga Oberon Library Module: SecureDos            Date: 02-Nov-92      *)
  4. (*                                                                         *)
  5. (*   © 1991 by Fridtjof Siebert                                            *)
  6. (*                                                                         *)
  7. (*-------------------------------------------------------------------------*)
  8.  
  9. MODULE SecureDos;
  10.  
  11. IMPORT d * := Dos,
  12.        e   := Exec,
  13.        l   := Lists,
  14.        ol  := OberonLib,
  15.        sys := SYSTEM;
  16.  
  17. VAR
  18.   Me * : d.ProcessPtr;
  19.  
  20. TYPE
  21.   FHNodePtr = POINTER TO FHNode;
  22.   FHNode = RECORD (l.Node)
  23.              fh: d.FileHandlePtr
  24.            END;
  25.   LockNodePtr = POINTER TO LockNode;
  26.   LockNode = RECORD (l.Node)
  27.                lock: d.FileLockPtr
  28.              END;
  29.  
  30. VAR
  31.   fhlist: l.List;
  32.   locklist: l.List;
  33.   oldCurrentDir*: d.FileLockPtr;
  34.  
  35.  
  36. PROCEDURE Open*(name: ARRAY OF CHAR;                    (* $CopyArrays- *)
  37.                 accessMode: LONGINT): d.FileHandlePtr;
  38.  
  39. VAR
  40.   el: FHNodePtr;
  41.  
  42. BEGIN
  43.   NEW(el);
  44.   IF el=NIL THEN RETURN NIL END;
  45.   el.fh := d.Open(name,accessMode);
  46.   IF el.fh=NIL THEN
  47. (* $IFNOT GarbageCollector *)
  48.     DISPOSE(el);
  49. (* $END *)
  50.     RETURN NIL
  51.   END;
  52.   l.AddHead(fhlist,el);
  53.   RETURN el.fh;
  54. END Open;
  55.  
  56.  
  57. PROCEDURE OpenFromLock*(lock: d.FileLockPtr): d.FileHandlePtr;
  58. VAR
  59.   el: FHNodePtr;
  60.   np: l.NodePtr;
  61. BEGIN
  62.   NEW(el);
  63.   IF el=NIL THEN RETURN NIL END;
  64.   el.fh := d.OpenFromLock(lock);
  65.   IF el.fh=NIL THEN
  66. (* $IFNOT GarbageCollector *)
  67.     DISPOSE(el);
  68. (* $END *)
  69.     RETURN NIL
  70.   END;
  71.   l.AddHead(fhlist,el);
  72.   np := l.Head(locklist);
  73.   WHILE (np#NIL) & (np(LockNode).lock#lock) DO np := np.next END;
  74.   IF np#NIL THEN
  75.     l.Remove(locklist,np);
  76. (* $IFNOT GarbageCollector *)
  77.     DISPOSE(np);
  78. (* $END *)
  79.   END;
  80.   RETURN el.fh;
  81. END OpenFromLock;
  82.  
  83.  
  84. PROCEDURE Close*(file: d.FileHandlePtr);
  85.  
  86. VAR el: l.NodePtr;
  87.  
  88. BEGIN
  89.   el := l.Head(fhlist);
  90.   REPEAT
  91.     IF el(FHNode).fh=file THEN
  92.       l.Remove(fhlist,el);
  93.       d.OldClose(file);
  94. (* $IFNOT GarbageCollector *)
  95.       DISPOSE(el);
  96. (* $END *)
  97.       RETURN;
  98.     END;
  99.   UNTIL ~ l.Next(el);
  100.   HALT(20);  (* File gar nicht offen! *)
  101. END Close;
  102.  
  103.  
  104. PROCEDURE Lock*(name: ARRAY OF CHAR;                   (* $CopyArrays- *)
  105.                 accessMode: LONGINT): d.FileLockPtr;
  106.  
  107. VAR el: LockNodePtr;
  108.  
  109. BEGIN
  110.   NEW(el);
  111.   IF el=NIL THEN RETURN NIL END;
  112.   el.lock := d.Lock(name,accessMode);
  113.   IF el.lock=NIL THEN
  114. (* $IFNOT GarbageCollector *)
  115.     DISPOSE(el);
  116. (* $END *)
  117.     RETURN NIL
  118.   END;
  119.   l.AddHead(locklist,el);
  120.   RETURN el.lock;
  121. END Lock;
  122.  
  123.  
  124. PROCEDURE AddLock(lock: d.FileLockPtr): d.FileLockPtr;
  125. VAR el: LockNodePtr;
  126. BEGIN
  127.   IF lock#NIL THEN
  128.     NEW(el);
  129.     IF el#NIL THEN
  130.       el.lock := lock;
  131.       l.AddHead(locklist,el);
  132.       RETURN lock;
  133.     END;
  134.     d.UnLock(lock);
  135.   END;
  136.   RETURN NIL;
  137. END AddLock;
  138.  
  139.  
  140. PROCEDURE ParentDir*(lock: d.FileLockPtr): d.FileLockPtr;
  141. BEGIN
  142.   RETURN AddLock(d.ParentDir(lock));
  143. END ParentDir;
  144.  
  145.  
  146. PROCEDURE DupLock*(lock: d.FileLockPtr): d.FileLockPtr;
  147. BEGIN
  148.   RETURN AddLock(d.DupLock(lock));
  149. END DupLock;
  150.  
  151.  
  152. PROCEDURE CreateDir*(name: ARRAY OF CHAR): d.FileLockPtr;  (* $CopyArrays- *)
  153. BEGIN
  154.   RETURN AddLock(d.CreateDir(name));
  155. END CreateDir;
  156.  
  157.  
  158. PROCEDURE ParentOfFH*(fh: d.FileHandlePtr): d.FileLockPtr;
  159. BEGIN
  160.   RETURN AddLock(d.ParentOfFH(fh));
  161. END ParentOfFH;
  162.  
  163.  
  164. PROCEDURE DupLockFromFH*(fh: d.FileHandlePtr): d.FileLockPtr;
  165. BEGIN
  166.   RETURN AddLock(d.DupLockFromFH(fh));
  167. END DupLockFromFH;
  168.  
  169.  
  170. PROCEDURE UnLock*(lock: d.FileLockPtr);
  171. VAR el: l.NodePtr;
  172. BEGIN
  173.   el := l.Head(locklist);
  174.   REPEAT
  175.     IF el(LockNode).lock=lock THEN
  176.       l.Remove(locklist,el);
  177.       d.UnLock(lock);
  178. (* $IFNOT GarbageCollector *)
  179.       DISPOSE(el);
  180. (* $END *)
  181.       RETURN;
  182.     END;
  183.   UNTIL ~ l.Next(el);
  184.   HALT(20);  (* existiert nicht ! *)
  185. END UnLock;
  186.  
  187.  
  188. PROCEDURE * CloseIt(n: l.NodePtr);
  189. BEGIN
  190.   d.OldClose(n(FHNode).fh)
  191. END CloseIt;
  192.  
  193.  
  194. PROCEDURE * UnLockIt(n: l.NodePtr);
  195. BEGIN
  196.   d.UnLock(n(LockNode).lock);
  197. END UnLockIt;
  198.  
  199.  
  200. BEGIN
  201.  
  202.   Me := sys.VAL(d.ProcessPtr,ol.Me);
  203.   oldCurrentDir := Me.currentDir;
  204.  
  205.   l.Init(fhlist);
  206.   l.Init(locklist);
  207.  
  208. CLOSE
  209.  
  210.   IF d.CurrentDir(oldCurrentDir)=NIL THEN END;
  211.  
  212.   l.DoForward(fhlist,CloseIt);
  213.   l.DoForward(locklist,UnLockIt);
  214.  
  215. END SecureDos.
  216.  
  217.  
  218.