!*********************************************************************** !* !* ALERT and SUGGESTION commands !* !* New version by R.D. Eager University of Kent MCMLXXXIII !* !*********************************************************************** ! ! !*********************************************************************** !* !* Site-dependent items !* !*********************************************************************** ! constantstring (20) suggestion rname = "EMAS Suggestions@UKC" ! ! !*********************************************************************** !* !* Constants !* !*********************************************************************** ! constantinteger no = 0, yes = 1 constantinteger hdsize = 32; ! Size of a file header constantinteger sscharfiletype = 3; ! Subsystem file type constantinteger maxsuggestionlength = 4000 constantinteger max mflag = 529; ! Max MAILER error number constantbyteinteger em character = 25; ! End of medium character constantstring (1) snl = " " constantstring (8) profile key = "SS#ALERT" constantstring (18) alertfile = "SUBSYS.ALERTINF" ! Alert file constantstring (11) sugg tempfile = "M#MSG" ! Temporary file for mailing suggestions constantstring (11) reportfile = "M#DREPORT" ! Mail report file constantstring (28)array mailer mess(501:max mflag) = c "Invalid parameters", "Duplicate component:", "Unknown component", "Invalid command", "No valid recipients", "Too many recipients", "Addr table full", "Name table full", "Illegal name", "Mail service closed", "Recipient offline", "Message too long", "", "Missing component:", "No free message descriptors", "Invalid component:", "Total message kb exceeded", "Cannot return report file", "Message stored", "Forbidden component", "Create file fails", "User not accredited", "Invalid password", "Name not accredited", "Name already accredited", "Name belongs to another user", "Uncollected mail for R-name", "Invalid date/time after", "Not allowed in student procs" ! ! !*********************************************************************** !* !* Record formats !* !*********************************************************************** ! recordformat hf(integer dataend,datastart,filesize,filetype, sum,datetime,format,records) recordformat pe(integer dest,srce,p1,p2,p3,p4,p5,p6) recordformat rf(integer conad,filetype,datastart,dataend) ! ! !*********************************************************************** !* !* Subsystem references !* !*********************************************************************** ! systemroutinespec connect(string (31) file,integer mode,hole, prot,record (rf)name r,integername flag) systemroutinespec console(integer ep,integername start,len) systemroutinespec disconnect(string (31) file,integername flag) systemroutinespec destroy(string (31) file,integername flag) systemintegerfunctionspec iocp(integer ep,parm) systemstringfunctionspec itos(integer n) systemroutinespec move(integer length,from,to) systemroutinespec outfile(string (31) file,integer size,hole, prot,integername conad,flag) systemintegerfunctionspec parmap systemroutinespec permit(string (31) file,string (6) user, integer mode,integername flag) externalroutinespec prompt(string (255) s) systemroutinespec psysmes(integer root,mess) externalroutinespec readprofile(string (11) key,name info, integername version,flag) systemroutinespec setfname(string (63) s) systemroutinespec setpar(string (255) s) externalroutinespec set return code(integer i) systemstringfunctionspec spar(integer n) externalintegerfunctionspec uinfi(integer entry) externalroutinespec writeprofile(string (11) key,name info, integername version,flag) dynamicroutinespec zview alias "S#ZVIEW" (string (255) s) ! ! !*********************************************************************** !* !* Director references !* !*********************************************************************** ! externalstringfunctionspec derrs(integer n) externalintegerfunctionspec dmail(record (pe)name p,integer len,adr) ! ! !*********************************************************************** !* !* A L E R T !* !*********************************************************************** ! externalroutine alert(string (255) parms) integer flag,adate,pversion,ad,len record (rf) rr record (hf)name r string (23) out string (63) mes ! setpar(parms) if parmap > 1 then start flag = 263; ! Wrong number of parameters -> err finish ! out <- spar(1) if out # "" and out # "?" and out # "??" then out = ",F<".out."/W>,Q" ! connect(alertfile,1,0,0,rr,flag) -> err if flag # 0 r == record(rr_conad) ! if out = "?" or out = "??" then start ! Query for new ALERT information readprofile(profile key,adate,pversion,flag) if (r_datetime & x'7fffffff') > (adate & x'7fffffff') then start mes = "There is new alert information.".snl if out = "?" or uinfi(2) = 2 then start printstring(mes) else ad = addr(mes) + 1 len = length(mes) console(10,ad,len); ! Guarantee output to terminal finish finish else ; ! Request to VIEW alert file zview(alertfile.out) pversion = 1 adate = r_datetime writeprofile(profile key,adate,pversion,flag) flag = 0 if flag = 1; ! OK if just created SS#PROFILE if flag # 0 then start printstring("Failed to write to file SS#PROFILE, flag = ".itos(flag).snl) finish finish flag = 0 ! err: ! set return code(flag) if flag # 0 then psysmes(70,flag) end ; ! of alert ! ! !*********************************************************************** !* !* S U G G E S T I O N !* !*********************************************************************** ! externalroutine suggestion(string (255) parms) integer flag,ad,len,hlen,conad,i,ch,nlsw string (31) file string (63) header,s record (pe) p record (rf) rr record (hf)name r ! setpar(parms) if parmap > 1 then start flag = 263; ! Wrong number of parameters -> err finish ! header = "To: ".suggestion rname.snl.c "Subject: Suggestion".snl.snl hlen = length(header) outfile(sugg tempfile,maxsuggestionlength+hlen+hdsize,0,0,conad,flag) -> err if flag # 0 r == record(conad) r_filetype = sscharfiletype move(hlen,addr(header)+1,conad+r_dataend) r_dataend = r_dataend + hlen ! file = spar(1) if file # "" then start connect(file,0,0,0,rr,flag); ! Contains text of suggestion -> err if flag # 0 if rr_filetype # sscharfiletype then start setfname(file) flag = 267; ! Invalid filetype -> err finish ad = rr_conad + rr_datastart len = rr_dataend - rr_datastart if len > maxsuggestionlength then start setfname("Message too long") flag = 233; ! General error -> err finish move(len,rr_conad+rr_datastart,conad+r_dataend) r_dataend = r_dataend + len else ; ! Text input from terminal printstring("Please type your suggestion.".snl) printstring("End it with a line containing only an asterisk (*),".snl) printstring("or by Control-D or Control-Y".snl) prompt("Text: ") nlsw = 0 for i = 0,1,maxsuggestionlength - 1 cycle readch(ch) if ch = '*' and nlsw = 1 and nextsymbol = nl then start skipsymbol exit finish if ch = em character then start flag = iocp(12,0); ! Reset end of file from terminal exit finish if ch = nl then nlsw = 1 else nlsw = 0 byteinteger(conad+r_dataend) = ch r_dataend = r_dataend + 1 repeat finish ! s = "MAILSERVER POST ".sugg tempfile.",".itos(r_datastart).",".c itos(r_dataend-r_datastart).",".reportfile disconnect(sugg tempfile,flag) permit(sugg tempfile,"MAILER",3,flag) -> err if flag # 0 ! p = 0 flag = dmail(p,length(s),addr(s)+1) flag = p_p1 if flag = 0 if flag # 0 then start if flag < 500 then s = derrs(flag) else start flag = 513 if flag > max mflag s = mailer mess(flag) setfname(s) flag = 233; ! General error flag finish finish else printstring("Suggestion recorded".snl) ! err: ! set return code(flag) if flag # 0 then psysmes(69,flag) destroy(reportfile,flag) destroy(sugg tempfile,flag) end ; ! of suggestion endoffile