A Simple MFS
Below is a simple MFS that illustrates the programming techniques discussed in earlier topics of this chapter. Use this as a starting point for your own MFS programming. Develop this MFS as a stored procedure in your SYSPROG account.
This routine uses the Logical, File.System.Equates, and File.System.OnGoSub inserts.
- SIMPLE_MFS
Subroutine SIMPLE_MFS (CODE, BFS, HANDLE, NAME, FMC, RECORD, STATUS) /* Name : SIMPLE_MFS * Description: Hides Fields 3, 4, and 5 on a read if [[environment|@ADMIN]] = 0 * Ensures that fields 3, 4, and 5 are unchanged on a write if [[environment|@ADMIN]] = 0. * Prevents a file delete, record delete or CLEARFILE unless [[environment|@ADMIN]] > 0 */ $insert Logical $insert FSErrors_100 $Insert Sysprocs, File.System.Equates $Insert Sysprocs, File.System.OnGoSub Return * -------------- Main Subs ----------------- READ.RECORD: RECORD = '' GOSUB NEXT.MFS IF @ADMIN = 0 THEN RECORD<3> = 'PROTECTED' RECORD<4> = 'ALSO PROTECTED' RECORD<5> = 'ALSO PROTECTED' Return END ELSE GOSUB NEXT.MFS END RETURN READO.RECORD: RECORD = '' GOSUB NEXT.MFS IF @ADMIN = 0 THEN RECORD<3> = 'PROTECTED' RECORD<4> = 'ALSO PROTECTED' RECORD<5> = 'ALSO PROTECTED' Return END ELSE GOSUB NEXT.MFS END RETURN WRITE.RECORD: IF @ADMIN = 0 THEN TEMP = RECORD CODE = READ.RECORD GOSUB NEXT.MFS TEMP<3> = RECORD<3> TEMP<4> = RECORD<4> TEMP<5> = RECORD<5> RECORD = TEMP CODE = WRITE.RECORD CALL @NEXTFS(CODE, BFS, HANDLE, NAME, FMC, RECORD, STATUS) END ELSE GOSUB NEXT.MFS END RETURN DELETE.RECORD: If @ADMIN > 0 then GOSUB NEXT.MFS END ELSE Call MSG(@Window,'Sorry, You do not have authority to delete records on this file.') STATUS = FALSE$ END Return CLEARFILE: IF @ADMIN = 0 THEN Call MSG(@Window,'You do not have the necessary clearance to clear this file.') STATUS = FALSE$ END ELSE GOSUB NEXT.MFS END Return DELETE.FILE: IF @ADMIN = 0 THEN Call MSG(@Window,'Wrong bucko, you may not delete this file!') STATUS = FALSE$ END ELSE GOSUB NEXT.MFS END Return * --------------------------------------- * non-chained filing system calls * --------------------------------------- Flush: Unlock.All: Record = "" Install: Status = TRUE$ return * --------------------------------------- * --------------------------------------- * Chained Filing System Calls * --------------------------------------- LOCK.RECORD: UNLOCK.RECORD: *-------------------------------------------------- SELECT: READNEXT: CLEARSELECT: RECORD.COUNT: * --------------------------------------- CREATE.INDEX: DELETE.INDEX: UPDATE.INDEX: SELECT.INDEX: READNEXT.INDEX: * --------------------------------------- Omni.Script: gosub Next.MFS return Reserved: * there is a critical error if this line is reached Status = FALSE$ return * --------------------------------------- OPEN.FILE: CREATE.FILE: RENAME.FILE: MOVE.FILE: REMAKE.FILE: * ---------------------------------------- Open.Media: CREATE.MEDIA: READ.MEDIA: WRITE.MEDIA: Close.Media: gosub Next.MFS return * ---------- End of Subroutine * ================================== * execute filing system chain * ================================== Next.MFS: * Strips this MFS leaving the next fs as first element in array FSList = delete(BFS, 1, 1, 1) NextFS = FSList<1,1,1> if len(NextFS) then call @NextFS(Code, FSList, Handle, Name, Fmc, Record, Status) end return