home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* *)
- (* Amiga Oberon Library Module: SecureDos Date: 02-Nov-92 *)
- (* *)
- (* © 1991 by Fridtjof Siebert *)
- (* *)
- (*-------------------------------------------------------------------------*)
-
- MODULE SecureDos;
-
- IMPORT d * := Dos,
- e := Exec,
- l := Lists,
- ol := OberonLib,
- sys := SYSTEM;
-
- VAR
- Me * : d.ProcessPtr;
-
- TYPE
- FHNodePtr = POINTER TO FHNode;
- FHNode = RECORD (l.Node)
- fh: d.FileHandlePtr
- END;
- LockNodePtr = POINTER TO LockNode;
- LockNode = RECORD (l.Node)
- lock: d.FileLockPtr
- END;
-
- VAR
- fhlist: l.List;
- locklist: l.List;
- oldCurrentDir*: d.FileLockPtr;
-
-
- PROCEDURE Open*(name: ARRAY OF CHAR; (* $CopyArrays- *)
- accessMode: LONGINT): d.FileHandlePtr;
-
- VAR
- el: FHNodePtr;
-
- BEGIN
- NEW(el);
- IF el=NIL THEN RETURN NIL END;
- el.fh := d.Open(name,accessMode);
- IF el.fh=NIL THEN
- (* $IFNOT GarbageCollector *)
- DISPOSE(el);
- (* $END *)
- RETURN NIL
- END;
- l.AddHead(fhlist,el);
- RETURN el.fh;
- END Open;
-
-
- PROCEDURE OpenFromLock*(lock: d.FileLockPtr): d.FileHandlePtr;
- VAR
- el: FHNodePtr;
- np: l.NodePtr;
- BEGIN
- NEW(el);
- IF el=NIL THEN RETURN NIL END;
- el.fh := d.OpenFromLock(lock);
- IF el.fh=NIL THEN
- (* $IFNOT GarbageCollector *)
- DISPOSE(el);
- (* $END *)
- RETURN NIL
- END;
- l.AddHead(fhlist,el);
- np := l.Head(locklist);
- WHILE (np#NIL) & (np(LockNode).lock#lock) DO np := np.next END;
- IF np#NIL THEN
- l.Remove(locklist,np);
- (* $IFNOT GarbageCollector *)
- DISPOSE(np);
- (* $END *)
- END;
- RETURN el.fh;
- END OpenFromLock;
-
-
- PROCEDURE Close*(file: d.FileHandlePtr);
-
- VAR el: l.NodePtr;
-
- BEGIN
- el := l.Head(fhlist);
- REPEAT
- IF el(FHNode).fh=file THEN
- l.Remove(fhlist,el);
- d.OldClose(file);
- (* $IFNOT GarbageCollector *)
- DISPOSE(el);
- (* $END *)
- RETURN;
- END;
- UNTIL ~ l.Next(el);
- HALT(20); (* File gar nicht offen! *)
- END Close;
-
-
- PROCEDURE Lock*(name: ARRAY OF CHAR; (* $CopyArrays- *)
- accessMode: LONGINT): d.FileLockPtr;
-
- VAR el: LockNodePtr;
-
- BEGIN
- NEW(el);
- IF el=NIL THEN RETURN NIL END;
- el.lock := d.Lock(name,accessMode);
- IF el.lock=NIL THEN
- (* $IFNOT GarbageCollector *)
- DISPOSE(el);
- (* $END *)
- RETURN NIL
- END;
- l.AddHead(locklist,el);
- RETURN el.lock;
- END Lock;
-
-
- PROCEDURE AddLock(lock: d.FileLockPtr): d.FileLockPtr;
- VAR el: LockNodePtr;
- BEGIN
- IF lock#NIL THEN
- NEW(el);
- IF el#NIL THEN
- el.lock := lock;
- l.AddHead(locklist,el);
- RETURN lock;
- END;
- d.UnLock(lock);
- END;
- RETURN NIL;
- END AddLock;
-
-
- PROCEDURE ParentDir*(lock: d.FileLockPtr): d.FileLockPtr;
- BEGIN
- RETURN AddLock(d.ParentDir(lock));
- END ParentDir;
-
-
- PROCEDURE DupLock*(lock: d.FileLockPtr): d.FileLockPtr;
- BEGIN
- RETURN AddLock(d.DupLock(lock));
- END DupLock;
-
-
- PROCEDURE CreateDir*(name: ARRAY OF CHAR): d.FileLockPtr; (* $CopyArrays- *)
- BEGIN
- RETURN AddLock(d.CreateDir(name));
- END CreateDir;
-
-
- PROCEDURE ParentOfFH*(fh: d.FileHandlePtr): d.FileLockPtr;
- BEGIN
- RETURN AddLock(d.ParentOfFH(fh));
- END ParentOfFH;
-
-
- PROCEDURE DupLockFromFH*(fh: d.FileHandlePtr): d.FileLockPtr;
- BEGIN
- RETURN AddLock(d.DupLockFromFH(fh));
- END DupLockFromFH;
-
-
- PROCEDURE UnLock*(lock: d.FileLockPtr);
- VAR el: l.NodePtr;
- BEGIN
- el := l.Head(locklist);
- REPEAT
- IF el(LockNode).lock=lock THEN
- l.Remove(locklist,el);
- d.UnLock(lock);
- (* $IFNOT GarbageCollector *)
- DISPOSE(el);
- (* $END *)
- RETURN;
- END;
- UNTIL ~ l.Next(el);
- HALT(20); (* existiert nicht ! *)
- END UnLock;
-
-
- PROCEDURE * CloseIt(n: l.NodePtr);
- BEGIN
- d.OldClose(n(FHNode).fh)
- END CloseIt;
-
-
- PROCEDURE * UnLockIt(n: l.NodePtr);
- BEGIN
- d.UnLock(n(LockNode).lock);
- END UnLockIt;
-
-
- BEGIN
-
- Me := sys.VAL(d.ProcessPtr,ol.Me);
- oldCurrentDir := Me.currentDir;
-
- l.Init(fhlist);
- l.Init(locklist);
-
- CLOSE
-
- IF d.CurrentDir(oldCurrentDir)=NIL THEN END;
-
- l.DoForward(fhlist,CloseIt);
- l.DoForward(locklist,UnLockIt);
-
- END SecureDos.
-
-
-