Module Readma(entries=(Readmail),reserve(1,2,3,4))= Begin Require machop.bli; Require macros.bli; Require extern.bli; External Sendmail,typemail,Savemail,Listmail,Getdate; Global routine READMAIL(key1,key2)= BEGIN Own a,b,word, ! Temporaries cmd, ! Current command lookuparg[4], ! Lookup argument block enterarg[4], ! Enter argument block opb1[4], ! First open block opb2[4], ! Second open block saw, ! At least one message in file givmsg, ! Desires message del, ! Delete message copied, ! A message was copied renblk[4], ! Rename block tmpptr; ! Pointer from command line Label Readem; ! Loop label if .key1 EQL 0 then key1 _ sixbit'BOTH'; if (.key2 EQL 0)AND(NOT .summary) then key2 _ sixbit'NEW'; if (.key2 EQL 0)AND(.summary) then key2 _ sixbit'ALL'; b _ FALSE; a _ FALSE; if unique(.key1,sixbit'BOTH',1) then (key1 _ sixbit'BOTH';b _ true); if unique(.key1,sixbit'SYSTEM',1) then (key1 _ sixbit'SYSTEM';b _ true); if unique(.key1,sixbit'USER',1) then (key1 _ sixbit'USER';b _ true); if unique(.key2,sixbit'ALL',1) then (key2 _ sixbit'ALL';a _ true); if unique(.key2,sixbit'NEW',1) then (key2 _ sixbit'NEW';a _ true); if NOT .b then Begin Print('?M?J?G%Unrecognized argument: '); Sixout(.key1,-1); Print(' - Assumed BOTH?M?J'); key1 _ sixbit'BOTH'; End; if NOT .a then Begin Print('?M?J?G%Unrecognized argument: '); Sixout(.key2,-1); If (NOT .summary) then (Print(' - Assumed NEW?M?J'); key2 _ sixbit'NEW';); If (.summary) then (Print(' - Assumed ALL?M?J'); key2 _ sixbit'ALL';); End; Incr a from 0 to 1 do Begin If (.key1 EQL sixbit'USER') then a _ 1; lookuparg[0] _ enterarg[0] _ (if (.a EQL 1) then .acct[accmlf] else sixbit'.ALL.'); lookuparg[1] _ enterarg[1] _ (if (.a EQL 1) then .acct[accmfe] else mlrext); lookuparg[2] _ enterarg[2] _ #777^27; lookuparg[3] _ enterarg[3] _ (if (.a EQL 1) then .acct[accppn] else mlrppn); opb1[0] _ opb2[0] _ 12; opb1[1] _ opb2[1] _ (if (.a EQL 1) then .acct[accmfd] else mlrdev); opb1[2] _ address(ibufhdr); opb2[2] _ Xwd(address(obufhdr),0); opb1[3] _ opb2[3] _ 0; reset; saw _ FALSE; ifskip open(in,address(opb1)) then Begin If NOT Lockchn(in,0) then Begin Releas(IN); Return(0); End; End else Begin If (.login) then return 0; Print('?M?J?G??MAIDNA Device '); Sixout(.opb1[1],-1); Print(' not available for input?M?J'); Return 0; End; If NOT (.login)AND NOT (.summary) then Begin ifskip open(out,address(opb2)) then 0 else Begin Print('?M?J?G??MAIDNA Device '); Sixout(.opb2[1],-1); Print(' not available for output?M?J'); Releas(IN); Return 0; End; End; copied _ FALSE; incr b from 0 to 3 do renblk[.b]_0; ifskip lookup(in,address(lookuparg)) then Begin if (NOT .login)AND (NOT .summary) then ifskip enter(out,address(enterarg)) then 0 else Begin If (.enterarg[1] EQL 3) then Print('?M?J?G??MAIMBB Mailbox is busy...Try again later?M?J') else begin Print('?M?J?G??MAIUCO Unable to create mail output file?M?J'); Error(.Enterarg[1]); end; Close(in); Releas(in); Releas(out); Return; End; Readem: While TRUE do Begin del _ FALSE; b _ 0; word _ 0; until ((.word EQL -1)OR(.word EQL "EOF")) do Begin word _ INFILE("IN"); auxbuf[.b] _ .word; if (.word EQL -1)AND(.b LEQ mlfsub) then word _ 0; b _ .b + 1; if (.b GEQ maxbuf) then Begin Print('?M?J?G??MAIMFC Mail file is corrupt?M?J'); Ifskip rename(in,address(renblk)) then Begin Print('[Deleting mail file]?M?J'); End; Close(in); Releas(in); ac1 _ out; ifskip Resdv(ac1) then 0; End; End; if (.word EQL "EOF") then Begin If (NOT .login)AND (NOT .summary) then If .a EQL 0 then If (.saw) then Print('?M?J[No more SYSTEM mail]?M?J') else Print('?M?J[No new SYSTEM mail]?M?J') else if (.saw) then Print('?M?J[No more mail]?M?J') else Print('?M?J[No new mail]?M?J'); Saw _ FALSE; If (NOT .copied)AND(NOT .login)AND(NOT .summary) then Ifskip rename(in,address(renblk)) then Begin ac1 _ out; ifskip Resdv(ac1) then Print('?M?J[All mail deleted - Mail file deleted]?M?J') else copied _ TRUE; End Else Begin Print('?M?JMAIUDF Unable to delete empty mail file?M?J'); Error(.renblk[1]); End; Close(IN); Releas(IN); If (.copied)AND NOT(.login)AND NOT(.summary) then Begin Close(OUT); Releas(OUT); End; Reset; If (.a EQL 0) then Begin sysdate _ gettab(#53,#11); Getdate(.acct[accnm1],.acct[accnm2],true); End; If (.acct[accnm1] EQL sixbit'ALL') then a _ 1; If (.key1 EQL sixbit'SYSTEM') then a _ 1; Leave readem; End; b _ FALSE; if (.key2 EQL sixbit'ALL') then b _ TRUE; if (.auxbuf[mlfsdt] NEQ 0)AND(.a EQL 0) then if (.auxbuf[mlfsdt] GEQ .sysdate) then b _ TRUE else 0 else if ((bittst(.auxbuf[mlfflg],mfgred))EQL 0) then b _ TRUE; if (.auxbuf[mlfexp] NEQ 0) then if ((gettab(#53,#11))GEQ(.auxbuf[mlfexp])) then Begin del _ TRUE; Print('?M?J[Found expired message - Deleting]?M?J?G'); b _ FALSE; End; if (.b) then Begin Crlf; typemail(auxbuf); Saw _ TRUE; cmd _ 0; While ((.cmd NEQ sixbit'NEXT')AND(NOT .login)AND(NOT .Summary)) do Begin Print('READ> '); cmd _ sixin(0,-6); tmpptr _ .ac3; proccmd(cmd,'NEXT',1); proccmd(cmd,'EXIT',1); proccmd(cmd,'DELETE',1); proccmd(cmd,'REPLY',1); proccmd(cmd,'HELP',1); proccmd(cmd,'LIST',1); proccmd(cmd,'SAVE',1); If (.cmd EQL 0) then cmd _ sixbit'NEXT'; Select .cmd of NSET Sixbit'NEXT':del_FALSE; Sixbit'SAVE':Savemail(.tmpptr,auxbuf); Sixbit'LIST':Listmail(auxbuf); Sixbit'DELETE': Begin del _ FALSE; if (.a EQL 0) then if (prvbit(pvdall)) then del _ TRUE else Print('?G??MAICDS You cannot delete system mail?M?J') else del _ TRUE; if (.del EQL TRUE) then Begin cmd _ sixbit'NEXT'; print('?M?J[Deleting message]?M?J'); End; End; Sixbit'REPLY': If Auser(.auxbuf[accnm1],.auxbuf[accnm2]) then Print('?G??MAICRS Cannot reply to self?M?J') else Sendmail(.auxbuf[accnm1],.auxbuf[accnm2],FALSE); Sixbit'HELP': Begin Print('?M?JREAD commands are:?M?J'); Tab; Print('Delete - Delete this message?M?J'); Tab; Print('Exit - Leave read mode?M?J'); Tab; Print('Help - Print this text?M?J'); Tab; Print('List - Print message to LPT:?M?J'); Tab; Print('Next - Go to next message (Same as )?M?J'); Tab; Print('Reply - Reply to sender?M?J'); Tab; Print('Save - Save message?M?J'); Crlf; End; Sixbit'EXIT': Begin If (.a EQL 1) then Bitset(Auxbuf[mlfflg],mfgred) _ 1; b _ word _ 0; If (.login)OR(.summary) then word _ -1; Until (.word EQL -1) do Begin word _ .auxbuf[.b]; outfile(.word); if (.b LEQ mlfsub)AND(.word EQL -1) then word _ 0; b _ .b + 1; End; If (.login)OR(.summary) then word _ "EOF"; Until (.word EQL "EOF") do Begin word _ infile("IN"); If (.word NEQ "EOF") then outfile(.word); End; Close(in); If NOT(.login)AND NOT(.summary) then Close(out); Releas(in); If NOT(.login)AND NOT(.summary) then Releas(out); Return 0; End; Otherwise:Print('?G??MAIURC Unrecognised READ command - Type HELP?M?J'); TESN; End; End; If (.a EQL 1) then Bitset(Auxbuf[mlfflg],mfgred) _ 1; b _ word _ 0; if (.del)OR(.login)OR(.summary) then word _ -1; copied _ (.copied)OR(NOT .del); Until (.word EQL -1) do Begin word _ .auxbuf[.b]; outfile(.word); if (.b LEQ mlfsub)AND(.word EQL -1) then word _ 0; b _ .b + 1; End; End; End else Begin if (.login)OR(.summary) then 0 else If (.a EQL 0) then print('?M?J[No SYSTEM mail]?M?J') else print('?M?J[No mail]?M?J'); Releas(in); End; End; END; ! End of READMAIL End Eludom