diff options
Diffstat (limited to 'app/baisy/2.2.1-schulis/src/manager-M.dos')
-rw-r--r-- | app/baisy/2.2.1-schulis/src/manager-M.dos | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/app/baisy/2.2.1-schulis/src/manager-M.dos b/app/baisy/2.2.1-schulis/src/manager-M.dos new file mode 100644 index 0000000..a47bf6c --- /dev/null +++ b/app/baisy/2.2.1-schulis/src/manager-M.dos @@ -0,0 +1,55 @@ +PACKET dosmanagermultiDEFINES providechannel,dosmanager:LET stdarchivechannel +=31,ack=0,secondphaseack=5,falsecode=6,fetchcode=11,savecode=12,existscode=13 +,erasecode=14,listcode=15,allcode=17,clearcode=18,reservecode=19,freecode=20, +checkreadcode=22,formatcode=23,logcode=78,quote="""";BOUND STRUCT (TEXT name, +pass)VAR msg;TASK VAR ordertask;INT VAR doschannel;INT VAR fetchsavemodus; +REAL VAR lastaccesstime:=0.0;TASK VAR diskowner:=niltask;TEXT VAR +savefilename;PROC providechannel(INT CONST channel):doschannel:=channelEND +PROC providechannel;IF hdversionTHEN providechannel(29)ELSE providechannel( +stdarchivechannel)FI ;PROC dosmanager:dosmanager(doschannel)END PROC +dosmanager;PROC dosmanager(INT CONST channel):doschannel:=channel; +taskpassword("-");globalmanager(PROC (DATASPACE VAR ,INT CONST ,INT CONST , +TASK CONST )dosmanager)END PROC dosmanager;PROC dosmanager(DATASPACE VAR ds, +INT CONST ordercode,phase,TASK CONST fromtask):enablestop;ordertask:=fromtask +;msg:=ds;IF NOT (ordertask=diskowner)AND ordercode<>freecodeAND ordercode<> +reservecodeTHEN errorstop("DOS nicht angemeldet")FI ;IF ordertask=diskowner +THEN lastaccesstime:=clock(1)FI ;SELECT ordercodeOF CASE fetchcode:fetchfile +CASE savecode:savefileCASE erasecode:erasefileCASE clearcode:cleardiskCASE +existscode:existsfileCASE listcode:listdiskCASE allcode:deliverdirectoryCASE +reservecode:reserveCASE freecode:freeCASE checkreadcode:checkCASE formatcode: +formatCASE logcode:sendlogOTHERWISE errorstop( +"unbekannter Auftrag für Task: "+name(myself))END SELECT .fetchfile:fetch( +dosname(msg.name,readmodus),ds,fetchsavemodus);managerok(ds).check:checkfile( +dosname(msg.name,readmodus));managermessage(expandedname(msg.name,readmodus)+ +" ohne Fehler gelesen").format:IF phase=1THEN managerquestion( +"Diskette formatieren")ELSE formatdosdisk(int(msg.name));managerok(ds)FI . +savefile:IF phase=1THEN savefirstphaseELSE savesecondphaseFI .savefirstphase: +savefilename:=dosname(msg.name,writemodus);IF dosfileexists(savefilename) +THEN managerquestion(expandedname(msg.name,writemodus)+ +" auf der MS-DOS Disk ueberschreiben")ELSE send(ordertask,secondphaseack,ds) +FI .savesecondphase:IF dosfileexists(savefilename)THEN erasedosfile( +savefilename)FI ;save(savefilename,ds,fetchsavemodus);forget(ds);ds:=nilspace +;managerok(ds).cleardisk:IF phase=1THEN managerquestion("Diskette loeschen") +ELSE cleardosdisk;managerok(ds)FI .erasefile:IF dosfileexists(dosname(msg. +name,readmodus))THEN IF phase=1THEN managerquestion(expandedname(msg.name, +TRUE )+" auf der MS-DOS Disk loeschen")ELSE erasedosfile(dosname(msg.name, +readmodus));managerok(ds)FI ELSE managermessage("die Datei "+expandedname(msg +.name,TRUE )+" gibt es nicht auf der MS-DOS Disk")FI .existsfile:IF +dosfileexists(dosname(msg.name,readmodus))THEN managerok(ds)ELSE send( +ordertask,falsecode,ds)FI .listdisk:doslist(ds);managerok(ds).sendlog:forget( +ds);ds:=old("logbuch");managerok(ds).deliverdirectory:forget(ds);ds:=nilspace +;BOUND THESAURUS VAR allnames:=ds;allnames:=alldosfiles;managerok(ds).reserve +:IF reserveorfreepermittedTHEN continuechannel(doschannel);diskowner:= +fromtask;fetchsavemodus:=savefetchmode(msg.name);opendosdisk(path(msg.name)); +forget("logbuch",quiet);managerok(ds)ELSE errorstop( +"Archivlaufwerk wird von Task """+name(diskowner)+""" benutzt")FI . +reserveorfreepermitted:fromtask=diskownerOR lastaccessmorethanfiveminutesago +OR diskowner=niltaskOR NOT (exists(diskowner)OR station(diskowner)<>station( +myself)).lastaccessmorethanfiveminutesago:abs(lastaccesstime-clock(1))>300.0. +free:IF reserveorfreepermittedTHEN closedosdisk;diskowner:=niltask;break( +quiet);managerok(ds)ELSE managermessage("DOS nicht angemeldet")FI .END PROC +dosmanager;PROC managerok(DATASPACE VAR ds):send(ordertask,ack,ds); +lastaccesstime:=clock(1).END PROC managerok;TEXT PROC expandedname(TEXT +CONST name,BOOL CONST status):text(quote+dosname(name,status)+quote,14)END +PROC expandedname;END PACKET dosmanagermulti; + |