|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 291840 (0x47400) Types: TextFile Names: »tclist «
└─⟦9ccaf6601⟧ Bits:30008165 Bånd med SW8000 kildetekst/release værktøjer └─⟦39138f30b⟧ └─⟦this⟧ »tclist «
*algol kerneltxt list.yes kerneltxt d.861121.1338 1 <*******************************************************************> 1 <* Central logik til tascat. *> 1 <* *> 1 <* Reduceret udgave af centralogic i ALGOL Coroutine System *> 1 <* *> 1 <* Udskrifter af test m.m. til current output er fjernet ! *> 1 <* *> 1 <* Henning Godske 861030 *> 1 <*******************************************************************> 1 1 <**************************************************************> 1 <* Revision history *> 1 <* *> 1 <* 86.12.01 kernel release 1.0 *> 1 <**************************************************************> 1 1 external long procedure kernel(traped); 2 procedure traped; 3 begin 4 integer max_sem,max_cor,sem_basis,cor_basis; 5 integer array ia(1:13); 6 system(5,co_own_base,ia); 7 maxsem:=ia(1); 8 sem_basis:=ia(2); 9 cor_basis:=ia(4); 10 max_cor:=(ia(3)-cor_basis) shift (-4); 11 11 begin 12 integer <* constant semafor *> 13 sem_mess_pool, 14 sem_mess, 15 sem_answ_pool, 16 sem_free, 17 sem_io, 18 sem_virt, 19 sem_ready; 20 20 integer <* reference *> array mess(1:1); 21 zone zt,zmess(1,1,stderror); 22 integer array timemess(1:12); 23 boolean array virt_arr(1:max_cor); 24 integer timebufadr, timersetup; 25 25 integer cor,sem,cause,state, term_cor, virt_error; 26 long antal, res, newnexttimeout, nexttimeout; 27 boolean take_message; 28 28 procedure init; 29 begin 30 integer ny_sem; 31 cause :=4; 32 virterror := 33 timebufadr := 34 timersetup := 35 sem_mess_pool :=0; 36 sem_mess :=-1; 37 sem_answ_pool :=-2; 38 sem_virt :=-5; 39 sem_free :=-6; 40 sem_io :=-8; 41 sem_ready :=-9; 42 42 for cor:=1 step 1 until max_cor do 43 begin 44 virt_arr(cor):=false; 45 system(12,cor,ia); 46 nysem:=sem:=where(cor); 47 case ia(8)+1 of 48 begin 49 ny_sem := sem_free; <* empty *> 50 if sem <= sem_virt then ny_sem := sem_ready; <* pass. *> 51 ny_sem := sem_io; <* i/o *> 52 trap(199) <*passivated by activate *> 53 end; 54 if sem<>ny_sem then 55 cor_to_sem(ny_sem,cor); 56 end; 57 57 open(zt,2,<:clock:>,0); 58 getshare6(zt,timemess,1); 59 timemess(4):=2; 60 nexttimeout:=extend 1 shift 46; 61 61 initref(mess); 62 antal:=0; 63 dump; 64 end; 65 65 procedure dump; 66 begin 67 if cause < 1 and cor>0 then 68 cor_to_sem(sem_free,cor); 69 regret_timemess; 70 end; 71 71 integer procedure where(cor); 72 value cor; 73 integer cor; 74 begin 75 integer array ia(1:4); 76 for cor:=cor shift 4 + cor_basis, ia(4) while ia(1)<2048 do 77 begin 78 where:=(cor-sem_basis)//8; 79 system(5,cor-6,ia); 80 end; 81 end; 82 82 procedure virt; 83 begin 84 integer i; 85 if cause=-2 then 86 begin 87 virt_arr(term_cor):=true; 88 virt_arr( cor):=false add term_cor; 89 cor_to_sem(sem_virt,cor); 90 virt_error:=virt_error+1; 91 cause:=3; 92 end else 93 begin 94 virt_arr(term_cor):=false; 95 for i:=1 step 1 until max_cor do 96 if virt_arr(i) extract 12 = term_cor then 97 begin 98 cor_to_sem(sem_ready,i); 99 virt_arr(i):=false; 100 end; 101 end; 102 end; 103 103 procedure delay; 104 begin 105 newnexttimeout:=extend co_time shift 10 + co_time_base; 106 if newnexttimeout<nexttimeout then 107 begin 108 regret_timemess; 109 timemess(5):=co_time shift (-14); 110 timemess(6):=co_time shift 10; 111 setshare6(zt,timemess,1); 112 timebufadr:=monitor(16,zt,1,timemess); 113 timersetup:=timersetup+1; 114 nexttimeout:=newnexttimeout; 115 end; 116 end; 117 117 procedure regret_timemess; 118 begin 119 if timebufadr<>0 then timebufadr:=monitor(82,zt,1,timemess); 120 nexttimeout:=extend 1 shift 46; 121 end; 122 122 procedure event(proc); 123 value proc; 124 integer proc; 125 begin 126 integer result,nr,co_last_buf,co_next_buf; 127 state:=1; 128 co_last_buf:=co_next_buf:=co_8000_event:=0; 129 repeat 130 result:= monitor(if state=1 then proc else 66,zmess,co_next_buf,ia); 131 case result+2 of 132 begin 133 <* no event *> 134 begin 135 end; 136 136 <* message *> 137 if wait(sem_mess_pool,mess) > 0 then 138 begin 139 system(5,co_next_buf+2,mess); 140 mess(1):=mess(3); 141 mess(2):=abs mess(2); 142 mess(3):=co_next_buf; 143 if signal(sem_mess,mess) then 144 begin 145 state:=3; 146 monitor(26,zt,co_next_buf,mess); <* zt and mess dummy parameter *> 147 co_next_buf:=co_last_buf; 148 end else 149 begin 150 co_8000_event:=1; 151 wait(sem_mess,mess); 152 signal(sem_mess_pool,mess); 153 end; 154 end; 155 155 <* answer *> 156 if co_next_buf = time_buf_adr then 157 begin 158 regret_timemess; 159 co_next_buf:=co_last_buf; 160 if state=1 then state:=2; 161 end else 162 begin 163 co_last_buf:=co_next_buf; 164 wait_select:=co_next_buf; 165 if wait(sem_answ_pool,mess) > 0 then 166 begin 167 if signal(mess(3),mess) then state:=3 168 end else 169 if ia(1)<>0 then 170 begin 171 nr:=abs ia(1); 172 system(12,nr,ia); 173 if co_next_buf=ia(1) then 174 begin 175 state:=3; 176 cor_to_sem(sem_ready,nr); 177 end else co_8000_event:=1 178 end else co_8000_event:=1 179 end; 180 end; 181 until result=-1; 182 end; 183 183 init; 184 trap(error); 185 for antal:= antal+1 while cause > 0 do 186 begin 187 wait_select:=0; 188 wait_time := state:=0; 189 189 if co_8000_event <> 0 then event(66); 190 190 res:=schedule(cor); 191 while cor=0 do 192 begin 193 if state=0 then event(66); 194 if state<>3 then co_time:=0; 195 res:=schedule(cor); 196 if cor=0 then 197 begin 198 delay; 199 event(24); 200 end; 201 end; 202 202 cause:=res extract 24; 203 term_cor:=res shift (-24) extract 24; 204 204 if cause=2 then cor_to_sem(sem_io,term_cor) else 205 if cause=-2 or virt_arr(term_cor) then virt; 206 end; 207 dump; 208 kernel:=res; 209 if false then 210 error: 211 disable 212 begin 213 cause:=-4; 214 dump; 215 kernel:=res; 216 traped(200); 217 end; 218 end; 219 end; 220 end;\f algol end 8 *algol tctxt connect.no fp.yes spill.no list.yes tctxt d.870506.1139 1 <****************************************************************************> 1 <* SW8110 Terminal Access System *> 1 <* Catalog and Operator Program 'tascat' *> 1 <* *> 1 <* Henning Godske 870506 *> 1 <* A/S Regnecentralen *> 1 <* *> 1 <* Compiler call :tc=algol connect.no fp.yes spill.no *> 1 <****************************************************************************> 1 1 begin 2 <****************************************************************************> 3 <* Vedligeholdelse af katalogerne, operatør kommunikation *> 4 <* og initialisering af systemet. *> 5 <* *> 6 <* Program skitse: *> 7 <* a) Læsning af intialiserings parametre fra init fil. *> 8 <* b) Åbning af test output filen. *> 9 <* c) Evt. oprettelse af nye katalogfiler ud fra catalog tekst fil *> 10 <* d) Synkronisering med Tas processen herunder overførsel af init *> 11 <* data til Tas. *> 12 <* e) Opstart af korutiner: 1) Katalog vedligeholdelse og modtagelse af *> 13 <* message fra Tas og bruger processer. *> 14 <* 2) Timecheck rutinen til evt. automatisk *> 15 <* udlogning af brugerer. *> 16 <* 3) Kontrol af afsendelse af tekster til *> 17 <* terminaler via tasterm. *> 18 <* 4) Operatør korutinerne. En for hver operatør *> 19 <* der skal kunne 'køre' samtidig, dog altid *> 20 <* en til brug for hovedkonsollen. *> 21 <* f) Start af kerne. *> 22 <* Besvarelse af message fra tasterm-processen. *> 23 <* Besvarelse af message fra bruger-processer. *> 24 <* Opstart af operatør rutiner. *> 25 <****************************************************************************> 26 26 <****************************************************************************> 27 <* Revision history: *> 28 <* *> 29 <* 87.05.06 tascat release 1.0 *> 30 <****************************************************************************> 31 31 31 <*******************************> 32 <* Globale variable for tascat *> 33 <*******************************> 34 34 34 integer reld; <* Release datoer *> 35 integer relt; 36 integer initver; 37 integer tastermverd; 38 integer tastermvert; 39 39 integer array init_file_name(1:4); <* Navnet på init filen *> 40 40 integer number_of_opera; <* Antal operatør korutiner Max. 5 *> 41 integer array opera_terms(4:8,1:2); <* Beskrivelse af opr. rutiner *> 42 integer language; <* Sprog benyttet ved bruger udskrift*> 43 43 integer cps; <* Initialiserings parametre *> 44 integer cls; 45 integer max_sessions; 46 integer max_sysmenu; 47 integer max_terminals; 48 integer corebufs; 49 integer mclprogs; 50 integer termtypes; 51 integer max_users; 52 52 boolean system_stop; <* Systemet er ved at stoppe *> 53 integer login_stat; <* Aktuel login status for terminaler*> 54 integer fp_maxterms; <* Maxterms angivet ved kald *> 55 integer max_terms; <* Max. terminaler inlogget *> 56 integer terms; <* Aktuel antal terminaler inlogget *> 57 integer users; <* Aktuel antal brugerer inlogget *> 58 integer sessions; <* Aktuel antal sessioner *> 59 59 integer max_text_count; <* Max antal udestående 'send text' *> 60 integer max_user_block; <* Max. antal user block før alarm *> 61 integer max_term_block; <* Max. antal term block før alarm *> 62 62 integer array text_buf_reserved(1:3); <* Text buffer reserveret *> 63 boolean timecheck_stat; <* Status for timecheck *> 64 integer array log_txt(0:27); <* Logout tekst for timecheck *> 65 integer array stop_txt(0:27); 66 integer log_time; <* Logout vente tid *> 67 67 integer array host_id(0:27); <* host navn signon tekst *> 68 integer array signon_text(0:68); <* operator signon tekst *> 69 69 zone head_term_zone(14,1,konsol_error);<* Hovedkonsol output zone *> 70 integer array head_term_name(1:4); <* Hovedkonsollens navn *> 71 integer head_term_pda; <* Hovedkonsol pda *> 72 72 integer tasterm_pda; <* Tasterm processens pda *> 73 integer array tasterm_name(1:4); <* Tasterm processens navn *> 74 74 integer own_size; <* Egen proces størrelse *> 75 integer own_pda; <* Egen proces pda *> 76 integer array own_name(1:4); <* Eget proces navn *> 77 integer array prog_name(1:4); <* Programmets navn *> 78 78 integer struc_size; <* Antal blokke i login_struc *> 79 integer user_list; <* Peger til user kæden i login_struc*> 80 integer free_list; <* Peger til free kæden i login_struc*> 81 81 boolean new_catalog; <* True = nyt katalog angivet *> 82 integer array cattxt_name(1:4); <* Navnet på katalog tekst filen *> 83 integer array cat_doc(1:4); <* Katalogernes dokument navn *> 84 zone cat_file(128,1,stderror); <* Zone til læsning af katalog tekst *> 85 85 integer array sys_bases(1:2); <* Base par for system baser *> 86 integer array cmcl_bases(1:2); <* Base par for cmcl filer *> 87 87 zone usercat(128,1,std_error); <* Zone til user kataloget *> 88 zone termcat(128,1,std_error); <* Zone til terminal kataloget *> 89 zone typecat(128,1,std_error); <* Zone til terminaltype kataloget *> 90 integer usercat_size; <* Antal segmenter i user kataloget *> 91 integer termcat_size; <* Antal segmenter i terminal kat. *> 92 integer typecat_size; <* Antal segmenter i terminaltype kat*> 93 integer array field user_entry; <* Aktuelt entry i user kat. segment *> 94 integer array field term_entry; <* Aktuelt entry i term kat. segment *> 95 integer array field type_entry; <* Aktuelt entry i type kat. segment *> 96 integer user_seg; <* Aktuelt seg. i zone fra user kat. *> 97 integer term_seg; <* aktuelt seg. i zone fra term kat. *> 98 integer user_entry_length; <* Længden af et entry i user kat. *> 99 integer term_entry_length; <* Længden af et entry i term kat. *> 100 integer type_entry_length; <* Længden af et entry i type kat. *> 101 integer array usercat_name(1:4); <* Bruger katalogets fil navn *> 102 integer array termcat_name(1:4); <* Terminal katalogets fil navn *> 103 integer array typecat_name(1:4); <* Terminaltype katalogets fil navn *> 104 104 long array opr_keywords(0:20); <* Operatør keywords i tascat *> 105 integer opr_num_keys; <* Antal keywords defineret *> 106 long array cat_keywords(0:60); <* Katalog keywords i tascat *> 107 integer cat_num_keys; <* Antal keywords defineret *> 108 long array init_keywords(0:50); <* Init keywords i tascat *> 109 integer init_num_keys; <* Antal keywords defineret *> 110 integer array char_table(0:255); <* Tegn input tabel *> 111 111 zone copy_buf(128,1,stderror); <* Buffer til general copy *> 112 112 boolean killed; <* True = stoppet ved kill *> 113 boolean test_on; <* Status for test output *> 114 boolean sys_start; <* Korutine system startet *> 115 zone test_out(128,1,test_out_error);<* Zone til output af test records *> 116 integer array testout_name(1:4); <* Navnet på testout filen *> 117 integer trace_type; <* Typen af den trace der foretages *> 118 integer test_select; <* Typen af test fra aktiviteter *> 119 119 integer run_alarm_cause; <* Cause ved alarm (trap) *> 120 integer run_alarm_pos; <* procedure nr ved alarm *> 121 121 integer free_sem; <* Semafor -4 *> 122 integer delay_sem; <* Semafor -3 *> 123 integer wait_answer_pool; <* Semafor -2 *> 124 integer wait_message; <* Semafor -1 *> 125 integer wait_message_pool; <* Semafor 0 *> 126 integer message_buf_pool; <* Semafor 1 *> 127 integer time_sem; <* Semafor 2 *> 128 integer struc_sema; <* Semafor 3 *> 129 integer text_write_sem; <* Semafor 4 *> 130 130 real t_n_l,miss_par,u_n_l,ill_val, <* konstant tekster *> 131 ill_par,long_text,ill_time, <* *> 132 c_p ; 133 133 integer array answer(1:9); <* Answer til modtaget mess *> 134 integer array mess(1:1); <* Reference til message *> 135 135 integer field sender_pda; <* Sender pda i mess *> 136 integer field reciever_pda; <* Modtager pda i mess *> 137 integer field buf_addr; <* Buffer adresse på mess *> 138 integer array field mess_array; <* Message *> 139 139 long array field laf; <* work *> 140 integer array field iaf; <* work *> 141 boolean array field baf; <* work *> 142 integer i; <* work *> 143 143 <*********************************************************> 144 <* Procedure til afhjælpelse af fejl i externe procedure *> 145 <*********************************************************> 146 146 integer procedure put_ch(dest,pos,char,rep); 147 long array dest; 148 integer pos,char,rep; 149 begin 150 trap(local); 151 put_ch:=putchar(dest,pos,char,rep); 152 if false then 153 local: put_ch:=-1; 154 end; 155 155 integer procedure put_txt(dest,pos,text,length); 156 long array dest,text; 157 integer pos,length; 158 begin 159 trap(local); 160 put_txt:=puttext(dest,pos,text,length); 161 if false then 162 local: put_txt:=-1; 163 end; 164 164 <*******************************************> 165 <* Generelle hjælpe procedure til TASCAT *> 166 <*******************************************> 167 167 procedure claim(words); 168 <* 1 *> 169 <*------------------------------------------------------*> 170 <* Reserver et antal ord på stakken *> 171 <* *> 172 <* words (call) : Antal ord der reserveres på stakken *> 173 <*------------------------------------------------------*> 174 integer words; 175 begin 176 integer array x(1:words); 177 end; 178 178 integer procedure send_mess(z,mess); 179 <* 4 *> 180 <*--------------------------------------------------------------------*> 181 <* z (call and return) : Zone åbnet med navnet på den proces der skal *> 182 <* sendes til. Share 1 benyttes til message og *> 183 <* sharestate skal være 0 el. 1. Ved retur er *> 184 <* sharestate lig message buffer adresse. *> 185 <* mess (call) : Integer array(1:8) indeholdede message *> 186 <* Return : Message buffer adresse *> 187 <* Der udføres TRAP hvis message buffer claim *> 188 <* er overskredet *> 189 <*--------------------------------------------------------------------*> 190 zone z; 191 integer array mess; 192 begin 193 integer array share(1:12); 194 integer buf_addr,i; 195 195 trap(alarm); 196 getshare6(z,share,1); 197 for i:=1 step 1 until 8 do 198 share(i+3):=mess(i); 199 setshare6(z,share,1); 200 buf_addr:=monitor(16,z,1,share <* dummy ia *>); 201 if buf_addr=0 then 202 write_message(4,1,false,<:claims exceeded:>); 203 send_mess:=buf_addr; 204 if false then 205 alarm: disable traped(4); 206 end; 207 207 boolean procedure wait_ans(z,mess_addr,time,wait_sem,regret); 208 <* 5 *> 209 <*---------------------------------------------------------------------*> 210 <* z (call and return) : Zone der blev benyttet ved send_mess *> 211 <* Ved retur er sharestate lig 0 *> 212 <* mess_addr (call) : Adressen på message buffer fra send_mess. *> 213 <* time (call) : Tiden der skal ventes inden message fortrydes *> 214 <* sættes tiden 0 ventes uendeligt *> 215 <* wait_sem (call) : Semafor der benyttes til at vente på answer *> 216 <* regret (call) : True = regret message ved time-out *> 217 <* Return : True= answer modtaget; False=Time out *> 218 <* Ved time out fortrydes den sendte message *> 219 <*---------------------------------------------------------------------*> 220 zone z; 221 integer mess_addr,time,wait_sem; 222 boolean regret; 223 begin 224 integer array answer(1:1),ia(1:1); 225 225 trap(alarm); 226 initref(answer); 227 wait_select:=6; 228 wait(message_buf_pool,answer); 229 answer(2):=mess_addr; 230 answer(3):=wait_sem; 231 signal(wait_answer_pool,answer); 232 wait_ans:=true; 233 wait_time:=time; 234 if wait(wait_sem,answer)=0 then 235 begin <* time out *> 236 wait_ans:=false; 237 wait_select:=mess_addr; 238 wait(wait_answer_pool,answer); 239 if regret then 240 monitor(82<* regret message *>,z,1,ia<* dummy *>); 241 end; 242 answer(2):=6; 243 signal(message_buf_pool,answer); 244 if false then 245 alarm: disable traped(5); 246 end; 247 247 procedure write_message(from,result,cont,mess); 248 <* 6 *> 249 <*------------------------------------------------------------*> 250 <* Udskriver meddelelse på hovedkonsol og danner test-record *> 251 <* *> 252 <* from (call) : Angiver hvorfra meddelensen kommer *> 253 <* result (call) : Angiver årsagen eller resultat til mes. *> 254 <* cont (call) : True= returner efter udskrift *> 255 <* False= Afbryd kørslen med trap(from) *> 256 <* mess (call) : Selve meddelelsen *> 257 <*------------------------------------------------------------*> 258 integer from,result; 259 boolean cont; 260 string mess; 261 begin 262 real time; 263 263 trap(alarm); 264 if sys_start and test_on then 265 begin 266 prepare_test; 267 test_out.iaf(1):=1030; <* message *> 268 test_out.iaf(2):=abs from; 269 test_out.iaf(3):=result; 270 end; 271 if (false add (trace_type shift (-1))) or from>=0 then 272 begin 273 open(head_term_zone,8,head_term_name,1 shift 9); 274 write(head_term_zone,<:message Tas : :>); 275 outdate(head_term_zone,round systime(5,0,time)); 276 write(head_term_zone,<: :>); 277 outdate(head_term_zone,round time); 278 write(head_term_zone,<: :>,true,30,mess,<<-dddddd>, 279 <: :>,result, 280 <:.:>,<<zddddd>,abs from,<:<10>:>); 281 close(head_term_zone,false); 282 end; 283 if -,cont then 284 trap(from); 285 if false then 286 alarm: disable traped(6); 287 end; 288 288 procedure traped(procedure_nr); 289 <* 7 *> 290 <*--------------------------------------------------------------------*> 291 <* procedure_nr (call) : Nummeret på den procedure hvori kaldet står *> 292 <* *> 293 <* Der dannes test records til beskrivelse af *> 294 <* årsagen til trap'et. Der efter fortsætte til *> 295 <* de næste ydre trap niveau. På yderste niveau *> 296 <* afbrydes programmet *> 297 <*--------------------------------------------------------------------*> 298 value procedure_nr; 299 integer procedure_nr; 300 begin 301 integer i,cause; 302 integer array ia(1:8); 303 303 trap(alarm); 304 cause:=alarmcause extract 24; 305 if run_alarm_pos=0 and cause<>-13 then 306 begin 307 run_alarm_cause:=cause; 308 run_alarm_pos:=procedure_nr; 309 end; 310 if cause=-9 and (alarmcause shift (-24))=8 then 311 killed:=true; 312 if sys_start and test_on then 313 begin 314 prepare_test; 315 test_out.iaf(2):=procedure_nr; 316 test_out.iaf(3):=alarmcause shift (-24) extract 24; 317 test_out.iaf(4):=cause; 318 if cause=-13 then 319 test_out.iaf(1):=1028 <* Cont *> 320 else 321 if cause=-11 then 322 begin <* Give up *> 323 test_out.iaf(1):=1026; <* give up 1 *> 324 test_out.iaf(5):=getalarm(ia); 325 prepare_test; 326 test_out.iaf(1):=1027; <* give up 2 *> 327 for i:=2 step 1 until 5 do 328 test_out.iaf(i):=ia(i+3); 329 end 330 else 331 test_out.iaf(1):=1025;<* Trap *> 332 end; 333 if false then 334 alarm: procedure_nr:=(alarmcause extract 24)-100; 335 trap(0); 336 trap(procedure_nr); 337 end; 338 338 procedure trace(p1,p2,p3,p4); 339 <* 8 *> 340 <*----------------------------------------------------------------------*> 341 <* p1 til p4 (call) : Integer parametre der skrives i trace test record *> 342 <*----------------------------------------------------------------------*> 343 integer p1,p2,p3,p4; 344 begin 345 345 if sys_start and test_on then 346 begin 347 prepare_test; 348 test_out.iaf(1):=1029; <* trace *> 349 test_out.iaf(2):=p1; 350 test_out.iaf(3):=p2; 351 test_out.iaf(4):=p3; 352 test_out.iaf(5):=p4; 353 end; 354 end; 355 355 procedure close_test_out; 356 <* 9 *> 357 <*---------------------------------------*> 358 <* Luk test_out filen hvis det er muligt *> 359 <*---------------------------------------*> 360 begin 361 if sys_start and test_on then 362 begin 363 write_message(-9,select_test,true,<:Test output stopped:>); 364 <* Udskriv stop record *> 365 prepare_test; 366 close(test_out,true); 367 end; 368 select_test:=0; 369 test_on:=false; 370 end; 371 371 371 procedure open_test(name); 372 <* 10 *> 373 <*----------------------------------------------------------------------*> 374 <* Åben test filen hvis det er muligt og tilladt. *> 375 <* *> 376 <* name (call) : Navnet på det dokument der skal benyttes som test out *> 377 <* *> 378 <*----------------------------------------------------------------------*> 379 integer array name; 380 begin 381 integer array tail(1:10); 382 integer i,stop_result; 383 383 trap(alarm); 384 stop_result:=0; 385 if test_on then 386 begin 387 set_cat_bases(sys_bases); 388 test_on:=false; 389 open(test_out,4,name,1 shift 18 <* end document *>); 390 if monitor(42<* lookup entry *>,test_out,0,tail)<>0 then 391 stop_result:=1 392 else 393 if tail(1)<2 then 394 stop_result:=2 395 else 396 begin 397 tail(6):=systime(7,0,0.0); 398 i:=monitor(44,test_out,0,tail); 399 i:=monitor(52,test_out,0,tail)+i; 400 i:=monitor(08,test_out,0,tail)+i; 401 if i<>0 then 402 stop_result:=3; 403 end; 404 if stop_result=0 then 405 begin 406 <* initialiser test_out segmenterne *> 407 outrec6(test_out,512); 408 for i:=1 step 1 until 128 do 409 test_out(i):=real <::>; 410 for i:=2 step 1 until tail(1) do 411 outrec6(test_out,512); 412 setposition(test_out,0,0); 413 write_message(-10,tail(1),true,<:Test output started:>); 414 test_on:=true; 415 end 416 else 417 begin 418 test_on:=false; 419 write_message(10,stop_result,true,<:Error in test out file:>); 420 end; 421 end; 422 if -,test_on then 423 close_test_out; 424 if false then 425 alarm: disable traped(10); 426 end; 427 427 427 procedure test_out_error(z,s,b); 428 <* 11 *> 429 <*-----------------------------------*> 430 <* blok procedure for test_out zonen *> 431 <*-----------------------------------*> 432 zone z; 433 integer s,b; 434 begin 435 integer array ia(1:20); 436 436 trap(alarm); 437 if false add (s shift (-18)) then 438 begin <* EOF Skift tilbage til segment 1 *> 439 getzone6(test_out,ia); 440 ia(9):=2; 441 setzone6(test_out,ia); 442 getshare6(test_out,ia,1); 443 ia(7):=1; 444 setshare6(test_out,ia,1); 445 monitor(16,test_out,1,ia); 446 check(test_out); 447 b:=512; 448 end 449 else 450 close_test_out; 451 if false then 452 alarm: disable traped(11); 453 end; 454 454 boolean procedure set_cat_bases(bases); 455 <* 12 *> 456 <*--------------------------------------*> 457 <* Sæt cat baserne til angivet base-par *> 458 <* *> 459 <* bases(1) : Nedre base værdi. *> 460 <* bases(2) : Øvre base værdi. *> 461 <* Return : True= baser sat *> 462 <* False= baser IKKE sat *> 463 <*--------------------------------------*> 464 integer array bases; 465 begin 466 zone this_proc(1,1,stderror); 467 467 trap(alarm); 468 open(this_proc,0,<::>,0); 469 set_cat_bases:= 470 monitor(72<* set catalog base *>,this_proc,0,bases)=0; 471 if false then 472 alarm: disable traped(12); 473 end; 474 474 integer procedure get_pda(name); 475 <* 13 *> 476 <*-----------------------------------------------------------------*> 477 <* Hent pda for angivet proces *> 478 <* *> 479 <* name (call) : Navnet på processen som pda skal findes for *> 480 <* Return : pda for proces hvis den findes ellers 0 *> 481 <*-----------------------------------------------------------------*> 482 integer array name; 483 begin 484 integer array ia(1:20); 485 integer i; 486 zone proc(1,1,stderror); 487 487 trap(open_trap); 488 getzone6(proc,ia); 489 for i:=1,2,3,4 do 490 ia(i+1):=name(i); 491 setzone6(proc,ia); 492 get_pda:=monitor(4,proc,0,ia); 493 if false then 494 open_trap: get_pda:=0; 495 end; 496 496 boolean procedure get_proc_name(pda,name); 497 <* 14 *> 498 <*---------------------------------------------------------------------*> 499 <* Hent navnet på processen udpeget af proces beskriver adressen i pda *> 500 <* *> 501 <* pda (call) : Proces beskriver adressen *> 502 <* name (ret) : Navn på proces i integer array name(1:4) *> 503 <* Return : True = navn fundet *> 504 <* False = navn IKKE fundet *> 505 <*---------------------------------------------------------------------*> 506 integer pda; 507 integer array name; 508 begin 509 integer array ia(1:20),bases(1:2); 510 integer lt,i; 511 boolean ok; 512 zone proc(1,1,stderror); 513 513 trap(alarm); 514 lt:=trapmode; 515 trapmode:=-1; 516 ok:=system(5,pda+2,name)=1; 517 trap(open_trap); 518 getzone6(proc,ia); 519 for i:=1,2,3,4 do 520 ia(i+1):=name(i); 521 setzone6(proc,ia); 522 ok:=ok and monitor(4,proc,0,ia)=pda; 523 if false then 524 open_trap: ok:=false; 525 get_proc_name:=ok; 526 if not ok then 527 name.laf(1):=long <:No connect:>; 528 trapmode:=lt; 529 if false then 530 alarm: disable traped(14); 531 end; 532 532 integer procedure cur_time; 533 <* 15 *> 534 <*-------------------------------------------*> 535 <* Find den aktuelle tid *> 536 <* *> 537 <* Return : Aktuelle tid i hel time (0-23) *> 538 <*-------------------------------------------*> 539 begin 540 real time; 541 541 trap(alarm); 542 systime(5,0,time); 543 cur_time:=round(time)//10000; 544 if false then 545 alarm: disable traped(15); 546 end; 547 547 547 integer procedure date(text); 548 <* 16 *> 549 <*-----------------------------------------------------------------------*> 550 <* Dan dags dato som tekst med følgende format: *> 551 <* <dags navn> d.<dag>/<måned> 19<år> <time>.<minut> *> 552 <* *> 553 <* text (ret) : Long array indeholdende dags dato som tekst *> 554 <* Array'ets første 6 longs benyttes (36 tegn) *> 555 <* Return : Antal tegn sat i text *> 556 <*-----------------------------------------------------------------------*> 557 long array text; 558 begin 559 real time,year,hour; 560 integer day,pos; 561 561 trap(alarm); 562 systime(1,0,time); 563 day:=(round((time/86400)-0.5) mod 7)+1; 564 pos:=1; 565 text(5):=text(6):=0; 566 case language of 567 begin 568 put_text(text,pos,case day of (<:Mandag :>,<:Tirsdag:>, 569 <:Onsdag :>,<:Torsdag:>, 570 <:Fredag :>,<:Lørdag :>, 571 <:Søndag :>) ,7); 572 put_text(text,pos,case day of (<:Monday :>,<:Tuesday :>, 573 <:Wedensday:>,<:Thursday :>, 574 <:Friday :>,<:Saturday :>, 575 <:Sunday :>) ,9); 576 end; 577 put_text(text,pos,<: d.:>,3); 578 year:=systime(4,time,hour); 579 put_number(text,pos,<<zd>,round(year) mod 100); 580 put_text(text,pos,<:/:>,1); 581 put_number(text,pos,<<zd >,(round(year) mod 10000)//100); 582 put_text(text,pos,<:19:>,2); 583 put_number(text,pos,<<zd >,round(year)//10000); 584 put_number(text,pos,<<dd>,round(hour)//10000); 585 put_text(text,pos,<:.:>,1); 586 put_number(text,pos,<<zd>,(round(hour) mod 10000)//100); 587 date:=pos-1; 588 if false then 589 alarm: disable traped(16); 590 end; 591 591 591 integer procedure data_to_copy_buf(words,mess_addr,answer); 592 <* 17 *> 593 <*------------------------------------------------------------------------*> 594 <* Kopier data fra anden proces til copy_buf. *> 595 <* *> 596 <* words (call) : Antal ord der kopieres (max. 256) *> 597 <* mess_addr (call) : Adressen på message der udpeger område der skal *> 598 <* kopieres fra (2 og 3 ord i message: first,last) *> 599 <* answer (ret) : Resultatet af kopieringen: *> 600 <* answer(1) : Udefineret. *> 601 <* answer(2) : Antal HW overført *> 602 <* answer(3) : Antal tegn overført *> 603 <* answer(9) : Hvis returværdi lig 3 så 3 ellers 1 *> 604 <* Return : 0 = Data kopieret til copy_buf. *> 605 <* 2 = Anden proces stoppet. *> 606 <* 3 = Fejl i kopieringen m.m *> 607 <*------------------------------------------------------------------------*> 608 integer mess_addr,words; 609 integer array answer; 610 begin 611 trap(alarm); 612 answer(1):=2 shift 1 + 0; 613 answer(2):=2; 614 answer(3):=2*words; 615 answer(4):=0; 616 data_to_copy_buf:=monitor(84,copy_buf,mess_addr,answer); 617 answer(3):=3*(answer(2)//2); 618 if false then 619 begin 620 alarm: answer(9):=3; 621 data_to_copy_buf:=3; 622 end; 623 end; 624 624 integer procedure data_from_copy_buf(words,mess_addr,answer); 625 <* 18 *> 626 <*------------------------------------------------------------------------*> 627 <* Kopier data til anden proces fra copy_buf. *> 628 <* *> 629 <* words (call) : Antal ord der kopieres (max. 256) *> 630 <* mess_addr (call) : Adressen på message der udpeger område der skal *> 631 <* kopieres til (2 og 3 ord i message: first,last) *> 632 <* answer (ret) : Resultatet af kopieringen: *> 633 <* answer(1) : Udefineret. *> 634 <* answer(2) : Antal HW overført *> 635 <* answer(3) : Antal tegn overført *> 636 <* answer(9) : Hvis returværdi lig 3 så 3 ellers 1 *> 637 <* Return : 0 = Data kopieret til anden proces *> 638 <* 2 = Anden proces stoppet. *> 639 <* 3 = Fejl i kopieringen m.m *> 640 <*------------------------------------------------------------------------*> 641 integer mess_addr,words; 642 integer array answer; 643 begin 644 trap(alarm); 645 answer(1):=2 shift 1 + 1; 646 answer(2):=2; 647 answer(3):=2*words; 648 answer(4):=0; 649 data_from_copy_buf:=monitor(84,copy_buf,mess_addr,answer); 650 answer(3):=3*(answer(2)//2); 651 if false then 652 begin 653 alarm: answer(9):=3; 654 data_from_copy_buf:=3; 655 end; 656 end; 657 657 657 procedure init_sem; 658 <* 19 *> 659 <*----------------------------------------------------*> 660 <* initialiser semafor navnene med nummer *> 661 <* Semafor 5 og frem benyttes af operatør korutinerne *> 662 <*----------------------------------------------------*> 663 begin 664 free_sem:=-4; <* Semafor -4 *> 665 delay_sem:=-3; <* Semafor -3 *> 666 wait_answer_pool:=-2; <* Semafor -2 *> 667 wait_message:=-1; <* Semafor -1 *> 668 wait_message_pool:=0; <* Semafor 0 *> 669 message_buf_pool:=1; <* Semafor 1 *> 670 time_sem:=2; <* Semafor 2 *> 671 struc_sema:=3; <* Semafor 3 *> 672 text_write_sem:=4; <* Semafor 4 *> 673 end; 674 674 procedure konsol_error(z,s,b); 675 <* 20 *> 676 <*----------------------------------------------------*> 677 <* Block procedure for hoved_konsollen *> 678 <* Ignorer alle error og give up *> 679 <*----------------------------------------------------*> 680 zone z; 681 integer s,b; 682 begin 683 end; 684 684 procedure init_bases; 685 <* 22 *> 686 <*----------------------------------------------------*> 687 <* Check om mcl baser og sys baser kan benyttes *> 688 <* Sæt catalog baser til sys_bases *> 689 <*----------------------------------------------------*> 690 begin 691 integer array bases(1:6); 692 integer b; 693 693 trap(alarm); 694 own_pda:=system(6,0,own_name.laf); 695 if system(5,own_pda+68,bases)<>1 then 696 trap(2); 697 b:=0; 698 if -,set_cat_bases(cmcl_bases) then 699 b:=1; 700 if -,set_cat_bases(sys_bases) then 701 b:=2; 702 if b<>0 then 703 write_message(22,b,false,<:Illegal base parameter:>); 704 if false then 705 alarm: disable traped(22); 706 end; 707 707 707 procedure keywords_init; 708 <* 23 *> 709 <*-------------------------------------------*> 710 <* initialiser keywords *> 711 <*-------------------------------------------*> 712 begin 713 integer i; 714 714 opr_num_keys:=20; 715 for i:=1 step 1 until opr_num_keys do 716 begin 717 opr_keywords(i):=0; 718 opr_keywords(i):= long (case i of 719 <* 1 *> (<:finis:>,<:displ:>,<:messa:>,<:remov:>,<:set:>, 720 <* 6 *> <:start:>,<:stop:>,<:termi:>,<:user:>,<:on:>, 721 <* 11 *> <:off:>,<:all:>,<:signo:>,<:sessi:>,<:syste:>, 722 <* 16 *> <:login:>,<:timec:>,<:users:>,<:resou:>,<:check:>)); 723 end; 724 cat_num_keys:=50; 725 for i:=1 step 1 until cat_num_keys do 726 begin 727 cat_keywords(i):=0; 728 cat_keywords(i):= long (case i of 729 <* 1 *> (<:end:>,<:size:>,<:user:>,<:passw:>,<:cpass:>, 730 <* 6 *> <:monda:>,<:tuesd:>,<:wedne:>,<:thurs:>,<:frida:>, 731 <* 11 *> <:satur:>,<:sunda:>,<:block:>,<:sessi:>,<:privi:>, 732 <* 16 *> <:mclna:>,<:base:>,<:group:>,<:mclte:>,<:freet:>, 733 <* 21 *> <:termi:>,<:termt:>,<:termg:>,<:bypas:>,<:type:>, 734 <* 26 *> <:scree:>,<:colum:>,<:lines:>,<:sbup:>,<:sbdow:>, 735 <* 31 *> <:sblef:>,<:sbrig:>,<:sbhom:>,<:sbdel:>,<:ceod:>, 736 <* 36 *> <:ceol:>,<:invon:>,<:invof:>,<:hlon:>,<:hloff:>, 737 <* 41 *> <:delet:>,<:inser:>,<:curso:>,<:up:>,<:down:>, 738 <* 46 *> <:left:>,<:right:>,<:home:>,<:xxxxx:>,<:init:>)); 739 end; 740 init_num_keys:=46; 741 for i:=1 step 1 until init_num_keys do 742 begin 743 init_keywords(i):=0; 744 init_keywords(i):= long (case i of 745 <* 1 *> (<:true:>,<:false:>,<:on:>,<:off:>,<:start:>, 746 <* 6 *> <:stop:>,<:catal:>,<:termi:>,<:init:>,<:catdo:>, 747 <* 11 *> <:userc:>,<:termc:>,<:typec:>,<:ctnam:>,<:spool:>, 748 <* 16 *> <:ttnam:>,<:temna:>,<:login:>,<:userb:>,<:termb:>, 749 <* 21 *> <:timec:>,<:logti:>,<:mclba:>,<:sysba:>,<:cpool:>, 750 <* 26 *> <:clink:>,<:maxse:>,<:maxte:>,<:maxsy:>,<:coreb:>, 751 <* 31 *> <:mclpr:>,<:maxty:>,<:tbufs:>,<:spseg:>,<:maxus:>, 752 <* 36 *> <:maxop:>,<:timeo:>,<:hosti:>,<:signo:>,<:timet:>, 753 <* 41 *> <:stopt:>,<:catte:>,<:trap:>,<:termt:>,<:initv:>, 754 <* 46 *> <:reser:>)); 755 end; 756 end; 757 757 integer procedure find_keyword_value(keyword,tabel); 758 <* 24 *> 759 <*----------------------------------------------------------------*> 760 <* Find 'token' værdien for det angivne keyword *> 761 <* *> 762 <* keyword (call) : Long indeholdende op til 5 tegn af keyword *> 763 <* tabel (call) : 1=opr 2=cat 3=init keword-tabel *> 764 <* Return : Værdien for det angivne keyword eller *> 765 <* 0 hvis keyword er ukendt *> 766 <*----------------------------------------------------------------*> 767 long keyword; 768 integer tabel; 769 begin 770 integer i; 771 771 trap(alarm); 772 i:=case tabel of (opr_num_keys,cat_num_keys,init_num_keys)+1; 773 keyword:=(keyword shift (-8)) shift 8; 774 case tabel of 775 begin 776 for i:=i-1 while (not (keyword=opr_keywords(i)) 777 and (i<>0)) do; <* nothing *> 778 for i:=i-1 while (not (keyword=cat_keywords(i)) 779 and (i<>0)) do; <* nothing *> 780 for i:=i-1 while (not (keyword=init_keywords(i)) 781 and (i<>0)) do; <* nothing *> 782 end; 783 find_keyword_value:=i; 784 if false then 785 alarm: disable traped(24); 786 end; 787 787 787 procedure init_opera_terms; 788 <* 25 *> 789 <*----------------------------------------------------*> 790 <* init opera_terms array'et *> 791 <*----------------------------------------------------*> 792 begin 793 integer i; 794 794 trap(alarm); 795 for i:=4 step 1 until number_of_opera+3 do 796 begin 797 opera_terms(i,1):=0; 798 opera_terms(i,2):=i+2 799 end; 800 if false then 801 alarm: disable traped(25); 802 end; 803 803 procedure next_line(z,z_line_nr); 804 <* 26 *> 805 <*-------------------------------------------------------*> 806 <* Læs til starten af næste linie i fil *> 807 <* Linier der starter med ; eller er blanke overspringes *> 808 <* Linie tæller optælles med 1 for hver linie *> 809 <* *> 810 <* z (call) : Fil der læses fra. *> 811 <* z_line_nr (call and ret) : Linie tæller for fil, *> 812 <*-------------------------------------------------------*> 813 zone z; 814 integer z_line_nr; 815 begin 816 integer i; 817 817 trap(alarm); 818 repeatchar(z); 819 readchar(z,i); 820 while (i<>'nl') and (i<>'em') do 821 readchar(z,i); 822 z_line_nr:=z_line_nr+1; 823 readchar(z,i); 824 if i<>'em' then 825 begin 826 while i=' ' do 827 readchar(z,i); 828 if i='nl' or i='em' or i=';' then 829 begin 830 next_line(z,z_line_nr); 831 readchar(z,i); 832 end; 833 end; 834 repeatchar(z); 835 if false then 836 alarm: disable traped(26); 837 end; 838 838 integer procedure read_start_key(z,t,z_line_nr); 839 <* 27 *> 840 <*-------------------------------------------------------------------*> 841 <* Find værdien af nøgleordet i starten af tekst linien i fil *> 842 <* *> 843 <* z (call) : Filen der læses fra *> 844 <* t (call) : Keyword tabel. 1=opr 2=cat 3=init *> 845 <* Return : -1 = Sidste linie i fil er læst *> 846 <* 0 = Nøgleord er ikke fundet *> 847 <* >0 = Nøgleordets værdi *> 848 <*-------------------------------------------------------------------*> 849 zone z; 850 integer t,z_line_nr; 851 begin 852 long array key(1:5); 853 integer i; 854 854 trap(alarm); 855 readchar(z,i); 856 if i<>'em' then 857 begin 858 while i=' ' do 859 readchar(z,i); 860 if i='nl' or i='em' or i=';' then 861 begin 862 next_line(z,z_line_nr); 863 readchar(z,i); 864 end; 865 end; 866 repeatchar(z); 867 read_start_key:=if readstring(z,key,1)>0 then 868 find_keyword_value(key(1),t) 869 else 870 -1; 871 repeatchar(z); 872 if false then 873 alarm: disable traped(27); 874 end; 875 875 integer procedure read_text(z,text,max); 876 <* 28 *> 877 <*---------------------------------------------------------------------*> 878 <* Læs tekst fra z filen til text til slutning af linie eller til *> 879 <* maximalt antal tegn læst. Indledende blanktegn overspringes. *> 880 <* *> 881 <* z (call) : File der læses fra *> 882 <* text (ret) : Den læste tekst *> 883 <* max (call) : Det maximale antal tegn der læses *> 884 <* Return : Antal tegn læst til text *> 885 <* *> 886 <* NB. Der læses altid et tegn mere fra z *> 887 <*---------------------------------------------------------------------*> 888 zone z; 889 integer max; 890 long array text; 891 begin 892 integer ch,pos; 893 boolean first; 894 894 trap(alarm); 895 pos:=1; 896 first:=true; 897 repeatchar(z); 898 readchar(z,ch); 899 if (ch<>'nl') and (ch<>'em') then 900 begin 901 readchar(z,ch); 902 while ch<>'nl' and ch<>'em' and pos<=max do 903 begin 904 if first and (ch<>' ') then 905 first:=false; 906 if not first then 907 put_ch(text,pos,ch,1); 908 readchar(z,ch); 909 end; 910 end; 911 read_text:=pos-1; 912 if pos<=max then 913 put_ch(text,pos,0,1); 914 repeatchar(z); 915 if false then 916 alarm: disable traped(28); 917 end; 918 918 boolean procedure read_nr(z,nr); 919 <* 29 *> 920 <*-----------------------------------------------------------------*> 921 <* Læs et heltal fra fil z. Er der ikke flere tal på linien *> 922 <* returneres -1 ellers det læste tal. Er der angivet ulovligt *> 923 <* tal (eller andet end tal) sættes read_nr til false *> 924 <* *> 925 <* z (call) : Zonen der læses fra *> 926 <* nr (ret) : Læst tal eller -1 hvis ikke flere tal *> 927 <* Return : True = ok False = illegalt tal *> 928 <*-----------------------------------------------------------------*> 929 zone z; 930 integer nr; 931 begin 932 integer ch,class; 933 933 trap(alarm); 934 read_nr:=true; 935 repeat 936 class:=readchar(z,ch); 937 until class<>7 or ch=';' ; 938 if ch=';' or class=8 then 939 nr:=-1 940 else 941 if class<2 or class>3 then 942 begin 943 nr:=-1; 944 read_nr:=false; 945 end 946 else 947 begin 948 repeatchar(z); 949 read(z,nr); 950 end; 951 repeatchar(z); 952 if false then 953 alarm: disable traped(29); 954 end; 955 955 boolean procedure read_name(z,name,ok); 956 <* 30 *> 957 <*---------------------------------------------------------------------*> 958 <* Læs et navn fra filen z til name. Resterende tegn nulstilles *> 959 <* Indledende blanktegn overspringes. Der stoppes ved kommentar *> 960 <* *> 961 <* z (call) : File der læses fra *> 962 <* name (ret) : Det læste navn i integer array name(0:3) *> 963 <* ok (ret) : True hvis første tegn er et bogstav *> 964 <* NB. Der læses altid et tegn mere fra z *> 965 <*---------------------------------------------------------------------*> 966 zone z; 967 integer array name; 968 boolean ok; 969 begin 970 integer ch,pos; 971 long array field laf; 972 972 trap(alarm); 973 for pos:=0,1,2,3 do 974 name(pos):=0; 975 pos:=1; 976 laf:=-2; 977 repeatchar(z); 978 readchar(z,ch); 979 while ch=' ' do 980 readchar(z,ch); 981 ok:=(ch>='a' and ch<='å'); 982 while ((ch>='0' and ch<='9') or (ch>='a' and ch<='å')) and pos<=11 do 983 begin 984 put_ch(name.laf,pos,ch,1); 985 readchar(z,ch); 986 end; 987 repeatchar(z); 988 read_name:=not name(0)=0; 989 if false then 990 alarm: disable traped(30); 991 end; 992 992 992 procedure open_catalogs(usercat_name,termcat_name,typecat_name); 993 <* 31 *> 994 <*-----------------------------------------------------------------*> 995 <* Åben kataloger og undersøg om disse er ok og kan bruges til i/o *> 996 <* sæt size og length for hvert katalog *> 997 <* Er newcat=true dannes nye kataloger ud fra teksten i cat_file. *> 998 <* cat_doc angiver navnet på dokument hvorpå katalogerne lægges. *> 999 <* *> 1000 <* usercat_name, *> 1001 <* termcat_name, *> 1002 <* typecat_name (call) : Navnene på katalogerne *> 1003 <*-----------------------------------------------------------------*> 1004 integer array usercat_name,termcat_name,typecat_name; 1005 begin 1006 integer array user_tail,term_tail,type_tail(1:10); 1007 integer reason,cat_line_nr; 1008 long array start_key(1:47); 1009 1009 1009 <*--------------------------------------------------------------------------*> 1010 <* ******************* Katalog indholds beskrivelse ********************** *> 1011 <* 1012 1012 Bruger katalog (user catalog) : 1013 1013 Indeholder i hver indgang oplysninger om en bruger, der har ad- 1014 gang til RC8000 via menu-systemet. 1015 1015 Hvert segment pånær det første i user catalog indeholder 4 1016 indgange. 1017 1017 Indgangene sorteres i de enkelte segmenter efter deres hash nøgle 1018 således at nøglens værdi svarer til segmentets nummer. 1019 1019 Segmentnummer = hash nøgle 1020 1020 Første ord i hvert segment indeholder hash nøgle tælleren. Denne 1021 angiver den samlede antal indgange i hele kataloget, der har hash 1022 nøgle svarende til segments nummer. 1023 1023 Format af første segment i bruger kataloget : 1024 1024 +0 : 1 ; User catalog 1025 +2 : Catalog size (segments inc. segment 0) 1026 +4 : Entry length i hw's for a user entry. 1027 +8 : Generate date (short time) 1028 +10 : Not used 1029 +254: - - 1030 1030 Bruger indgang format : 1031 1031 +0 : Hash key (0 = empty entry) 1032 +2 : User id (key) 1033 +10 : Password 1034 +14 : Login time limits: Monday 1035 +15 : Tuesday 1036 +16 : Wednesday 1037 +17 : Thursday 1038 +18 : Friday 1039 +19 : Saturday 1040 +20 : Sunday 1041 +21 : User block count 1042 +22 : Max. user index 1043 +23 : Privilege 1044 +24 : MCL program name 1045 +32 : User MCL bases (lower, upper) 1046 +36 : Terminal group limit (bit map) 1047 +44 : MCL default variable text (mcl-text format) 1048 +100: Free text (30 char) 1049 +120: Time stamp 1050 +122: Not used 1051 +124: - - 1052 1052 Et segment indeholder (bortset fra segment 0): 1053 1053 +0 : Hash nøgle tæller 1054 +2 : Entry 0 1055 +128: Entry 1 1056 +254: Entry 2 1057 +380: Entry 3 1058 +506: not used 1059 +510: - - 1060 1060 Hash nøgel : 1061 Hash nøglen beregnes ved: 1062 1062 Summen af de 4 integer der indgår i user id teksten beregnes til 1063 S. 1064 1064 Hash key = 1+((ABS S) mod (n-1)) hvor n er antallet af segmenter 1065 i kataloget (seg. 0 til seg. n-1). 1066 1066 1066 User id: 1067 Bruger navn. Fra 1 til 11 tegn afsluttet med nul-tegn. Kan kun 1068 indgå i en indgang i brugerkataloget. (Nøgle) 1069 1069 Password: 1070 Kryptograferet løsen (metode se ??). Værdien nul angiver at der 1071 intet løsen er tilknyttet denne indgang. 1072 1072 Login time limits: 1073 Angiver for hver dag i ugen det tidsrum, hvor indlogning for bru- 1074 geren er tilladt. 1075 1075 Angives som første tidspunkt og sidste tidspunkt i hele timer (0- 1076 24). Sidste tidspunkt er det klokkeslet, hvor brugeren bliver 1077 logget ud. 1078 1078 Dagen og første tid er sammenhørende. Er aktuel tid (A) mindre 1079 end første tid (F) prøves med dagen før, der da skal være af type 1080 2. Hvis aktuel tid her er mindre end sidste tid (S) gives adgang. 1081 1081 Ellers skal gælde: 1082 1082 ( F<S and A>=F and A<S ) or 1083 ( F>S and ( 24>A>=F or 0<=A<S )) 1084 1084 og typen skal være 1, 2 eller 3. 1085 1085 Hver dag beskrives i 1 HW ved: 1086 1086 F<7 + S<2 + type 1087 1087 Hvor type er: 0 = Ingen adgang denne dag. 1088 1 = Første tid mindre end sidste tid. 1089 2 = Første tid større end sidste tid. 1090 3 = Adgang hele dagen (0 til 24). 1091 1091 User block count: 1092 1092 Angiver antal gange (i træk), der er førsøgt refereret til denne 1093 indgang med forkert password. 1094 1094 Værdien nulstilles ved korrekt reference, hvis grænsen ikke er 1095 nået. 1096 1096 Max. user index: 1097 1097 Angiver det maximale antal sessioner en bruger må have samtidig 1098 (ved en eller flerer terminaler). Værdien skal ligge mellem 1 og 1099 12 ink. 1100 1100 Privilege: 1101 Brugerens privilegier er beskrevet i dette felt. 1102 1102 Bit: 0 = Menu-system control 1103 1 = Catalog update/list 1104 2 = MCL control 1105 3 = Message control 1106 4 = List control 1107 1107 MCL program name: 1108 Navnet på det oversatte MCL-program, der skal udføres ved start 1109 af en session. 1110 1110 User MCL bases: 1111 Det base-interval, hvorpå der ledes efter et MCL-program, hvis 1112 det ikke er kendt af menu-systemet. 1113 1113 Første værdi er nedre base, anden værdi er øvre base. 1114 1114 Terminal group limit: 1115 Angiver hvilke terminalgrupper, der må benyttes af brugeren. 1116 1116 En bruger kan benytte terminaler i en eller flerer af grupperne 0 1117 til 95. Angivet som bitmap, hvor bit 0 sat angiver at bruger må 1118 benytte terminaler fra terminalgruppe 0, bit 1 fra terminalgruppe 1119 1 o.s.v. 1120 1120 MCL default variable text: 1121 Tekst der overføres til variabel (T) i MCL ved start af session. 1122 Format som ved CMCL-text. 1123 1123 Free text: 1124 Fri tekst til f.eks at beskrive brugeren (Navn m.m). Der kan 1125 angives op til 30 tegn efterfulgt af nul-tegn. 1126 1126 Time stamp: 1127 Tidsangivelse (access tæller ), der sættes når nyt indhold sættes 1128 i entry. Benyttes til at kontrolerer gyldigheden af læst data ved 1129 senere rettelse. 1130 1130 Terminal katalog (terminal catalog) 1131 Indeholder i hver indgang en beskrivelse af en terminal, der er 1132 tilsluttet via menu-systemet. 1133 1133 Hvert segment i terminal catalog pånær segment 0 indeholder 14 1134 indgange. 1135 1135 Indgangene sorteres i de enkelte segmenter efter deres hash 1136 nøglesåledes at nøglens værdi svarer til segmentets nummer. 1137 1137 Segmentnummer = hash nøgle 1138 1138 Første ord i hvert segment indeholder hash nøgle tælleren. Denne 1139 angiver den samlede antal indgange i hele kataloget der har hash 1140 key svarende til segments nummer. 1141 1141 Format af første segment i terminal kataloget 1142 1142 +0 : 2 ; Terminal catalog 1143 +2 : Catalog size (segments inc. segment 0) 1144 +4 : Entry length i hw's for a terminal entry. 1145 +8 : Generate date (short time) 1146 +10 : Not used 1147 +254: - - 1148 1148 Terminal katalog format 1149 1149 +0 : Hash key (0 = empty entry) 1150 +2 : Terminal name 1151 +10 : Terminal type 1152 +11 : Terminal block count 1153 +12 : Bypass (1=on; 0=off) 1154 +13 : Terminal group 1155 +14 : Free text (30 char.) 1156 +34 : Time stamp 1157 1157 Segment indhold: 1158 1158 +0 : Hashnøgle tæller 1159 +2 : Entry 0 1160 +38 : Entry 1 1161 +74 : Entry 2 1162 . 1163 . 1164 +470: Entry 13 1165 +506: not used 1166 +510: - - 1167 1167 Hash nøgle: 1168 Hash nøglen beregnes ved: 1169 1169 Summen af de 4 integer der indgår i user id teksten beregnes til 1170 S. 1171 1171 Hash key = 1+((ABS S) mod (n-1)) hvor n er antallet af segmenter 1172 i kataloget (seg. 0 til seg. n-1). 1173 1173 Terminal name: 1174 Navnet på den externe proces, der er tilknyttet terminalen i 1175 samme format som proces beskriverens navnefelt. 1176 1176 Terminal type: 1177 Tal der refererer til beskrivelsen af terminalens type i ter- 1178 minaltype kataloget. Typen skal ligge mellem 1 og antal af 1179 segmenter i terminaltype kataloget gange 4. 1180 1180 Terminal block count: 1181 Angiver antal gange (i træk), der er forsøgt indlogning fra denne 1182 terminal uden at korrekt 'userid' er opgivet. 1183 1183 Værdien nulstilles ved korrekt indlogning, hvis den ikke har nået 1184 grænsen. 1185 1185 Terminal group: 1186 Angiver hvilken gruppe (en ud af grupperne 0 til 95) terminalen 1187 indgår i. 1188 1188 Free text: 1189 Fri tekst til f.eks at beskrive terminalens fysiske placering. 1190 Der kan angives op til 30 tegn. 1191 1191 Time stamp: 1192 Tidsangivelse der sættes når nyt indhold sættes i entry. Benyttes 1193 til at kontrolerer gyldigheden af læst data ved senere rettelse. 1194 1194 Terminal type katalog 1195 1195 Indeholder i hver indgang beskrivelse af en bestem type terminals 1196 funktioner. 1197 1197 Kataloget indeholder 4 indgange per segment. 1198 1198 En indgang findes ved at benytte typen som index. 1199 1199 segment = ((type-1) div 4)+1. 1200 indgang i segment = 128*((type-1) mod 4) 1201 1201 1201 Format af første segment i terminaltype kataloget 1202 1202 +0 : 3 ; Terminal type catalog 1203 +2 : Catalog size (segments inc. segment 0) 1204 +4 : Entry length i hw's for a type entry. 1205 +8 : Generate date (short time) 1206 +10 : Not used 1207 +254: - - 1208 1208 Terminaltype indgang format 1209 1209 +0 : Terminal type (0= empty entry) 1210 +2 : Screen type 1211 +4 : Number of colums on line 1212 +5 : Number of lines on display 1213 +6 : Send by CURSOR UP key 1214 +7 : Send by CURSOR DOWN key 1215 +8 : Send by CURSOR LEFT key 1216 +9 : Send by CURSOR RIGHT key 1217 +10 : Send by HOME key 1218 +11 : Send by DELETE key 1219 +12 : Clear to end of display seq. 1220 +16 : Clear to end of line seq. 1221 +20 : Invers on seq. 1222 +24 : Invers off seq. 1223 +28 : High light on seq. 1224 +32 : High light off seq. 1225 +36 : Delete line seq. (move succeeding lines up) 1226 +40 : Insert line seq. (move lines down) 1227 +44 : Cursor addressing seq. 1228 +50 : Cursor up char. 1229 +51 : Cursor down char. 1230 +52 : Cursor left char. 1231 +53 : Cursor right char. 1232 +54 : Cursor home char. 1233 +55 : 1234 +56 : Init. terminal (75 char.) 1235 +106: Free text (30 char.) 1236 +126: Time stamp 1237 1237 Format af data. 1238 Send by (sb) værdierne angiver værdien af det tegn, der sendes af 1239 den pågældende tast. 1240 1240 Sekvenserne (seq.) kan bestå af op til 6 tegn. Ikke benyttede 1241 tegn sættes til 0. Er første tegn et 0 er den pågældende funktion 1242 ikke tilgænglig på terminalen. 1243 1243 Initialiserings sekvensen kan sendes til terminalen ved f.eks 1244 opstart. Sekevensen kan f.eks være initialisering af funktions 1245 tasterne. Der kan angives op til 30 tegn. Ikke benyttede tegn 1246 sættes til 0. 1247 1247 Screen type 1248 Angiver hvilke karekteristika den enkelte skærmtype har. 1249 1249 Bit: 0 = Terminal is a hardcopy (paper) terminal. 1250 1 = Scroll when 'nl' on the last line 1251 2 = Scroll when write in then last character on the 1252 screen 1253 3 = 1254 . 1255 . 1256 11 = 1257 1257 Cursor addressing seq.: 1258 Sekvensen består af op til 7 skrivbare tegn samt to positions- 1259 tegn. Positions-tegnene står på de steder i sekvensen, hvor 1260 cursor-positions værdierne skal sendes. 1261 1261 Positions tegnene er opbygget som: 1262 (pos. er positionsværdi ved adresseringen) 1263 1263 bit: værdi: (bit 0 er MSB) 1264 1264 0 1 = Positionstegn markering sammen med bit 1 ellers 1265 kontroltegn med MSB sat. 1266 0 = Andet tegn 1267 1267 1 1 = Positionstegn markering sammen med bit 0 ellers 1268 skrivbart tegn. 1269 0 = Andet tegn. 1270 1270 2 1 = Brug pos. som colonne 1271 0 = Brug pos. som linie 1272 1272 3 1 = Adder 1 til pos. 1273 0 = intet 1274 1274 4 1 = Adder 32 til pos. 1275 0 = intet 1276 1276 5 1 = Exclusive or pos med 140(octal) 1277 0 = intet 1278 1278 6 1 = Udskriv pos. som et tegn (tegnværdi lig pos.) 1279 0 = Udskriv pos. som 2 cifret decimal (2 tegn) 1280 1280 7 intet 1281 1281 Free text 1282 Benyttes f.eks til at angive hvilken type terminal der er 1283 beskrevet i denne indgang i kataloget. Der kan angives op til 30 1284 tegn. 1285 1285 Time stamp: 1286 Tidsangivelse der sættes når nyt indhold sættes i entry. Benyttes 1287 til at kontrolerer gyldigheden af læst data ved senere rettelse. 1288 1288 *> 1289 <*--------------------------------------------------------------------------*> 1290 1290 integer procedure init_catalogs; 1291 <* 32 *> 1292 <*----------------------------------------------------------------------*> 1293 <* Initialiser de 3 kataloger til tomme ud fra størrelserne læst fra *> 1294 <* cat_file *> 1295 <* *> 1296 <* Return : Reason fra initialiseringen. reason=0 er OK *> 1297 <*----------------------------------------------------------------------*> 1298 begin 1299 integer reason,i; 1300 1300 trap(alarm); 1301 reason:=0; 1302 open(cat_file,4,cattxt_name,0); 1303 i:=read_start_key(cat_file,2,cat_line_nr); 1304 while i=0 do 1305 begin 1306 next_line(cat_file,cat_line_nr); 1307 i:=read_start_key(cat_file,2,cat_line_nr); 1308 end; 1309 if i=2 then 1310 begin 1311 read_nr(cat_file,usercat_size); 1312 read_nr(cat_file,termcat_size); 1313 read_nr(cat_file,typecat_size); 1314 if usercat_size<1 or termcat_size<1 or typecat_size<1 then 1315 reason:=16 1316 else 1317 begin 1318 next_line(cat_file,cat_line_nr); 1319 user_entry_length:=126; <************************> 1320 term_entry_length:=36; <* Antal hw i entry !!! *> 1321 type_entry_length:=128; <************************> 1322 usercat_size:=(usercat_size-1)//(512//user_entry_length)+2; 1323 termcat_size:=(termcat_size-1)//(512//term_entry_length)+2; 1324 typecat_size:=(typecat_size-1)//(512//type_entry_length)+2; 1325 user_tail(1):=usercat_size; 1326 user_tail(2):=cat_doc(1); 1327 user_tail(3):=cat_doc(2); 1328 user_tail(4):=cat_doc(3); 1329 user_tail(5):=cat_doc(4); 1330 user_tail(6):=systime(7,0,0.0); 1331 user_tail(7):=0; 1332 user_tail(8):=0; 1333 user_tail(9):=11 shift 12; 1334 user_tail(10):=0; 1335 end; 1336 if reason=0 then 1337 begin 1338 if monitor(40<* create entry *>,usercat,0,user_tail)<>0 then 1339 reason:=21 1340 else 1341 if monitor(50<* permanent *>,usercat,3,user_tail)<>0 then 1342 reason:=22 1343 else 1344 if monitor(52<* create area proc *>,usercat,0,user_tail)<>0 then 1345 reason:=23 1346 else 1347 if monitor(8<* reserve proc *>,usercat,0,user_tail)<>0 then 1348 reason:=24; 1349 end; 1350 if reason=0 then 1351 begin 1352 term_tail(1):=termcat_size; 1353 term_tail(2):=cat_doc(1); 1354 term_tail(3):=cat_doc(2); 1355 term_tail(4):=cat_doc(3); 1356 term_tail(5):=cat_doc(4); 1357 term_tail(6):=systime(7,0,0.0); 1358 term_tail(7):=0; 1359 term_tail(8):=0; 1360 term_tail(9):=11 shift 12; 1361 term_tail(10):=0; 1362 if monitor(40<* create entry *>,termcat,0,term_tail)<>0 then 1363 reason:=31 1364 else 1365 if monitor(50<* permanent *>,termcat,3,term_tail)<>0 then 1366 reason:=32 1367 else 1368 if monitor(52<* create area proc *>,termcat,0,term_tail)<>0 then 1369 reason:=33 1370 else 1371 if monitor(8<* reserve proc *>,termcat,0,term_tail)<>0 then 1372 reason:=34; 1373 end; 1374 if reason=0 then 1375 begin 1376 type_tail(1):=typecat_size; 1377 type_tail(2):=cat_doc(1); 1378 type_tail(3):=cat_doc(2); 1379 type_tail(4):=cat_doc(3); 1380 type_tail(5):=cat_doc(4); 1381 type_tail(6):=systime(7,0,0.0); 1382 type_tail(7):=0; 1383 type_tail(8):=0; 1384 type_tail(9):=11 shift 12; 1385 type_tail(10):=0; 1386 if monitor(40<* create entry *>,typecat,0,type_tail)<>0 then 1387 reason:=41 1388 else 1389 if monitor(50<* permanent *>,typecat,3,type_tail)<>0 then 1390 reason:=42 1391 else 1392 if monitor(52<* create area proc *>,typecat,0,type_tail)<>0 then 1393 reason:=43 1394 else 1395 if monitor(8<* reserve proc *>,typecat,0,type_tail)<>0 then 1396 reason:=44; 1397 end; 1398 if reason=0 then 1399 begin <* initialiser katalog indholdet *> 1400 setposition(usercat,0,1); 1401 outrec6(usercat,512); 1402 for i:=1 step 1 until 128 do 1403 usercat(i):=real <::>; 1404 for i:=3 step 1 until usercat_size do 1405 outrec6(usercat,512); 1406 setposition(usercat,0,0); 1407 outrec6(usercat,512); 1408 usercat.iaf(1):=1; <* Bruger katalog = 1 *> 1409 usercat.iaf(2):=usercat_size; 1410 usercat.iaf(3):=user_entry_length; 1411 usercat.iaf(4):=systime(7,0,0.0); 1412 setposition(usercat,0,0); 1413 user_seg:=-1; 1414 setposition(termcat,0,1); 1415 outrec6(termcat,512); 1416 for i:=1 step 1 until 128 do 1417 termcat(i):=real <::>; 1418 for i:=3 step 1 until termcat_size do 1419 outrec6(termcat,512); 1420 setposition(termcat,0,0); 1421 term_seg:=-1; 1422 outrec6(termcat,512); 1423 termcat.iaf(1):=2; <* Terminal katalog = 2 *> 1424 termcat.iaf(2):=termcat_size; 1425 termcat.iaf(3):=term_entry_length; 1426 termcat.iaf(4):=systime(7,0,0.0); 1427 setposition(termcat,0,0); 1428 setposition(typecat,0,1); 1429 outrec6(typecat,512); 1430 for i:=1 step 1 until 128 do 1431 typecat(i):=real <::>; 1432 for i:=3 step 1 until typecat_size do 1433 outrec6(typecat,512); 1434 setposition(typecat,0,0); 1435 outrec6(typecat,512); 1436 typecat.iaf(1):=3; <* Type katalog = 3 *> 1437 typecat.iaf(2):=typecat_size; 1438 typecat.iaf(3):=type_entry_length; 1439 typecat.iaf(4):=systime(7,0,0.0); 1440 setposition(typecat,0,0); 1441 end; 1442 end 1443 else 1444 reason:=17; 1445 init_catalogs:=reason; 1446 if false then 1447 alarm: disable traped(32); 1448 end; 1449 1449 integer procedure fill_catalogs; 1450 <* 33 *> 1451 <*-----------------------------------------------------*> 1452 <* Hent data fra cat_file og indsæt i relevant katalog *> 1453 <*-----------------------------------------------------*> 1454 begin 1455 integer reason,key,i,first,last,type,term_type,priv; 1456 integer array group,pgn,term_id,user_id(0:4); 1457 long array password(1:8); 1458 boolean ok; 1459 1459 procedure clear_high(i); 1460 <* 32 *> 1461 integer i; 1462 begin 1463 i:=(i shift 12) shift (-12); 1464 end; 1465 1465 procedure clear_low(i); 1466 <* 33 *> 1467 integer i; 1468 begin 1469 i:=(i shift (-12)) shift 12; 1470 end; 1471 1471 trap(alarm); 1472 reason:=0; 1473 key:=read_start_key(cat_file,2,cat_line_nr); 1474 while (key<>1 <* end *>) and (key<>-1) and (reason=0) do 1475 begin 1476 if key=3 then 1477 begin <* user entry *> 1478 if not read_name(cat_file,user_id,ok) then 1479 goto ill_nr; 1480 if not ok then 1481 goto ill_nr; 1482 for i:=3,2,1,0 do 1483 user_id(i+1):=user_id(i); 1484 if not find_user(user_id) then 1485 begin 1486 if find_empty_user_entry(calc_hash(user_id,usercat_size)) then 1487 begin 1488 <* init entry *> 1489 for i:=2 step 1 until 5 do 1490 usercat.user_entry(i):=user_id(i-1); 1491 usercat.user_entry(12):=1 shift 12; <* max user index *> 1492 usercat.user_entry(23):=2 shift 12; <* mcl def. text *> 1493 usercat.user_entry(19):=1 shift 23; <* term. group 0 *> 1494 next_line(cat_file,cat_line_nr); 1495 key:=read_start_key(cat_file,2,cat_line_nr); 1496 while (key>=4) and (key<=20) do 1497 begin 1498 <* indsæt i entry *> 1499 if (key>=6) and (key<=12) then 1500 begin <* læs first og last for login tid *> 1501 if not (read_nr(cat_file,first) and 1502 read_nr(cat_file,last)) then 1503 goto ill_nr; 1504 if first<0 or first>24 or last<0 or last>24 then 1505 goto ill_nr; 1506 type:=if first<1 and last>23 then 1507 3 1508 else 1509 if first=last then 1510 0 1511 else 1512 if first<last then 1513 1 1514 else 1515 2; 1516 end; 1517 begin 1518 case key-3 of 1519 begin 1520 begin <* password *> 1521 for i:=1 step 1 until 8 do 1522 password(i):=0; 1523 usercat.user_entry(6):=0; 1524 usercat.user_entry(7):=0; 1525 if read_text(cat_file,password,48)>0 then 1526 begin <* kod password *> 1527 for last:=1 step 1 until 31 do 1528 begin 1529 key:=password.baf(last) extract 12; 1530 for i:=last+1 step 1 until 32 do 1531 password.baf(i):=false add 1532 ((password.baf(i) extract 12) + key); 1533 end; 1534 for i:=1 step 1 until 16 do 1535 begin 1536 usercat.user_entry(6):=usercat.user_entry(6)+ 1537 password.iaf(i); 1538 usercat.user_entry(7):=usercat.user_entry(7)+ 1539 usercat.user_entry(6); 1540 end; 1541 end; 1542 end; 1543 begin <* kodet password *> 1544 read(cat_file,password(1)); 1545 usercat.user_entry(6):=password(1) shift (-24); 1546 usercat.user_entry(7):=password(1) extract 24; 1547 end; 1548 begin <* monday *> 1549 clear_high(usercat.user_entry(8)); 1550 usercat.user_entry(8):=usercat.user_entry(8)+ 1551 ((first shift 7)+(last shift 2) + type) shift 12; 1552 end; 1553 begin <* tuesday *> 1554 clear_low(usercat.user_entry(8)); 1555 usercat.user_entry(8):=usercat.user_entry(8)+ 1556 ((first shift 7)+(last shift 2) + type); 1557 end; 1558 begin <* wednesday *> 1559 clear_high(usercat.user_entry(9)); 1560 usercat.user_entry(9):=usercat.user_entry(9)+ 1561 ((first shift 7)+(last shift 2) + type) shift 12; 1562 end; 1563 begin <* thursday *> 1564 clear_low(usercat.user_entry(9)); 1565 usercat.user_entry(9):=usercat.user_entry(9)+ 1566 ((first shift 7)+(last shift 2) + type); 1567 end; 1568 begin <* friday *> 1569 clear_high(usercat.user_entry(10)); 1570 usercat.user_entry(10):=usercat.user_entry(10)+ 1571 ((first shift 7)+(last shift 2) + type) shift 12; 1572 end; 1573 begin <* saturday *> 1574 clear_low(usercat.user_entry(10)); 1575 usercat.user_entry(10):=usercat.user_entry(10)+ 1576 ((first shift 7)+(last shift 2) + type); 1577 end; 1578 begin <* sunday *> 1579 clear_high(usercat.user_entry(11)); 1580 usercat.user_entry(11):=usercat.user_entry(11)+ 1581 ((first shift 7)+(last shift 2) + type) shift 12; 1582 end; 1583 begin <* block *> 1584 clear_low(usercat.user_entry(11)); 1585 if not read_nr(cat_file,i) or i<0 then 1586 goto ill_nr; 1587 usercat.user_entry(11):=usercat.user_entry(12)+i; 1588 end; 1589 begin <* index *> 1590 clear_high(usercat.user_entry(12)); 1591 if not read_nr(cat_file,i) then 1592 goto ill_nr; 1593 if i>9 or i<1 then 1594 goto ill_nr; 1595 usercat.user_entry(12):=usercat.user_entry(12)+ 1596 (i shift 12); 1597 end; 1598 begin <* privilegier *> 1599 priv:=0; 1600 clear_low(usercat.user_entry(12)); 1601 if not read_nr(cat_file,i) then 1602 goto ill_nr; 1603 while i>=0 do 1604 begin 1605 if i>11 then 1606 goto ill_nr; 1607 priv:=priv+(1 shift (11-i)); 1608 if not read_nr(cat_file,i) then 1609 goto ill_nr; 1610 end; 1611 usercat.user_entry(12):=usercat.user_entry(12)+priv; 1612 end; 1613 begin <* mcl name *> 1614 if not read_name(cat_file,pgn,ok) then 1615 goto ill_nr; 1616 if not ok then 1617 goto ill_nr; 1618 for i:=0 step 1 until 3 do 1619 usercat.user_entry(i+13):=pgn(i); 1620 end; 1621 begin <* cmcl bases *> 1622 if not (read_nr(cat_file,first) and 1623 read_nr(cat_file,last)) then 1624 goto ill_nr; 1625 if first>last then 1626 goto ill_nr; 1627 usercat.user_entry(17):=first; 1628 usercat.user_entry(18):=last; 1629 end; 1630 begin <* groups *> 1631 for i:=1 step 1 until 4 do 1632 group(i):=0; 1633 if not read_nr(cat_file,i) then 1634 goto ill_nr; 1635 while (i>=0) and (i<=95) do 1636 begin 1637 first:=(i//24)+1; 1638 last:=23-(i mod 24); 1639 if not (false add (group(first) shift (-last))) then 1640 group(first):=group(first)+(1 shift last); 1641 if not read_nr(cat_file,i) then 1642 goto ill_nr; 1643 end; 1644 for i:=1 step 1 until 4 do 1645 usercat.user_entry(18+i):=group(i); 1646 end; 1647 begin <* mcl text *> 1648 laf:=46; 1649 i:=read_text(cat_file,usercat.user_entry.laf,80); 1650 usercat.user_entry(23):= 1651 ((((i+2)//3*2)+2) shift 12) + i; 1652 laf:=0; 1653 end; 1654 begin <* free text *> 1655 laf:=100; 1656 read_text(cat_file,usercat.user_entry.laf,30); 1657 laf:=0; 1658 end; 1659 end; 1660 end; 1661 next_line(cat_file,cat_line_nr); 1662 key:=read_start_key(cat_file,2,cat_line_nr); 1663 end; 1664 write_user_seg; 1665 end 1666 else 1667 reason:=101; <* Ikke flere entries *> 1668 end 1669 else 1670 reason:=102; <* Entry eksisterer *> 1671 end 1672 else 1673 if key=21 then 1674 begin <* terminal entry *> 1675 if not read_name(cat_file,term_id,ok) then 1676 goto ill_nr; 1677 for i:=3 step (-1) until 0 do 1678 term_id(i+1):=term_id(i); 1679 if not find_term(term_id) then 1680 begin 1681 if find_empty_term_entry(calc_hash(term_id,termcat_size)) then 1682 begin 1683 <* init entry *> 1684 for i:=2 step 1 until 5 do 1685 termcat.term_entry(i):=term_id(i-1); 1686 termcat.term_entry(6):=1 shift 12; <* terminal type *> 1687 next_line(cat_file,cat_line_nr); 1688 key:=read_start_key(cat_file,2,cat_line_nr); 1689 while (key=13) or (key=20) or (key>=22 and key<=24) do 1690 begin 1691 <* indsæt i entry *> 1692 if key=22 then 1693 begin <* Terminal type *> 1694 if not read_nr(cat_file,i) or i<0 or i>2047 then 1695 goto ill_nr; 1696 clear_high(termcat.term_entry(6)); 1697 termcat.term_entry(6):=termcat.term_entry(6)+ 1698 i shift 12; 1699 end; 1700 if key=13 then 1701 begin <* Block *> 1702 if not read_nr(cat_file,i) or i<0 then 1703 goto ill_nr; 1704 clear_low(termcat.term_entry(6)); 1705 termcat.term_entry(6):=termcat.term_entry(6)+i; 1706 end; 1707 if key=23 then 1708 begin <* terminal group *> 1709 if not read_nr(cat_file,i) or i<0 or i>95 then 1710 goto ill_nr; 1711 clear_low(termcat.term_entry(7)); 1712 termcat.term_entry(7):=termcat.term_entry(7)+i; 1713 end; 1714 if key=24 then 1715 begin <* bypass *> 1716 clear_high(termcat.term_entry(7)); 1717 termcat.term_entry(7):=termcat.term_entry(7)+(1 shift 12); 1718 end; 1719 if key=20 then 1720 begin <* free text *> 1721 laf:=14; 1722 read_text(cat_file,termcat.term_entry.laf,30); 1723 laf:=0; 1724 end; 1725 next_line(cat_file,cat_line_nr); 1726 key:=read_start_key(cat_file,2,cat_line_nr); 1727 end; 1728 write_term_seg; 1729 end 1730 else 1731 reason:=105; <* Ikke flere entries *> 1732 end 1733 else 1734 reason:=106; <* Entry eksisterer *> 1735 end 1736 else 1737 if key=25 then 1738 begin <* type entry *> 1739 if not read_nr(cat_file,term_type) or term_type<1 then 1740 goto ill_nr; 1741 if find_type_entry(term_type) then 1742 begin 1743 if typecat.type_entry(1) = 0 then 1744 begin 1745 <* init entry *> 1746 typecat.type_entry(1):=term_type; <* terminal type *> 1747 typecat.type_entry(3):=(80 shift 12)+24; 1748 next_line(cat_file,cat_line_nr); 1749 key:=read_start_key(cat_file,2,cat_line_nr); 1750 while (key>=26) or (key=20) do 1751 begin 1752 <* indsæt i entry *> 1753 if key=26 then 1754 begin <* screen type *> 1755 priv:=0; 1756 if not read_nr(cat_file,i) or i>23 then 1757 goto ill_nr; 1758 while i>=0 do 1759 begin 1760 if i>23 then 1761 goto ill_nr; 1762 priv:=priv+(1 shift (23-i)); 1763 if not read_nr(cat_file,i) then 1764 goto ill_nr; 1765 end; 1766 typecat.type_entry(2):=priv; 1767 end; 1768 if (key>=27) and (key<=34) then 1769 begin <* 'send by' værdier *> 1770 boolean array field baf; 1771 baf:=0; 1772 if not read_nr(cat_file,i) or i>255 or i<0 then 1773 goto ill_nr; 1774 typecat.type_entry.baf(key-22):=if i>0 then 1775 false add i 1776 else 1777 false; 1778 end; 1779 if (key>=44) and (key<=49) then 1780 begin <* et tegns værdier *> 1781 boolean array field baf; 1782 baf:=0; 1783 if not read_nr(cat_file,i) or i>255 or i<0 then 1784 goto ill_nr; 1785 typecat.type_entry.baf(key+7):=if i>0 then 1786 false add i 1787 else 1788 false; 1789 end; 1790 if (key>=35) and (key<=42) then 1791 begin <* 6 tegns sekevnser *> 1792 if not read_nr(cat_file,i) or i>255 or i<0 then 1793 goto ill_nr; 1794 first:=1; 1795 laf:=case (key-34) of 1796 (12,16,20,24,28,32,36,40); 1797 typecat.type_entry.laf(1):=0; 1798 while (i<>-1) and (first<=6) do 1799 begin 1800 put_ch(typecat.type_entry.laf,first,i,1); 1801 if first<=6 then 1802 begin 1803 if not read_nr(cat_file,i) or i>255 or i<(-1) then 1804 goto ill_nr; 1805 end; 1806 end; 1807 laf:=0; 1808 end; 1809 if key=43 then 1810 begin <* cursor sekvens *> 1811 if not read_nr(cat_file,i) or i>255 or i<0 then 1812 goto ill_nr; 1813 first:=1; 1814 laf:=44; 1815 while (i<>-1) and (first<=9) do 1816 begin 1817 put_ch(typecat.type_entry.laf,first,i,1); 1818 if first<=9 then 1819 begin 1820 if not read_nr(cat_file,i) or i>255 or i<(-1) then 1821 goto ill_nr; 1822 end; 1823 end; 1824 laf:=0; 1825 end; 1826 if key=50 then 1827 begin <* initialiserings sekvens *> 1828 laf:=56; 1829 if not read_nr(cat_file,i) or i>255 or i<0 then 1830 goto ill_nr; 1831 first:=1; 1832 while (i<>-1) and (first<=75) do 1833 begin 1834 put_ch(typecat.type_entry.laf,first,i,1); 1835 if first<=75 then 1836 begin 1837 if not read_nr(cat_file,i) or i>255 or i<(-1) then 1838 goto ill_nr; 1839 end; 1840 end; 1841 laf:=0; 1842 end; 1843 if key=20 then 1844 begin <* free text *> 1845 laf:=106; 1846 read_text(cat_file,typecat.type_entry.laf,30); 1847 laf:=0; 1848 end; 1849 next_line(cat_file,cat_line_nr); 1850 key:=read_start_key(cat_file,2,cat_line_nr); 1851 end; 1852 write_type_seg; 1853 end 1854 else 1855 reason:=108; <* Entry eksisterer *> 1856 end 1857 else 1858 reason:=109; <* Illegal type *> 1859 end 1860 else 1861 if key<>65 then 1862 reason:=100; <* illegal entry key *> 1863 end; 1864 if false then 1865 ill_nr: reason:=110; 1866 fill_catalogs:=reason; 1867 if false then 1868 alarm: disable traped(33); 1869 end; 1870 1870 1870 <*****************************> 1871 <* Hoveddel af open_catalogs *> 1872 <*****************************> 1873 trap(alarm); 1874 cat_line_nr:=1; 1875 set_cat_bases(sys_bases); 1876 open(usercat,4,usercat_name,1 shift 9 <* passivate *> ); 1877 open(termcat,4,termcat_name,1 shift 9 <* passivate *> ); 1878 open(typecat,4,typecat_name,0 <* NO passivate *> ); 1879 reason:=0; 1880 if monitor(42<* lookup *>,usercat,0,user_tail)<>0 then 1881 reason:=1 1882 else 1883 if new_catalog then 1884 monitor(48 <*remove entry*>,usercat,0,user_tail); 1885 if monitor(42<* lookup *>,termcat,0,term_tail)<>0 then 1886 reason:=2 1887 else 1888 if new_catalog then 1889 monitor(48 <*remove entry*>,termcat,0,term_tail); 1890 if monitor(42<* lookup *>,typecat,0,type_tail)<>0 then 1891 reason:=3 1892 else 1893 if new_catalog then 1894 monitor(48 <*remove entry*>,typecat,0,type_tail); 1895 if (not new_catalog) and (reason=0) then 1896 begin <* alle kataloger findes, test ydeligerer *> 1897 usercat_size:=user_tail(1); 1898 termcat_size:=term_tail(1); 1899 typecat_size:=type_tail(1); 1900 if monitor(92<* create area proc *>,usercat,0,user_tail)<>0 then 1901 reason:=4 1902 else 1903 if monitor(8<* reserve proc *>,usercat,0,user_tail)<>0 then 1904 reason:=5 1905 else 1906 begin 1907 user_seg:=-1; 1908 find_user_seg(0); 1909 user_entry:=0; 1910 if usercat.user_entry(1)<>1 then 1911 reason:=6 1912 else 1913 if usercat.user_entry(2)<>usercat_size then 1914 reason:=7 1915 else 1916 user_entry_length:=usercat.user_entry(3); 1917 end; 1918 if reason=0 then 1919 begin 1920 if monitor(92<* create area proc *>,termcat,0,term_tail)<>0 then 1921 reason:=8 1922 else 1923 if monitor(8<* reserve proc *>,termcat,0,term_tail)<>0 then 1924 reason:=9 1925 else 1926 begin 1927 term_seg:=-1; 1928 find_term_seg(0); 1929 term_entry:=0; 1930 if termcat.term_entry(1)<>2 then 1931 reason:=10 1932 else 1933 if termcat.term_entry(2)<>termcat_size then 1934 reason:=11 1935 else 1936 term_entry_length:=termcat.term_entry(3); 1937 end; 1938 end; 1939 if reason=0 then 1940 begin 1941 if monitor(92<* create area proc *>,typecat,0,type_tail)<>0 then 1942 reason:=12 1943 else 1944 if monitor(8<* reserve proc *>,typecat,0,type_tail)<>0 then 1945 reason:=13 1946 else 1947 begin 1948 setposition(typecat,0,0); 1949 inrec6(typecat,512); 1950 type_entry:=0; 1951 if typecat.type_entry(1)<>3 then 1952 reason:=14 1953 else 1954 if typecat.type_entry(2)<>typecat_size then 1955 reason:=15 1956 else 1957 type_entry_length:=typecat.user_entry(3); 1958 end; 1959 end; 1960 end 1961 else 1962 if new_catalog then 1963 begin <* ingen kataloger findes, opret nye *> 1964 write_message(31,0,true,<:Generating new catalog:>); 1965 reason:=init_catalogs; 1966 if reason=0 then 1967 reason:=fill_catalogs; 1968 close(cat_file,true); 1969 end; 1970 if reason<>0 then 1971 write_message(cat_line_nr,reason,false,<:Catalog error:>); 1972 if false then 1973 alarm: disable traped(31); 1974 end; 1975 1975 integer procedure calc_hash(id,cat_size); 1976 <* 34 *> 1977 <*-----------------------------------------------------------*> 1978 <* Beregn hash key ud fra navnet i id og kataloget størrelse *> 1979 <* *> 1980 <* id (call) : Navnet som hash nøglen beregnes for *> 1981 <* navnet står i integer array id(1:4) *> 1982 <* cat_size (call) : Størrelsen af kataloget hvortil hash *> 1983 <* skal benyttes *> 1984 <* Return : Den beregnede hash nøgle. *> 1985 <*-----------------------------------------------------------*> 1986 integer array id; 1987 integer cat_size; 1988 begin 1989 calc_hash:=1+((abs(id(1)+id(2)+id(3)+id(4))) mod (cat_size-1)); 1990 end; 1991 1991 1991 procedure find_user_seg(seg_nr); 1992 <* 35 *> 1993 <*----------------------------------------------------------*> 1994 <* Find segment i usercat og indlæs dette. Udskriv aktuelt *> 1995 <* segment, hvis wflag er sat. *> 1996 <* *> 1997 <* seg_nr (call) : Nummeret på det segment der ønskes *> 1998 <*----------------------------------------------------------*> 1999 integer seg_nr; 2000 begin 2001 integer array ia(1:20); 2002 2002 trap(alarm); 2003 if seg_nr>(usercat_size-1) or seg_nr<0 then 2004 write_message(35,seg_nr,false,<:Illegal seg_nr in cat.:>) 2005 else 2006 if seg_nr<>user_seg then 2007 begin 2008 setposition(usercat,0,seg_nr); 2009 inrec6(usercat,512); 2010 getzone6(usercat,ia); 2011 ia(9):=seg_nr; 2012 setzone6(usercat,ia); 2013 user_seg:=seg_nr; 2014 end; 2015 if false then 2016 alarm: disable traped(35); 2017 end; 2018 2018 procedure write_user_seg; 2019 <* 36 *> 2020 <*----------------------------------------------------------*> 2021 <* Opdater aktuelt user segment på disken. Segmentet for- *> 2022 <* bliver i zone-bufferen med state: opend and positioned. *> 2023 <*----------------------------------------------------------*> 2024 begin 2025 integer array ia(1:20); 2026 2026 trap(alarm); 2027 setstate(usercat,6); 2028 if (user_seg>usercat_size-1) or (user_seg<0) then 2029 write_message(36,user_seg,false,<:Illegal seg_nr in cat.:>); 2030 setposition(usercat,0,user_seg); 2031 inrec6(usercat,512); 2032 getzone6(usercat,ia); 2033 ia(9):=user_seg; 2034 setzone6(usercat,ia); 2035 if false then 2036 alarm: disable traped(36); 2037 end; 2038 2038 procedure next_user_entry; 2039 <* 37 *> 2040 <*----------------------------------------------------------*> 2041 <* Find næste user_entry i katalog. Er aktuelt entry sidste *> 2042 <* i katalog sættes næste entry til det første i kataloget *> 2043 <*----------------------------------------------------------*> 2044 begin 2045 integer seg_nr; 2046 2046 trap(alarm); 2047 user_entry:=user_entry+user_entry_length; 2048 if (511-user_entry)<user_entry_length then 2049 begin 2050 seg_nr:=if user_seg=usercat_size-1 then 2051 1 <* Segment 0 benyttes til katalog information *> 2052 else 2053 user_seg+1; 2054 find_user_seg(seg_nr); 2055 user_entry:=2; 2056 end; 2057 if false then 2058 alarm: disable traped(37); 2059 end; 2060 2060 boolean procedure find_user(user_id); 2061 <* 38 *> 2062 <*----------------------------------------------------------*> 2063 <* Find user_entry i katalog med key som angivet user_id *> 2064 <* *> 2065 <* user_id (call) : Bruger navn i integer array (1:4) *> 2066 <* Return : True=fundet, False=ikke fundet *> 2067 <*----------------------------------------------------------*> 2068 integer array user_id; 2069 begin 2070 integer field hash_count; 2071 integer i,hash; 2072 boolean found; 2073 2073 trap(alarm); 2074 hash:=calc_hash(user_id,usercat_size); 2075 find_user_seg(hash); 2076 hash_count:=2; 2077 hash_count:=usercat.hash_count; 2078 user_entry:=2; 2079 if hash_count>0 then 2080 begin 2081 repeat 2082 if usercat.user_entry(1)=hash then 2083 begin 2084 found:=true; 2085 hash_count:=hash_count-1; 2086 for i:=2, i+1 while (i<=5 and found) do 2087 if usercat.user_entry(i)<>user_id(i-1) then 2088 found:=false; 2089 end 2090 else 2091 found:=false; 2092 if not found then 2093 next_user_entry; 2094 until found or hash_count=0 or 2095 (user_seg=hash and user_entry=2); 2096 if not found and hash_count>0 then 2097 write_message(38,1,true,<:Cyclic in catalog:>); 2098 end 2099 else 2100 found:=false; 2101 find_user:=found; 2102 if false then 2103 alarm: disable traped(38); 2104 end; 2105 2105 boolean procedure find_empty_user_entry(hash_key); 2106 <* 39 *> 2107 <*----------------------------------------------------------*> 2108 <* Find første tomme user_entry hørende til hash_key *> 2109 <* Optæl hash key tæller i hash segmentet. Sæt user_entry *> 2110 <* til fundet entry. Hash_key indsættes i fundet segment. *> 2111 <* Entry SKAL udskrives på disken efter indsættelse af data *> 2112 <* *> 2113 <* hash_key (call) : Hash nøglen hørende til det segment *> 2114 <* hvorfra der søges efter tomt entry *> 2115 <* Return : True=Entry fundet. Sat i user_entry *> 2116 <* False=Ikke mere plads i katalog *> 2117 <*----------------------------------------------------------*> 2118 integer hash_key; 2119 begin 2120 boolean room; 2121 2121 trap(alarm); 2122 find_user_seg(hash_key); 2123 user_entry:=0; 2124 usercat.user_entry(1):=usercat.user_entry(1)+1; 2125 setstate(usercat,6); 2126 user_entry:=2; 2127 room:=true; 2128 while usercat.user_entry(1)<>0 and room do 2129 begin 2130 next_user_entry; 2131 if (hash_key=user_seg) and (user_entry=2) then 2132 room:=false; 2133 end; 2134 if not room then 2135 begin 2136 find_empty_user_entry:=false; 2137 find_user_seg(hash_key); 2138 user_entry:=0; 2139 usercat.user_entry(1):=usercat.user_entry(1)-1; 2140 write_user_seg; 2141 end 2142 else 2143 begin 2144 find_empty_user_entry:=true; 2145 usercat.user_entry(1):=hash_key; 2146 end; 2147 if false then 2148 alarm: disable traped(39); 2149 end; 2150 2150 2150 procedure find_term_seg(seg_nr); 2151 <* 40 *> 2152 <*----------------------------------------------------------*> 2153 <* Find segment i termcat og indlæs dette. Udskriv aktuelt *> 2154 <* segment, hvis wflag er sat. *> 2155 <* *> 2156 <* seg_nr (call) : Nummeret på det segment der ønskes *> 2157 <*----------------------------------------------------------*> 2158 integer seg_nr; 2159 begin 2160 integer array ia(1:20); 2161 2161 trap(alarm); 2162 if seg_nr>(termcat_size-1) or seg_nr<0 then 2163 write_message(40,seg_nr,false,<:Illegal seg_nr in cat.:>) 2164 else 2165 if seg_nr<>term_seg then 2166 begin 2167 setposition(termcat,0,seg_nr); 2168 inrec6(termcat,512); 2169 getzone6(termcat,ia); 2170 ia(9):=seg_nr; 2171 setzone6(termcat,ia); 2172 term_seg:=seg_nr; 2173 end; 2174 if false then 2175 alarm: disable traped(40); 2176 end; 2177 2177 procedure write_term_seg; 2178 <* 41 *> 2179 <*----------------------------------------------------------*> 2180 <* Opdater aktuelt term segment på disken. Segmentet for- *> 2181 <* bliver i zone-bufferen med state: opend and positioned. *> 2182 <*----------------------------------------------------------*> 2183 begin 2184 integer array ia(1:20); 2185 2185 trap(alarm); 2186 setstate(termcat,6); 2187 if (term_seg>termcat_size-1) or (term_seg<0) then 2188 write_message(41,term_seg,false,<:Illegal seg_nr in cat.:>); 2189 setposition(termcat,0,term_seg); 2190 inrec6(termcat,512); 2191 getzone6(termcat,ia); 2192 ia(9):=term_seg; 2193 setzone6(termcat,ia); 2194 if false then 2195 alarm: disable traped(41); 2196 end; 2197 2197 procedure next_term_entry; 2198 <* 42 *> 2199 <*----------------------------------------------------------*> 2200 <* Find næste term_entry i katalog. Er aktuelt entry sidste *> 2201 <* i katalog sættes næste entry til det første i kataloget *> 2202 <*----------------------------------------------------------*> 2203 begin 2204 integer seg_nr; 2205 2205 trap(alarm); 2206 term_entry:=term_entry+term_entry_length; 2207 if (511-term_entry)<term_entry_length then 2208 begin 2209 seg_nr:=if term_seg=termcat_size-1 then 2210 1 <* Segment 0 benyttes til katalog information *> 2211 else 2212 term_seg+1; 2213 find_term_seg(seg_nr); 2214 term_entry:=2; 2215 end; 2216 if false then 2217 alarm: disable traped(42); 2218 end; 2219 2219 boolean procedure find_term(term_id); 2220 <* 43 *> 2221 <*----------------------------------------------------------*> 2222 <* Find term_entry i katalog med key som angivet term_id *> 2223 <* *> 2224 <* term_id (call) : Terminal navn (integer array (1:4)) *> 2225 <* Return : True=fundet, False=ikke fundet *> 2226 <*----------------------------------------------------------*> 2227 integer array term_id; 2228 begin 2229 integer field hash_count; 2230 integer i,hash; 2231 boolean found; 2232 2232 trap(alarm); 2233 hash:=calc_hash(term_id,termcat_size); 2234 find_term_seg(hash); 2235 hash_count:=2; 2236 hash_count:=termcat.hash_count; 2237 term_entry:=2; 2238 if hash_count>0 then 2239 begin 2240 repeat 2241 if termcat.term_entry(1)=hash then 2242 begin 2243 found:=true; 2244 hash_count:=hash_count-1; 2245 for i:=2, i+1 while (i<=5 and found) do 2246 if termcat.term_entry(i)<>term_id(i-1) then 2247 found:=false; 2248 end 2249 else 2250 found:=false; 2251 if not found then 2252 next_term_entry; 2253 until found or hash_count=0 or 2254 (term_seg=hash and term_entry=2); 2255 if not found and hash_count>0 then 2256 write_message(43,2,true,<:Cyclic in catalog:>); 2257 end 2258 else 2259 found:=false; 2260 find_term:=found; 2261 if false then 2262 alarm: disable traped(43); 2263 end; 2264 2264 boolean procedure find_empty_term_entry(hash_key); 2265 <* 44 *> 2266 <*----------------------------------------------------------*> 2267 <* Find første tomme term_entry hørende til hash_key *> 2268 <* Optæl hash key tæller i hash segmentet. Sæt term_entry *> 2269 <* til fundet entry. Hash_key indsættes i fundet segment. *> 2270 <* Entry SKAL udskrives på disken efter indsættelse af data *> 2271 <* *> 2272 <* hash_key (call) : Hash nøglen hørende til det segment *> 2273 <* hvorfra der søges efter tomt entry *> 2274 <* Return : True=Entry fundet. Sat i term_entry *> 2275 <* False=Ikke mere plads i katalog *> 2276 <*----------------------------------------------------------*> 2277 integer hash_key; 2278 begin 2279 boolean room; 2280 2280 trap(alarm); 2281 find_term_seg(hash_key); 2282 term_entry:=0; 2283 termcat.term_entry(1):=termcat.term_entry(1)+1; 2284 setstate(termcat,6); 2285 term_entry:=2; 2286 room:=true; 2287 while termcat.term_entry(1)<>0 and room do 2288 begin 2289 next_term_entry; 2290 if (hash_key=term_seg) and (term_entry=2) then 2291 room:=false; 2292 end; 2293 if not room then 2294 begin 2295 find_empty_term_entry:=false; 2296 find_term_seg(hash_key); 2297 term_entry:=0; 2298 termcat.term_entry(1):=termcat.term_entry(1)-1; 2299 write_term_seg; 2300 end 2301 else 2302 begin 2303 find_empty_term_entry:=true; 2304 termcat.term_entry(1):=hash_key; 2305 end; 2306 if false then 2307 alarm: disable traped(44); 2308 end; 2309 2309 boolean procedure find_type_entry(type_nr); 2310 <* 45 *> 2311 <*----------------------------------------------------------*> 2312 <* Find entry hørende til angivet type. Sæt type_entry *> 2313 <* BEMÆRK: Benyttes parallelt i catalog, operatør og *> 2314 <* timecheck korutinerne *> 2315 <* *> 2316 <* type_nr (call) : typen af terminalen >0 *> 2317 <* Return : True=Entry fundet, False= IKKE fundet *> 2318 <* field type_entry sat til entry *> 2319 <*----------------------------------------------------------*> 2320 integer type_nr; 2321 begin 2322 integer seg; 2323 integer array ia(1:20); 2324 2324 trap(alarm); 2325 seg:=(type_nr-1)//(512//type_entry_length)+1; 2326 if seg > typecat_size-1 or seg<1 or type_nr<1 then 2327 find_type_entry:=false 2328 else 2329 begin 2330 type_entry:=type_entry_length*((type_nr-1) mod (512//type_entry_length)); 2331 setposition(typecat,0,seg); 2332 inrec6(typecat,512); <* NO passivate *> 2333 getzone6(typecat,ia); 2334 ia(9):=seg; 2335 setzone6(typecat,ia); 2336 find_type_entry:=true; 2337 end; 2338 if false then 2339 alarm: disable traped(45); 2340 end; 2341 2341 procedure write_type_seg; 2342 <* 46 *> 2343 <*----------------------------------------------------------*> 2344 <* Opdater aktuelt type segment på disken. Segmentet for- *> 2345 <* bliver i zone-bufferen med state: opend and positioned. *> 2346 <*----------------------------------------------------------*> 2347 begin 2348 integer seg; 2349 integer array ia(1:20); 2350 2350 trap(alarm); 2351 getposition(typecat,0,seg); 2352 setstate(typecat,6); 2353 setposition(typecat,0,seg); 2354 inrec6(typecat,512); 2355 getzone6(typecat,ia); 2356 ia(9):=seg; 2357 setzone6(typecat,ia); 2358 if false then 2359 alarm: disable traped(46); 2360 end; 2361 2361 procedure read_param_line; 2362 <* 47 *> 2363 <*---------------------------------------------------------------*> 2364 <* Læs parametre fra fp kaldet *> 2365 <* Sæt : new_catalog / cattxt_name *> 2366 <* init_file_name *> 2367 <* fp_maxterms *> 2368 <* *> 2369 <* init_file_name sættes default til: 'tasinit' men ændres *> 2370 <* hvis der angives init.<name> i kald *> 2371 <* maxterms sættes fra kald hvis der angives terminals.<antal> *> 2372 <* ellers sættes maxterms fra init_file. *> 2373 <* Angives catalog.<name> sættes <name> i cattxt_name og *> 2374 <* new_catalog sættes true *> 2375 <*---------------------------------------------------------------*> 2376 begin 2377 integer j,seperator,i,key; 2378 real array item(1:2); 2379 2379 trap(alarm); 2380 new_catalog:=false; 2381 fp_maxterms:=0; 2382 init_file_name.laf(1):=init_file_name.laf(2):=0; 2383 put_text(init_file_name.laf,1,<:tasinit:>); <* Default init name *> 2384 i:=1; 2385 repeat 2386 seperator:=system(4,i,item); 2387 i:=i+1; 2388 if seperator=(4 shift 12) + 10 then 2389 begin 2390 key:=find_keyword_value(item.laf(1),3); 2391 seperator:=system(4,i,item); 2392 i:=i+1; 2393 if key=7 then 2394 begin 2395 if seperator=(8 shift 12) + 10 then 2396 begin 2397 new_catalog:=true; 2398 for j:=1,2 do 2399 cattxt_name.laf(j):=item.laf(j); 2400 end 2401 else 2402 write_message(47,i,false,<:Illegal call parameter:>); 2403 end 2404 else 2405 if key=9 then 2406 begin 2407 if seperator=(8 shift 12) + 10 then 2408 begin 2409 for j:=1,2 do 2410 init_file_name.laf(j):=item.laf(j); 2411 end 2412 else 2413 write_message(47,i,false,<:Illegal call parameter:>); 2414 end 2415 else 2416 if key=8 then 2417 begin 2418 if seperator=(8 shift 12) + 4 then 2419 fp_maxterms:=item(1) 2420 else 2421 write_message(47,i,false,<:Illegal call parameter:>); 2422 end 2423 else 2424 write_message(47,i,false,<:Unknown call parameter:>); 2425 end; 2426 until seperator=0; 2427 if false then 2428 alarm: disable traped(47); 2429 end; 2430 2430 procedure init_tascat; 2431 <* 48 *> 2432 <*-------------------------------------------------------*> 2433 <* Initialiser tascat variable. *> 2434 <* Data hentes enten fra init fil eller der benyttes *> 2435 <* standard værdi. Beskrivelsen af data typer og *> 2436 <* standard værdier sættes i procedure init_param_arrays *> 2437 <*-------------------------------------------------------*> 2438 begin 2439 zone init_file(128,1,std_error); 2440 integer array val(0:45); 2441 integer array init_type,init_count(1:init_num_keys-9); 2442 integer array init_lim(1:init_num_keys-9,1:2); 2443 long array init_default(1:init_num_keys-9); 2444 integer array spoolname,ttname,temname(1:4); 2445 integer spseg,textbufsize,timeout,tbufsize,ttmask,reserve,i; 2446 2446 procedure init_param_arrays; 2447 <* 49 *> 2448 <*-------------------------------------------------*> 2449 <* Initialiser arrays der beskriver data typer m.m *> 2450 <*-------------------------------------------------*> 2451 begin 2452 long f,t; 2453 integer i; 2454 integer max,min; 2455 2455 <*********************************************************************> 2456 <* Følgende arrays initialiseres: *> 2457 <* integer array init_type(1:???) ; Beskriver typen af data : *> 2458 <* 0 = IKKE brugt *> 2459 <* 1 = cmcl-tekst *> 2460 <* 2 = navn *> 2461 <* 3 = heltal (integer) *> 2462 <* 4 = logisk (boolean) *> 2463 <* 5 = 2 heltal (integer) *> 2464 <* *> 2465 <* long array init_default(1:???) ; Standard værdi : *> 2466 <* For type 1 : 0 til 130 iso tegn *> 2467 <* 2 : 0 til 11 iso tegn *> 2468 <* 3 : Heltals værdi *> 2469 <* 4 : false add værdi (0=false , 1=true) *> 2470 <* 5 : Heltals værdi for begge værdier *> 2471 <* *> 2472 <* integer array init_lim(1:???,1:2) ; Grænser for angivet værdi *> 2473 <* For type 1 : (1) = Max. antal tegn *> 2474 <* (2) = ubrugt *> 2475 <* 2 : (1) = ubrugt *> 2476 <* (2) = ubrugt *> 2477 <* 3 : (1) = mindste værdi *> 2478 <* (2) = største værdi *> 2479 <* 4 : (1) = ubrugt *> 2480 <* (2) = ubrugt *> 2481 <* 5 : (1) = mindste værdi *> 2482 <* (2) = største værdi *> 2483 <* *> 2484 <* integer array init_count(1:???); Beskrivelse af gemning af værdi *> 2485 <* Angiver antallet af ord -1, der indgår i værdien. *> 2486 <* *> 2487 <* Navne på parametrerne i init_file sættes i : *> 2488 <* procedure keywords_init i array init_keywords. *> 2489 <* fra keyword 10 og frem. Keyword værdi benyttes som index til *> 2490 <* init array's. Lokale værdier sættes i set_local_data *> 2491 <*********************************************************************> 2492 trap(alarm); 2493 t:=1; f:=0; 2494 max:=8388605; min:=-8388607; 2495 for i:=1 step 1 until init_num_keys-9 do 2496 begin 2497 init_type(i):=case i of 2498 (2,2,2,2,2,2,2,2,4,3, 2499 3,4,3,5,5,3,3,3,3,3, 2500 3,3,3,3,3,3,3,3,1,1, 2501 1,1,3,3,3,3,4); 2502 2502 init_default(i):=case i of 2503 (long <:disc:>,long <:tasusercat:>,long <:tastermcat:>, 2504 long <:tastypecat:>,long <:tascattest:>,long <:tasspool:>, 2505 long <:tastermtest:>, long <:tem:>,t,3, 2506 3,t,5,max,max,0,0,20,10,5, 2507 25,5,2,170,3,10,2,30,long <::>,long <::>, 2508 long <:Afmeld !:>,long <:Afmeld !:>,412,-1,1365,0,t); 2509 2509 init_count(i):=case i of 2510 (3,3,3,3,3,3,3,3,0,0, 2511 0,0,0,0,0,0,0,0,0,0, 2512 0,0,0,0,0,0,0,0,27,45, 2513 27,27,0,0,0,0,0); 2514 2514 init_lim(i,1):=case i of 2515 (0,0,0,0,0,0,0,0,0,0, 2516 0,0,1,min,min,0,0,1,1,1, 2517 3,1,1,70,1,1,1,1,80,80, 2518 80,80,0,-1,0,0,0); 2519 2519 init_lim(i,2):=case i of 2520 (0,0,0,0,0,0,0,0,0,4095, 2521 4095,0,30,max,max,max,max,max,max,max, 2522 max,max,max,500,2047,max,5,max,0,0, 2523 0,0,1024,0,4095,999999,0); 2524 2524 end; 2525 if false then 2526 alarm: disable traped(49); 2527 end; 2528 2528 procedure set_default; 2529 <* 50 *> 2530 <*------------------------------------------------------*> 2531 <* Sæt standard værdierne i lokale og globale variable *> 2532 <*------------------------------------------------------*> 2533 begin 2534 integer i,j; 2535 2535 <*************************************************************************> 2536 <* integer array val benyttes til midlertidig opbevaring af læst værdi *> 2537 <* For type 1 : (0) = hw's shift 12 + char's *> 2538 <* (1:45) = Teksten *> 2539 <* 2 : (0:3) = Navnet (udfyldt med 0) *> 2540 <* 3 : (0) = Værdien *> 2541 <* 4 : (0) = (0=false , 1=true); *> 2542 <* 5 : (0),(1)= 2 værdier *> 2543 <*************************************************************************> 2544 trap(alarm); 2545 host_id(0):=signon_text(0):=logtxt(0):=stoptxt(0):=0; 2546 for i:=1 step 1 until init_num_keys-9 do 2547 begin 2548 if init_type(i)>0 then 2549 begin 2550 case init_type(i) of 2551 begin 2552 begin <* 1 *> 2553 val(0):=puttext(val.laf,1,string init_default(i),-init_lim(i,1)); 2554 val(0):=val(0)+1; 2555 put_ch(val.laf,val(0)+0,10,1); 2556 put_ch(val.laf,val(0)+1,0,6); 2557 val(0):=(((val(0)+2)//3+1)*2) shift 12 + val(0); 2558 end; 2559 begin <* 2 *> 2560 val.laf(1):=val.laf(2):=0; 2561 puttext(val.laf,1,string init_default(i),-11); 2562 for j:=1 step 1 until 4 do 2563 val(j-1):=val(j); 2564 end; 2565 begin <* 3 *> 2566 val(0):=init_default(i); 2567 end; 2568 begin <* 4 *> 2569 val(0):=init_default(i); 2570 end; 2571 begin <* 5 *> 2572 val(0):=init_default(i); 2573 val(1):=init_default(i); 2574 end; 2575 end; 2576 set_local_data(i); 2577 end; 2578 end; 2579 if false then 2580 alarm: disable traped(50); 2581 end; 2582 2582 procedure read_init_param; 2583 <* 51 *> 2584 <*---------------------------------------------------*> 2585 <* Modifiser værdier med læste værdier fra init_file *> 2586 <*---------------------------------------------------*> 2587 begin 2588 integer i,j,init_line_nr; 2589 boolean ok; 2590 2590 trap(alarm); 2591 init_line_nr:=1; 2592 i:=read_start_key(init_file,3,init_line_nr); 2593 while i=0 do 2594 begin 2595 next_line(init_file,init_line_nr); 2596 i:=read_start_key(init_file,3,init_line_nr); 2597 end; 2598 i:=i-9; 2599 while i>=1 do 2600 begin 2601 if init_type(i)>0 then 2602 begin 2603 case init_type(i) of 2604 begin 2605 begin <* 1 *> 2606 val(0):=read_text(init_file,val.laf,init_lim(i,1)); 2607 val(0):=val(0)+1; 2608 put_ch(val.laf,val(0)+0,10,1); 2609 put_ch(val.laf,val(0)+1,0,6); 2610 val(0):=(((val(0)+2)//3+1)*2) shift 12 + val(0); 2611 end; 2612 begin <* 2 *> 2613 read_name(init_file,val,ok); 2614 if not ok then 2615 write_message(51,init_line_nr,false,<:Illegal init value:>); 2616 end; 2617 begin <* 3 *> 2618 if not read_nr(init_file,val(0)) or 2619 (val(0)<init_lim(i,1)) or (val(0)>init_lim(i,2)) then 2620 write_message(51,init_line_nr,false,<:Illegal init value:>); 2621 end; 2622 begin <* 4 *> 2623 j:=read_start_key(init_file,3,init_line_nr); 2624 if j=1 <* true *> or j=3 <* on *> or j=5 <* start *> then 2625 val(0):=1 2626 else 2627 if j=2 <* false *> or j=4 <* off *> or j=6 <* stop *> then 2628 val(0):=0 2629 else 2630 write_message(51,init_line_nr,false,<:Illegal init value:>); 2631 end; 2632 begin <* 5 *> 2633 if not read_nr(init_file,val(0)) or 2634 (val(0)<init_lim(i,1)) or (val(0)>init_lim(i,2)) then 2635 write_message(51,init_line_nr,false,<:Illegal init value:>); 2636 if not read_nr(init_file,val(1)) or 2637 (val(1)<init_lim(i,1)) or (val(1)>init_lim(i,2)) then 2638 write_message(51,init_line_nr,false,<:Illegal init value:>); 2639 end; 2640 end; 2641 set_local_data(i); 2642 end; 2643 next_line(init_file,init_line_nr); 2644 i:=read_start_key(init_file,3,init_line_nr)-9; 2645 end; 2646 if i=-9 then 2647 write_message(51,init_line_nr,false,<:Unknown init param.:>); 2648 if false then 2649 alarm: disable traped(51); 2650 end; 2651 2651 procedure set_local_data(key); 2652 <* 52 *> 2653 <*------------------------------------*> 2654 <* Sæt data fra val i lokale variable *> 2655 <* *> 2656 <* key (call) : Angiver den variable *> 2657 <* der skal initialiseres*> 2658 <*------------------------------------*> 2659 integer key; 2660 begin 2661 integer i; 2662 integer array st(0:68); 2663 2663 for i:=0 step 1 until init_count(key) do 2664 begin 2665 case key of 2666 begin 2667 cat_doc(i+1):=val(i); 2668 usercat_name(i+1):=val(i); 2669 termcat_name(i+1):=val(i); 2670 typecat_name(i+1):=val(i); 2671 testout_name(i+1):=val(i); 2672 spoolname(i+1):=val(i); 2673 ttname(i+1):=val(i); 2674 temname(i+1):=val(i); 2675 login_stat:=if val(0)=0 then 0 else 96; 2676 max_user_block:=val(0); 2677 max_term_block:=val(0); 2678 timecheck_stat:=false add val(0); 2679 logtime:=val(0); 2680 begin 2681 cmclbases(1):=val(0); 2682 cmclbases(2):=val(1); 2683 end; 2684 begin 2685 sysbases(1):=val(0); 2686 sysbases(2):=val(1); 2687 end; 2688 cps:=val(0); 2689 cls:=val(0); 2690 max_sessions:=val(0); 2691 max_terminals:=val(0); 2692 max_sysmenu:=val(0); 2693 corebufs:=val(0); 2694 mclprogs:=val(0); 2695 term_types:=val(0); 2696 tbufsize:=val(0); 2697 spseg:=val(0); 2698 max_users:=val(0); 2699 number_of_opera:=val(0); 2700 timeout:=val(0); 2701 host_id(i):=val(i); 2702 st(i):=val(i); 2703 logtxt(i):=val(i); 2704 stoptxt(i):=val(i); 2705 begin 2706 testselect:=val(0) extract 8; 2707 tracetype:=val(0) shift (-8); 2708 end; 2709 trapmode:=val(0); 2710 ttmask:=val(0); 2711 initver:=val(0); 2712 reserve:=val(0); 2713 end; 2714 end; 2715 if key=30 then 2716 begin 2717 i:=signon_text(0) extract 12 + 1; 2718 put_txt(signon_text.laf,i,st.laf,st(0) extract 12); 2719 put_ch(signon_text.laf,i+0,0,6); 2720 signon_text(0):=(((i+1)//3)*2) shift 12 + (i-1); 2721 end; 2722 end; 2723 2723 trap(alarm); 2724 open(init_file,4,init_file_name,0); 2725 if monitor(42,init_file,0,val)<>0 then 2726 write_message(48,1,false,<:No init file:>); 2727 init_param_arrays; 2728 set_default; 2729 <* Set host id fra navn i monitor *> 2730 hostid(0):=22 shift 12 + 29; 2731 hostid.laf(1):=long <: V:> add 'e'; 2732 hostid.laf(2):=long <:lkomm:> add 'e'; 2733 hostid.laf(3):=long <:n til:> add ' '; 2734 system(5,1192,val); 2735 for i:=0,1,2,3 do 2736 hostid(7+i):=val(i); 2737 read_init_param; 2738 text_buf_size:=148; 2739 max_text_count:=max_terminals//4; 2740 test_on:=true; 2741 language:=1; 2742 close(init_file,true); 2743 <* Sæt data i copy_buf *> 2744 copy_buf.iaf(1):=cps+cls+2*max_sessions+max_sysmenu; <* Antal cdescr *> 2745 copy_buf.iaf(2):=term_types; <* Antal terminal type beskrivelser *> 2746 copy_buf.iaf(3):=max_terminals; <* Antal terminal beskrivelser *> 2747 copy_buf.iaf(4):=mclprogs; <* Antal indgange i mcltable *> 2748 copy_buf.iaf(5):=spoolname(1); <* Navn på spool area *> 2749 copy_buf.iaf(6):=spoolname(2); 2750 copy_buf.iaf(7):=spoolname(3); 2751 copy_buf.iaf(8):=spoolname(4); 2752 copy_buf.iaf(9):=corebufs; <* Antal core buffere *> 2753 copy_buf.iaf(10):=max_sysmenu//2;<* Antal att event descr *> 2754 copy_buf.iaf(11):=reserve; <* reserver terminal ved create link *> 2755 copy_buf.iaf(12):=cmclbases(1); <* MCL database std baser *> 2756 copy_buf.iaf(13):=cmclbases(2); 2757 copy_buf.iaf(14):=cls+max_sessions+max_sysmenu; <* Antal termina buf *> 2758 copy_buf.iaf(15):=tbufsize; <* max tbuf size *> 2759 copy_buf.iaf(16):=spseg; <* std seg i link spool area *> 2760 copy_buf.iaf(17):=2*152; <* hw i signon buffer *> 2761 copy_buf.iaf(18):=sysbases(1); <* test/spool baser *> 2762 copy_buf.iaf(19):=sysbases(2); 2763 copy_buf.iaf(20):=temname(1); <* Navn på tem pseudo proces *> 2764 copy_buf.iaf(21):=temname(2); 2765 copy_buf.iaf(22):=temname(3); 2766 copy_buf.iaf(23):=temname(4); 2767 copy_buf.iaf(24):=ttname(1); <* Testområde navn *> 2768 copy_buf.iaf(25):=ttname(2); 2769 copy_buf.iaf(26):=ttname(3); 2770 copy_buf.iaf(27):=ttname(4); 2771 copy_buf.iaf(28):=timeout; <* Antal timeout på term i mcl *> 2772 copy_buf.iaf(29):=textbufsize; <* Antal hw til txt i systxt buf *> 2773 copy_buf.iaf(30):=max_text_count;<* Antal udestående systxt mess. *> 2774 copy_buf.iaf(31):=ttmask; <* testmaske *> 2775 copy_buf.iaf(32):=cps; <* max pools efter create pool mess. *> 2776 copy_buf.iaf(33):=max_sessions; <* Max sessioner *> 2777 2777 if false then 2778 alarm: disable traped(48); 2779 end; 2780 2780 procedure wait_tasterm(error); 2781 <* 53 *> 2782 <*----------------------------------------------*> 2783 <* Vent på init message fra tasterm *> 2784 <* Når denne kommer sendes init data til tasterm*> 2785 <*----------------------------------------------*> 2786 boolean error; 2787 begin 2788 zone z(1,1,stderror); 2789 integer buf; 2790 2790 trap(alarm); 2791 write_message(-53,0,true,if error then <:Stop tas:> else <:Synchronizing:>); 2792 repeat 2793 <* sæt tasterm_pda ud fra denne message *> 2794 tasterm_pda:=monitor(20,z,buf,answer); 2795 <* sæt tasterm_name ud fra pda *> 2796 if not get_proc_name(tasterm_pda,tasterm_name) then 2797 write_message(53,1,false,<:Sync. error:>); 2798 if answer(1)<>(9 shift 12 + 1) then 2799 begin 2800 write_message(53,answer(1),true,<:System not running yet:>); 2801 answer(9):=3; 2802 monitor(22,z,buf,answer); 2803 end; 2804 until answer(1)=(9 shift 12 + 1); 2805 tastermverd:=answer(4); 2806 tastermvert:=answer(5); 2807 write_message(answer(5),answer(4),true,<:Tasterm release:>); 2808 write_message(relt,reld,true,<:Tascat release:>); 2809 write_message(0,initver,true,<:Init version:>); 2810 <* retur init data til tasterm *> 2811 if data_from_copy_buf(256,buf,answer)<>0 then 2812 write_message(53,2,false,<:Sync. error:>); 2813 answer(9):=1; 2814 answer(1):=if error then 1 else 0; 2815 monitor(22,z,buf,answer); 2816 if false then 2817 alarm: disable traped(53); 2818 end; 2819 2819 procedure tascat; 2820 <* 00 *> 2821 <*------------------------------------------*> 2822 <*------------------------------------------*> 2823 <* Hoved procedure for TASCAT *> 2824 <*------------------------------------------*> 2825 <*------------------------------------------*> 2826 begin 2827 integer array login_struc(1:4*struc_size); 2828 2828 <*---------------------------------------------------------------------*> 2829 <* login_struc indeholder beskrivelse af alle tilmeldte brugere *> 2830 <* *> 2831 <* ! *> 2832 <* bruger ----> terminal ---- session *> 2833 <* ! ! ! *> 2834 <* ! ! V *> 2835 <* ! ! session *> 2836 <* ! ! . *> 2837 <* ! V . *> 2838 <* ! terminal ... *> 2839 <* V . *> 2840 <* bruger ... . *> 2841 <* . *> 2842 <* . *> 2843 <* *> 2844 <* login_struc er opdelt i blokke af 4 integer. *> 2845 <* brugerbeskrivelse = 2 blokke *> 2846 <* terminalbeskrivelse = 1 blok *> 2847 <* sessionsbeskrivelse = 1 blok *> 2848 <* *> 2849 <* brugerbeskrivelse: *> 2850 <* *> 2851 <* (0) - (3) : user id *> 2852 <* (4) : userindex map < 12 + last login time *> 2853 <* (5) : user privilege < 12 + user status *> 2854 <* (6) : terminal pointer *> 2855 <* (7) : next user pointer *> 2856 <* *> 2857 <* terminalbeskrivelse: *> 2858 <* *> 2859 <* (0) : terminal pda *> 2860 <* (1) : mess < 21 + session map < 12 + terminal type *> 2861 <* (2) : session pointer *> 2862 <* (3) : next terminal pointer *> 2863 <* *> 2864 <* sessionbeskriver *> 2865 <* *> 2866 <* (0) : terminal handler cda (tasterm) *> 2867 <* (1) : session nr < 12 + user index *> 2868 <* (2) : session status *> 2869 <* (3) : next session *> 2870 <* *> 2871 <* free block beskriver *> 2872 <* *> 2873 <* (0) : 0 *> 2874 <* (1) : 0 *> 2875 <* (2) : prev. free block pointer *> 2876 <* (3) : next free block pointer *> 2877 <* *> 2878 <* pointer er index på første integer i blok. pointer lig 0 er tom. *> 2879 <* *> 2880 <* mess : 0 = ingen message *> 2881 <* bit sat angiver text buffer nr: *> 2882 <* lsb = 1, msb = 3 *> 2883 <* user index map : bit sat for hver user index benyttet *> 2884 <* index 0 lig lsb. *> 2885 <* session map : bit sat for hver session i brug *> 2886 <* session 1 lig 1 shift 1. *> 2887 <* last login time : sidste tilmeldingstid (0 til 24) *> 2888 <* 25 = ingen begrænsning (NON) *> 2889 <* 26 = under afmelding (NOW) *> 2890 <* 27 = remove mess. sendt *> 2891 <* >100 lig næste dag. *> 2892 <* user privilege : privilegiebit fra katalog *> 2893 <* user status : bit 11 sat lig tilmelding stoppet for bruger *> 2894 <* session status : bit 23 sat lig removing session *> 2895 <* *> 2896 <*---------------------------------------------------------------------*> 2897 2897 2897 procedure init_login_struc; 2898 <* 54 *> 2899 <*----------------------------------------------------*> 2900 <* Initialiser login_struc *> 2901 <*----------------------------------------------------*> 2902 begin 2903 integer size,pos; 2904 2904 trap(alarm); 2905 system(3,size,login_struc); 2906 free_list:=1; 2907 userlist:=0; 2908 login_struc(1):=login_struc(2):=login_struc(3):=0; 2909 login_struc(4):=5; 2910 for pos:=5 step 4 until size-4 do 2911 begin 2912 login_struc(pos):=login_struc(pos+1):=0; 2913 login_struc(pos+2):=pos-4; 2914 login_struc(pos+3):=pos+4; 2915 end; 2916 login_struc(pos):=login_struc(pos+1):=login_struc(pos+3):=0; 2917 login_struc(pos+2):=pos-4; 2918 if false then 2919 alarm: disable traped(54); 2920 end; 2921 2921 integer procedure get_free_login(numbers); 2922 <* 55 *> 2923 <*--------------------------------------------------------------*> 2924 <* Reserver et antal sammenhængende blokke i login strukturen. *> 2925 <* *> 2926 <* numbers (call) : Det antal blokke der ønskes reserveret *> 2927 <* Return : Peger til første blok der er reserveret *> 2928 <* eller nul (0) hvis det ikke var muligt *> 2929 <*--------------------------------------------------------------*> 2930 integer numbers; 2931 begin 2932 boolean found; 2933 integer free,cur,next,prev; 2934 2934 trap(alarm); 2935 get_free_login:=0; 2936 found:=false; 2937 cur:=free_list; 2938 while not found and cur>0 do 2939 begin 2940 found:=true; 2941 free:=cur; 2942 while free <= cur+(numbers-2)*4 and found do 2943 if login_struc(free+3)=free+4 then 2944 free:=free+4 2945 else 2946 found:=false; 2947 if not found then 2948 cur:=login_struc(free+3); 2949 end; 2950 if found then 2951 begin 2952 get_free_login:=cur; 2953 next:=login_struc(free+3); 2954 prev:=login_struc(cur+2); 2955 if prev=0 then 2956 free_list:=next 2957 else 2958 login_struc(prev+3):=next; 2959 if next>0 then 2960 login_struc(next+2):=prev; 2961 end; 2962 if false then 2963 alarm: disable traped(55); 2964 end; 2965 2965 procedure release_block(addr); 2966 <* 56 *> 2967 <*---------------------------------------------------------------*> 2968 <* Indsæt blokken angivet ved addr i free listen direkte efter *> 2969 <* den forrige frie blok. *> 2970 <* *> 2971 <* addr (call) : Adressen på den blok der skal indsættes i free *> 2972 <* listen (listen udpeget af free_list) *> 2973 <*---------------------------------------------------------------*> 2974 integer addr; 2975 begin 2976 integer prev,next; 2977 2977 trap(alarm); 2978 prev:=0; 2979 next:=free_list; 2980 while not (next > addr) and next>0 do 2981 begin 2982 prev:=next; 2983 next:=login_struc(prev+3); 2984 end; 2985 login_struc(addr):=0; 2986 login_struc(addr+1):=0; 2987 login_struc(addr+2):=prev; 2988 login_struc(addr+3):=next; 2989 if prev=0 then 2990 free_list:=addr 2991 else 2992 login_struc(prev+3):=addr; 2993 if next>0 then 2994 login_struc(next+2):=addr; 2995 if false then 2996 alarm: disable traped(56); 2997 end; 2998 2998 integer procedure find_login_user(id,start); 2999 <* 57 *> 3000 <*-------------------------------------------------------------*> 3001 <* Find bruger beskrivelse i login struktur ud fra id *> 3002 <* Start søgningen med beskrivelsen udpeget af start *> 3003 <* *> 3004 <* id (call) : Navnet på brugeren der skal søges efter *> 3005 <* start (call) : Peger til første beskrivelse der søges i *> 3006 <* Return : Peger til fundet beskrivelse eller nul hvis *> 3007 <* beskrivelsen ikke blev fundet *> 3008 <*-------------------------------------------------------------*> 3009 value start; 3010 integer start; 3011 integer array id; 3012 begin 3013 integer i; 3014 boolean found; 3015 3015 trap(alarm); 3016 find_login_user:=0; 3017 while start>0 do 3018 begin 3019 found:=true; 3020 for i:=1, i+1 while (i<=4 and found) do 3021 if login_struc(start+i-1)<>id(i) then 3022 found:=false; 3023 if found then 3024 begin 3025 find_login_user:=start; 3026 start:=0; 3027 end 3028 else 3029 start:=login_struc(start+7); 3030 end; 3031 if false then 3032 alarm: disable traped(57); 3033 end; 3034 3034 integer procedure find_login_terminal(name,user_index); 3035 <* 58 *> 3036 <*-----------------------------------------------------------*> 3037 <* Find terminal beskrivelse i login_struc ud fra navn *> 3038 <* *> 3039 <* name (call) : Navnet på terminalen *> 3040 <* user_index (ret) : Index i login_struc på terminal bruger *> 3041 <* Return : Index i login_struc hvis fundet ellers 0 *> 3042 <*-----------------------------------------------------------*> 3043 integer array name; 3044 integer user_index; 3045 begin 3046 integer pda,term_index; 3047 boolean found; 3048 3048 trap(alarm); 3049 pda:=get_pda(name); 3050 found:=false; 3051 term_index:=0; 3052 user_index:=user_list; 3053 while user_index>0 and not found do 3054 begin 3055 term_index:=find_user_terminal(pda,login_struc(user_index+6)); 3056 if term_index>0 then 3057 found:=true 3058 else 3059 user_index:=login_struc(user_index+7); 3060 end; 3061 find_login_terminal:=term_index; 3062 if false then 3063 alarm: disable traped(58); 3064 end; 3065 3065 integer procedure find_user_terminal(pda,start); 3066 <* 59 *> 3067 <*-------------------------------------------------------------*> 3068 <* Find terminal beskrivelse i login struktur ud fra pda *> 3069 <* Start søgningen med beskrivelsen udpeget af start *> 3070 <* *> 3071 <* pda (call) : PDA for den terminal der ledes efter *> 3072 <* start (call) : Peger til første beskrivelse der søges i *> 3073 <* Return : Peger til fundet beskrivelse eller nul hvis *> 3074 <* beskrivelsen ikke blev fundet *> 3075 <*-------------------------------------------------------------*> 3076 value start; 3077 integer pda,start; 3078 begin 3079 trap(alarm); 3080 find_user_terminal:=0; 3081 while start>0 do 3082 begin 3083 if login_struc(start)=pda then 3084 begin 3085 find_user_terminal:=start; 3086 start:=0; 3087 end 3088 else 3089 start:=login_struc(start+3); 3090 end; 3091 if false then 3092 alarm: disable traped(59); 3093 end; 3094 3094 3094 boolean procedure check_term(term_id); 3095 <* 60 *> 3096 <*--------------------------------------------------------------------*> 3097 <* Undersøg om terminal er indlogget *> 3098 <* *> 3099 <* term_id (call) : Navnet på terminalen (integer array (1:4) *> 3100 <* Return : True = terminal indlogget *> 3101 <* False = terminal ikke indlogget *> 3102 <*--------------------------------------------------------------------*> 3103 integer array term_id; 3104 begin 3105 integer pda,next; 3106 integer array dummy(1:1); 3107 boolean found; 3108 3108 trap(alarm); 3109 found:=false; 3110 pda:=get_pda(term_id); 3111 if pda<>0 then 3112 begin 3113 next:=user_list; 3114 while (next<>0) and not found do 3115 begin 3116 found:=find_user_terminal(pda,login_struc(next+6))>0; 3117 next:=login_struc(next+7); 3118 end; 3119 end; 3120 check_term:=found; 3121 if false then 3122 alarm: disable traped(60); 3123 end; 3124 3124 boolean procedure check_type(type_nr); 3125 <* 61 *> 3126 <*--------------------------------------------------------------------*> 3127 <* Undersøg om terminal med givet type nummer er indlogget *> 3128 <* *> 3129 <* type_nr (call) : nummeret på den type der checkes *> 3130 <* Return : True = type benyttet *> 3131 <* False = type ikke benyttet *> 3132 <*--------------------------------------------------------------------*> 3133 integer type_nr; 3134 begin 3135 integer next_user,next_term; 3136 boolean found; 3137 3137 trap(alarm); 3138 found:=false; 3139 next_user:=user_list; 3140 while (next_user<>0) and not found do 3141 begin 3142 next_term:=login_struc(next_user+6); 3143 while (next_term<>0) and not found do 3144 begin 3145 found:=(login_struc(next_term+1) extract 12)=type_nr; 3146 next_term:=login_struc(next_term+3); 3147 end; 3148 next_user:=login_struc(next_user+7); 3149 end; 3150 check_type:=found; 3151 if false then 3152 alarm: disable traped(61); 3153 end; 3154 3154 boolean procedure remove_sess(sess_index); 3155 <* 62 *> 3156 <*-----------------------------------------------------------------*> 3157 <* Send remove message til tasterm for angivet session *> 3158 <* Sæt remove-status i session hvis message er sendt ok *> 3159 <* *> 3160 <* sess_index (call) : Index i login_struc til session *> 3161 <* Return : True = Message sendt og/eller status sat *> 3162 <* False = Message ikke sendt eller ikke ok *> 3163 <* Status ikke sat af denne procedure *> 3164 <*-----------------------------------------------------------------*> 3165 integer sess_index; 3166 begin 3167 integer array ia(1:8); 3168 integer i; 3169 zone tasterm(1,1,std_error); 3170 3170 trap(alarm); 3171 remove_sess:=true; 3172 if not (false add login_struc(sess_index+2)) then 3173 begin 3174 login_struc(sess_index+2):=login_struc(sess_index+2)+1; 3175 ia(1):=10 shift 12 + 0; 3176 ia(2):=login_struc(sess_index); 3177 open(tasterm,0,tasterm_name,1 shift 9); <* Imp. passivate *> 3178 send_mess(tasterm,ia); 3179 i:=monitor(18,tasterm,1,ia); 3180 if i<>1 or ia(1)<>0 then 3181 begin 3182 remove_sess:=false; 3183 login_struc(sess_index+2):=login_struc(sess_index+2)-1 3184 end; 3185 end; 3186 if false then 3187 alarm: disable traped(62); 3188 end; 3189 3189 integer procedure check_user(login_user,last_time, 3190 user_id,term_id,password1,password2); 3191 <* 63 *> 3192 <*--------------------------------------------------------------------------*> 3193 <* Check om bruger kan tilmeldes login strukturen *> 3194 <* *> 3195 <* last_time (ret) : Sidste indlognings tid for bruger (hvis bruger ok) *> 3196 <* login_user (ret) : Index til fundet bruger i login_struc eller *> 3197 <* hvis bruger er ny er login_user lig 0 *> 3198 <* user_id (call) : Navn på bruger der skal checkes (fra inlogning) *> 3199 <* term_id (call) : Navn på terminal hvorfra inlogning foretages. *> 3200 <* password1 (call) : Første ord i kodet password (fra inlogning) *> 3201 <* password2 (call) : Andet ord i kodet password *> 3202 <* Return : 0 hvis check af bruger er OK ellers fejlårsag *> 3203 <* *> 3204 <* Fejlårsag: *> 3205 <* *> 3206 <* 0 = User ok *> 3207 <* 1 = inlogning stopped *> 3208 <* 2 = max terminals inloged *> 3209 <* 3 = unknown user id *> 3210 <* 4 = wrong password *> 3211 <* 5 = terminal limit (illegal terminal group) *> 3212 <* 6 = user blocked *> 3213 <* 7 = terminal blocked *> 3214 <* 8 = max sessions exceeded *> 3215 <* 9 = login time exceeded *> 3216 <* 10 = no resources *> 3217 <* 11 = unknown terminal *> 3218 <* 12 = main consol *> 3219 <* *> 3220 <*--------------------------------------------------------------------------*> 3221 integer login_user,last_time; 3222 integer array user_id,term_id; 3223 integer password1,password2; 3224 3224 begin 3225 integer check,group,i,count; 3226 real time; 3227 integer array id(1:8); 3228 3228 trap(alarm); 3229 check:=0; <* Bruger OK *> 3230 if not find_term(term_id) then 3231 begin <* Find default terminal *> 3232 integer array default(1:4); 3233 3233 default(1):=<:def:> shift (-24) extract 24; 3234 default(2):=<:aul:> shift (-24) extract 24; 3235 default(3):=<:t:> shift (-24) extract 24; 3236 default(4):=0; 3237 if not find_term(default) then 3238 check:=11; 3239 end; 3240 if sessions>=max_sessions then 3241 check:=8; 3242 if check=0 then 3243 begin 3244 group:=termcat.term_entry(7) extract 12; 3245 if group>=login_stat then 3246 check:=1 3247 else 3248 if max_terms<=terms then 3249 check:=2 3250 else 3251 if not find_user(user_id) then 3252 begin 3253 if max_term_block>0 then 3254 termcat.term_entry(6):=termcat.term_entry(6)+1; 3255 check:=3; 3256 end 3257 else 3258 if not ((usercat.user_entry(6)=password1) and 3259 (usercat.user_entry(7)=password2)) then 3260 begin 3261 check:=4; 3262 if ((password1<>0) or (password2<>0)) and (max_user_block>0) then 3263 usercat.user_entry(11):=usercat.user_entry(11)+1; 3264 end 3265 else 3266 if (usercat.user_entry(11) extract 12)<max_user_block or 3267 max_user_block=0 then 3268 usercat.user_entry(11):= 3269 (usercat.user_entry(11) shift (-12)) shift 12; 3270 end; 3271 if check=0 then 3272 begin 3273 i:=group//24; 3274 group:=23-(group mod 24); 3275 if not (false add (usercat.user_entry(19+i) shift (-group))) then 3276 begin 3277 check:=5; 3278 if max_term_block>0 then 3279 termcat.term_entry(6):=termcat.term_entry(6)+1; 3280 end 3281 else 3282 if (termcat.term_entry(6) extract 12)<max_term_block or 3283 max_term_block=0 then 3284 termcat.term_entry(6):= 3285 (termcat.term_entry(6) shift (-12)) shift 12; 3286 end; 3287 if check=0 then 3288 begin 3289 login_user:=find_login_user(user_id,user_list); 3290 if login_user>0 then 3291 begin 3292 if false add (login_struc(login_user+5) extract 1) then 3293 check:=1 3294 else 3295 begin 3296 group:=login_struc(login_user+4); 3297 count:=0; 3298 for i:=-12 step (-1) until (-21) do 3299 if false add (group shift i) then 3300 count:=count+1; 3301 if count>=(usercat.user_entry(12) shift (-12)) then 3302 check:=8; 3303 end; 3304 end; 3305 end; 3306 if check=0 then 3307 begin <* test inlognings tid *> 3308 if login_user>0 then 3309 begin <* test i login_struc *> 3310 last_time:=login_struc(login_user+4) extract 12; 3311 if timecheck_stat and (last_time=26 or last_time=27 or last_time=0) then 3312 check:=9; 3313 end 3314 else <* test i katalog *> 3315 if not check_time(last_time) then 3316 check:=9 3317 end; 3318 for i:=1 step 1 until 4 do 3319 id(i):=logor((32 shift 16 + 32 shift 8 + 32),user_id(i)); 3320 for i:=5 step 1 until 8 do 3321 id(i):=term_id(i-4); 3322 i:=1; 3323 if ((usercat.user_entry(11) extract 12)>=max_user_block) and 3324 (max_user_block>0) then 3325 begin 3326 check:=6; 3327 if ((usercat.user_entry(11) extract 12) mod 5=max_user_block) then 3328 begin 3329 write_message(63,1,true,<:Max. user block reached:>); 3330 write_message(63,usercat.user_entry(11) extract 12,true, 3331 string id.laf(increase(i))); 3332 end; 3333 end 3334 else 3335 if ((termcat.term_entry(6) extract 12)>=max_term_block) and 3336 (max_term_block>0) then 3337 begin 3338 check:=7; 3339 if ((termcat.term_entry(6) extract 12) mod 5=max_term_block) then 3340 begin 3341 write_message(63,2,true,<:Max. terminal block reached:>); 3342 write_message(63,termcat.term_entry(6) extract 12,true, 3343 string id.laf(increase(i))); 3344 end; 3345 end; 3346 write_user_seg; 3347 write_term_seg; 3348 check_user:=check; 3349 if false then 3350 alarm: disable traped(63); 3351 end; 3352 3352 boolean procedure check_time(time_last); 3353 <* 64 *> 3354 <*----------------------------------------------------------------------*> 3355 <* Check inlognings tidspunktet for bruger angivet i aktuelt user_entry *> 3356 <* *> 3357 <* time_last (ret) : sidste indlognings tid for bruger eller 25 hvis *> 3358 <* der ikke er sat grænse *> 3359 <* Return : True hvis ok, False hvis ikke ok *> 3360 <*----------------------------------------------------------------------*> 3361 integer time_last; 3362 begin 3363 boolean field day; 3364 integer time_type,time_first,time_cur,new_time_last; 3365 real time; 3366 3366 trap(alarm); 3367 systime(1,0,time); 3368 day:=(round((time/86400)-0.5) mod 7)+15; 3369 time_type:=usercat.user_entry.day extract 2; 3370 time_first:=(usercat.user_entry.day shift (-7)) extract 5; 3371 time_last:=(usercat.user_entry.day shift (-2)) extract 5; 3372 check_time:=false; 3373 time_cur:=cur_time; 3374 if time_type<>0 then 3375 begin 3376 if time_cur<time_first then 3377 begin 3378 day:=day-1; 3379 if day<15 then 3380 day:=21; 3381 new_time_last:=(usercat.user_entry.day shift (-2)) extract 5; 3382 if (usercat.user_entry.day extract 2 = 2) and 3383 (time_cur<new_time_last) then 3384 begin 3385 if new_time_last<time_first then 3386 time_last:=new_time_last; 3387 check_time:=true; 3388 end; 3389 end 3390 else 3391 if (time_type=3) or 3392 (time_last>24) or 3393 (time_first=0 and time_last=24) then 3394 begin 3395 time_last:=25; 3396 check_time:=true; 3397 end 3398 else 3399 if (time_type=2) then 3400 begin 3401 time_last:=time_last+100; 3402 check_time:=true; 3403 end 3404 else 3405 if (time_type=1) and 3406 (time_cur>=time_first) and 3407 (time_cur<time_last) then 3408 check_time:=true; 3409 end 3410 else 3411 time_last:=0; 3412 if not timecheck_stat then 3413 check_time:=true; 3414 if false then 3415 alarm: disable traped(64); 3416 end; 3417 3417 procedure mess_to_term(term_index,text_buf); 3418 <* 65 *> 3419 <*--------------------------------------------------------------------------*> 3420 <* Sæt markering i login structure at tekst skal udskrives *> 3421 <* Ved kald skal struc_sema være 'sat' *> 3422 <* *> 3423 <* term_index (call): Index i login_struc på terminal *> 3424 <* text_buf (call) : Nummeret på tekst buffer der skal skrives fra *> 3425 <*--------------------------------------------------------------------------*> 3426 integer term_index; 3427 integer text_buf; 3428 begin 3429 trap(alarm); 3430 login_struc(term_index+1):=logor(loginstruc(term_index+1), 3431 1 shift (text_buf+20) ); 3432 if false then 3433 alarm: disable traped(65); 3434 end; 3435 3435 integer procedure set_text_buf(text); 3436 <* 65.1 *> 3437 <*--------------------------------------------------------------------------*> 3438 <* Sæt text i buffer i tasterm. *> 3439 <* *> 3440 <* text (call) : Teksten der skal sættes *> 3441 <* Return : Nummeret på den buffer teksten er sat i eller 0 hvis *> 3442 <* der ingen ledig buffer er *> 3443 <*--------------------------------------------------------------------------*> 3444 integer array text; 3445 begin 3446 zone tasterm(40,1,stderror); 3447 integer array ia(1:20),term_id(1:4); 3448 integer i,hw,term_type,nr; 3449 3449 trap(alarm); 3450 hw:=text(0) shift (-12)+4; 3451 nr:=0; 3452 for i:=1,2,3 do 3453 if text_buf_reserved(i)=0 then 3454 nr:=i; 3455 if hw<=148 and nr>0 then 3456 begin 3457 tasterm.iaf(1):=(7 shift 16) + (7 shift 8) +7; 3458 tasterm.iaf(2):=10; 3459 for i:=3 step 1 until (hw//2) do 3460 tasterm.iaf(i):=text(i-2); 3461 text_buf_reserved(nr):=-1; 3462 open(tasterm,0,tasterm_name,1 shift 9); <* Imp. passivate *> 3463 getzone6(tasterm,ia); 3464 ia(1):=11 shift 12 +0; 3465 ia(2):=ia(19)+1; 3466 ia(3):=ia(2)+hw-2; 3467 ia(4):=nr; 3468 send_mess(tasterm,ia); 3469 i:=monitor(18,tasterm,1,ia); 3470 if i<>1 then 3471 begin 3472 text_buf_reserved(nr):=0; 3473 nr:=0; 3474 end; 3475 end; 3476 set_text_buf:=nr; 3477 if false then 3478 alarm: disable traped(651); 3479 end; 3480 3480 procedure send_message_text(nr); 3481 <* 65.2 *> 3482 <*------------------------------------------*> 3483 <* Signalerer til write_term_text korutinen *> 3484 <* at der er tekst til udskrift *> 3485 <*------------------------------------------*> 3486 integer nr; 3487 begin 3488 integer array ref(1:1); 3489 3489 trap(alarm); 3490 initref(ref); 3491 wait_select:=8; 3492 wait(message_buf_pool,ref); 3493 ref(3):=nr; 3494 signal(text_write_sem,ref); 3495 if false then 3496 alarm: disable traped(652); 3497 end; 3498 3498 boolean procedure check_user_priv(priv,result); 3499 <* 66 *> 3500 <*-------------------------------------------------------------------*> 3501 <* Test om bruger givet i copy_buf er kendt, har korrekt password og *> 3502 <* har det angivne privilegie *> 3503 <* *> 3504 <* priv (call) : Privilegie der testes for (0 til 4) *> 3505 <* result (ret) : 0 = Ok *> 3506 <* 1 = Ukendt bruger *> 3507 <* 2 = Forkert password *> 3508 <* 3 = Privilegie ikke opfyldt *> 3509 <* Return : True hvis result=0 ellers false *> 3510 <* Er result=0 er user_entry sat til fundet bruger *> 3511 <*-------------------------------------------------------------------*> 3512 integer priv,result; 3513 begin 3514 trap(alarm); 3515 result:=1; 3516 if find_user(copy_buf.iaf) then 3517 begin <* Bruger fundet *> 3518 result:=2; 3519 if (copy_buf.iaf(5)=usercat.user_entry(6)) and 3520 (copy_buf.iaf(6)=usercat.user_entry(7)) then 3521 begin <* password ok *> 3522 result:=if false add (usercat.user_entry(12) shift (priv-11)) then 3523 0 <* privilegie ok *> 3524 else 3525 3; <* Privilegie ikke sat *> 3526 end; 3527 end; 3528 check_user_priv:=result=0; 3529 if false then 3530 alarm: disable traped(66); 3531 end; 3532 3532 procedure catco; 3533 <* 67 *> 3534 <*---------------------------------------*> 3535 <* Hoved procedure for catalog korutinen *> 3536 <*---------------------------------------*> 3537 begin 3538 zone dummy_zone(1,1,stderror); 3539 integer operation, 3540 mode, 3541 i; 3542 3542 <***********************************> 3543 <* Procedure til katalog korutinen *> 3544 <***********************************> 3545 3545 procedure attention; 3546 <* 68 *> 3547 <*---------------------------------------------------------------------*> 3548 <* Start en ny operatør korutine hvis der er attention fra ny terminal *> 3549 <*---------------------------------------------------------------------*> 3550 begin 3551 integer i,head_consol; 3552 integer array ref(1:1); 3553 boolean found; 3554 integer array sender_name(1:4); 3555 3555 trap(alarm); 3556 i:=4; 3557 answer(9):=1; 3558 found:=false; 3559 while (not found) and (i<(number_of_opera+4)) do 3560 begin 3561 found:=opera_terms(i,1)=mess.sender_pda; 3562 i:=i+1; 3563 end; 3564 system(5,mess.sender_pda,sender_name); 3565 if sender_name(1)=0 then 3566 begin 3567 answer(9):=2; 3568 found:=true; 3569 end; 3570 if not found then 3571 begin <* Ny terminal *> 3572 get_proc_name(mess.sender_pda,sender_name); 3573 i:=if (sender_name.laf(1)=head_term_name.laf(1)) and 3574 (sender_name.laf(2)=head_term_name.laf(2)) then 3575 4 else 5; 3576 head_consol:=i-4; 3577 while (not found) and (i<(number_of_opera+4)) do 3578 begin 3579 found:=opera_terms(i,1)=0; 3580 i:=i+1; 3581 end; 3582 if found then 3583 begin <* Ventende operatør korutine er fundet *> 3584 opera_terms(i-1,1):=mess.sender_pda; 3585 initref(ref); 3586 wait_select:=6; 3587 wait(message_buf_pool,ref); 3588 ref(3):=head_consol; 3589 signal(opera_terms(i-1,2),ref); 3590 answer(9):=1; <* Operatør er startet *> 3591 end 3592 else 3593 begin 3594 answer(9):=2; <* Ikke flere operatør rutiner *> 3595 end; 3596 end; 3597 if false then 3598 alarm: disable traped(68); 3599 end; 3600 3600 procedure get_segments; 3601 <* 69 *> 3602 <*--------------------------------------------------*> 3603 <* Hent segmenter fra katalogerne til bruger proces *> 3604 <*--------------------------------------------------*> 3605 begin 3606 integer seg,cat,i,size; 3607 3607 trap(alarm); 3608 seg:=mess.mess_array(4); 3609 cat:=mess.mess_array(5); 3610 if (cat<1) or (cat>3) then 3611 answer(1):=1 shift 22 <* error; illegal katalog type *> 3612 else 3613 begin 3614 if data_to_copy_buf(6,mess.buf_addr,answer)=0 then 3615 begin <* data kopieret *> 3616 if check_user_priv(1,answer(1)) then 3617 begin <* operatør ok *> 3618 case cat of 3619 begin 3620 begin <* bruger katalog *> 3621 if usercat_size>seg then 3622 begin 3623 size:=usercat_size; 3624 find_user_seg(seg); 3625 for i:=1 step 1 until 128 do 3626 copy_buf(i):=usercat(i); 3627 end 3628 else 3629 answer(1):=1 shift 18; <* end of catalog *> 3630 end; 3631 begin <* terminal katalog *> 3632 if termcat_size>seg then 3633 begin 3634 size:=termcat_size; 3635 find_term_seg(seg); 3636 for i:=1 step 1 until 128 do 3637 copy_buf(i):=termcat(i); 3638 end 3639 else 3640 answer(1):=1 shift 18; <* end of catalog *> 3641 end; 3642 begin <* type katalog *> 3643 if typecat_size>seg then 3644 begin 3645 size:=typecat_size; 3646 setposition(typecat,0,seg); 3647 write_type_seg; 3648 for i:=1 step 1 until 128 do 3649 copy_buf(i):=typecat(i); 3650 end 3651 else 3652 answer(1):=1 shift 18; <* end of catalog *> 3653 end; 3654 end; <* case *> 3655 if answer(1)=0 then 3656 begin 3657 answer(1):=if data_from_copy_buf(256,mess.buf_addr,answer)<>0 then 3658 1 shift 23 <* fejl i kopiering *> 3659 else 3660 0; <* alt ok *> 3661 answer(4):=size; 3662 end; 3663 end 3664 else 3665 if answer(1)=3 then 3666 answer(1):=1 shift 11 <* ingen privilegie *> 3667 else 3668 answer(1):=1 shift 10; <* illegal bruger (operatør) *> 3669 end 3670 else 3671 answer(1):=1 shift 23; <* bruger proces stoppet *> 3672 end; 3673 answer(9):=1; 3674 if false then 3675 alarm: disable traped(69); 3676 end; 3677 3677 3677 procedure tasterm_mess; 3678 <* 70 *> 3679 <*-------------------------------*> 3680 <* Behandling af message fra TAS *> 3681 <*-------------------------------*> 3682 begin 3683 <******************************> 3684 <* Procedure til tasterm_mess *> 3685 <******************************> 3686 3686 procedure sign_on; 3687 <* 71 *> 3688 <*------------------------------------------------*> 3689 <* Undersøg inlognings muligheden og hvis ok *> 3690 <* dan signon tekst til brug for TAS *> 3691 <*------------------------------------------------*> 3692 begin 3693 integer term_type,width,pos,date_width; 3694 integer array term_id(1:4); 3695 long array date_text(1:6); 3696 boolean term_found,def; 3697 3697 trap(alarm); 3698 def:=false; 3699 get_proc_name(mess.mess_array(4),term_id); 3700 if (term_id.laf(1)=head_term_name.laf(1)) and 3701 (term_id.laf(2)=head_term_name.laf(2)) then 3702 <* Hovedkonsollen *> 3703 answer(1):=12 3704 else 3705 if terms<max_terms then 3706 begin <* Ikke maximalt antal terminaler tilmeldt *> 3707 answer(1):=11; 3708 if get_proc_name(mess.mess_array(4),term_id) then 3709 begin <* terminal id fundet *> 3710 term_found:=find_term(term_id); 3711 if not term_found then 3712 begin <* Find default terminal *> 3713 integer array default(1:4); 3714 3714 default(1):=<:def:> shift (-24) extract 24; 3715 default(2):=<:aul:> shift (-24) extract 24; 3716 default(3):=<:t:> shift (-24) extract 24; 3717 default(4):=0; 3718 def:=true; 3719 term_found:=find_term(default); 3720 end; 3721 if term_found then 3722 begin <* Terminal kendt i katalog *> 3723 if (termcat.term_entry(7) extract 12)>=login_stat then 3724 answer(1):=1; 3725 term_type:=termcat.term_entry(6) shift (-12); 3726 if answer(1)<>1 and find_type_entry(term_type) then 3727 begin 3728 if typecat.type_entry(1)>0 then 3729 begin <* Term type fundet i katalog *> 3730 width:=typecat.type_entry(3) shift (-12); 3731 date_width:=date(date_text); 3732 copy_buf.iaf(1):=((termcat.term_entry(7) shift (-12)) 3733 shift 12)+term_type; 3734 <* sæt signon text i copy_buf *> 3735 pos:=7; <* Første tegn i copy_buf i position 7 *> 3736 laf:=56; 3737 <* Sæt init data i tekst *> 3738 put_text(copy_buf,pos,char_table,typecat.type_entry.laf,-75); 3739 laf:=0; 3740 <* Sæt signon tekst *> 3741 put_char(copy_buf,pos,10,2); 3742 put_char(copy_buf,pos,32,(width-(host_id(0) extract 12))//2); 3743 put_text(copy_buf,pos,host_id.laf,host_id(0) extract 12); 3744 put_char(copy_buf,pos,10,2); 3745 put_char(copy_buf,pos,32,(width-date_width)//2); 3746 put_text(copy_buf,pos,date_text,date_width); 3747 put_char(copy_buf,pos,10,2); 3748 put_text(copy_buf,pos,signon_text.laf, 3749 signon_text(0) extract 12); 3750 put_char(copy_buf,pos,10,2); 3751 if def then 3752 begin 3753 puttext(copy_buf,pos,<:<10>Terminal :>,10); 3754 puttext(copy_buf,pos,term_id.laf,-12); 3755 puttext(copy_buf,pos,<: er ikke i katalog<10>:>,19); 3756 end; 3757 copy_buf.iaf(2):=(2*((pos-5)//3+1) shift 12) + (pos-7); 3758 put_char(copy_buf,pos,0,3); 3759 <* Kopier data til TAS *> 3760 if data_from_copy_buf(152,mess.buf_addr,answer)<>0 then 3761 write_message(71,1,true,string c_p ); 3762 answer(1):=0; 3763 end; 3764 end; 3765 end; 3766 end; 3767 end 3768 else 3769 answer(1):=2; 3770 if false then 3771 alarm: disable traped(71); 3772 end; 3773 3773 procedure include_user; 3774 <* 72 *> 3775 <*---------------------------------*> 3776 <* Inkluder ny bruger og terminal *> 3777 <*---------------------------------*> 3778 begin 3779 integer user_index,term_index,sess_index,last_time,i,ui; 3780 integer array user_id,term_id(1:4); 3781 integer array struc_ref(1:1); 3782 boolean term_found; 3783 3783 procedure init_term; 3784 <* 73 *> 3785 <* initialiser term i login_struc *> 3786 begin 3787 login_struc(term_index):=copy_buf.iaf(1); 3788 <* bemærk: term_entry sat af find_term *> 3789 login_struc(term_index+1):= 3790 (1 shift 13)+(termcat.term_entry(6) shift (-12)); 3791 login_struc(term_index+2):=sess_index; 3792 login_struc(term_index+3):=login_struc(user_index+6); 3793 login_struc(user_index+6):=term_index; 3794 terms:=terms+1; 3795 end; 3796 3796 3796 procedure init_sess; 3797 <* 74 *> 3798 <* initialiser sess i login_struc *> 3799 begin 3800 login_struc(sess_index):=copy_buf.iaf(2); 3801 ui:=0; 3802 while false add (login_struc(user_index+4) shift (-ui-12)) do 3803 ui:=ui+1; 3804 <* Sæt ny userindex bit *> 3805 login_struc(user_index+4):=login_struc(user_index+4)+(1 shift (12+ui)); 3806 login_struc(sess_index+1):=(1 shift 12)+ui; <* session 1, user-index ui *> 3807 login_struc(sess_index+2):=0; 3808 login_struc(sess_index+3):=0; 3809 sessions:=sessions+1; 3810 end; 3811 3811 3811 trap(alarm); 3812 initref(struc_ref); 3813 wait(struc_sema,struc_ref); 3814 answer(1):=0; 3815 user_index:=term_index:=sess_index:=0; 3816 if data_to_copy_buf(8,mess.buf_addr,answer)=0 then 3817 begin <* Data kopieret *> 3818 if answer(2)=16 then 3819 begin <* alt kopieret *> 3820 answer(1):=0; 3821 for i:=1 step 1 until 4 do 3822 user_id(i):=copy_buf.iaf(i+2); 3823 if get_proc_name(copy_buf.iaf(1),term_id) then 3824 begin <* Terminal navn fundet *> 3825 term_found:=find_term(term_id); 3826 if not term_found then 3827 begin <* Find default terminal *> 3828 integer array default(1:4); 3829 default(1):=<:def:> shift (-24) extract 24; 3830 default(2):=<:aul:> shift (-24) extract 24; 3831 default(3):=<:t:> shift (-24) extract 24; 3832 default(4):=0; 3833 term_found:=find_term(default); 3834 end; 3835 if term_found then 3836 begin <* Terminal fundet i katalog *> 3837 answer(1):=check_user(user_index,last_time, 3838 user_id,term_id,copy_buf.iaf(7),copy_buf.iaf(8)); 3839 if answer(1)=0 then 3840 begin <* user ok *> 3841 if user_index=0 then 3842 begin <* Ny bruger *> 3843 term_index:=sess_index:=0; 3844 user_index:=get_free_login(4); 3845 if user_index>0 then 3846 begin 3847 term_index:=user_index+8; 3848 sess_index:=user_index+12; 3849 end 3850 else 3851 begin 3852 user_index:=get_free_login(2); 3853 if user_index>0 then 3854 begin 3855 term_index:=get_free_login(2); 3856 if term_index>0 then 3857 sess_index:=term_index+4 3858 else 3859 begin 3860 term_index:=get_free_login(1); 3861 if term_index>0 then 3862 sess_index:=get_free_login(1); 3863 end; 3864 end; 3865 end; 3866 if term_index=0 then 3867 begin 3868 release_block(user_index); 3869 release_block(user_index+4); 3870 user_index:=0; 3871 end 3872 else 3873 if sess_index=0 then 3874 begin 3875 release_block(user_index); 3876 release_block(user_index+4); 3877 release_block(term_index); 3878 user_index:=term_index:=0; 3879 end; 3880 if user_index>0 then 3881 begin <* Initialiser ny user, term og sess *> 3882 for i:=1 step 1 until 4 do 3883 login_struc(user_index+i-1):=user_id(i); 3884 login_struc(user_index+4):=last_time; 3885 <* bemærk: user_entry sat af check_user *> 3886 login_struc(user_index+5):=usercat.user_entry(12) shift 12; 3887 login_struc(user_index+6):=0; 3888 <* indsæt ny user først i user liste *> 3889 login_struc(user_index+7):=user_list; 3890 user_list:=user_index; 3891 init_term; 3892 init_sess; 3893 users:=users+1; 3894 end; 3895 end <* Ny bruger indsat, hvis user_index>0 *> 3896 else 3897 begin <* Bruger kendt, ny terminal og session *> 3898 term_index:=get_free_login(2); 3899 if term_index>0 then 3900 sess_index:=term_index+4 3901 else 3902 begin 3903 term_index:=get_free_login(1); 3904 if term_index>0 then 3905 sess_index:=get_free_login(1); 3906 end; 3907 if sess_index=0 then 3908 begin 3909 release_block(term_index); 3910 term_index:=0; 3911 end; 3912 if term_index>0 then 3913 begin <* Initialiser term og sess *> 3914 init_term; 3915 init_sess; 3916 end; 3917 end; <* Ny terminal og session indsat, hvis term_index>0 *> 3918 end; <* user ok *> 3919 end <* terminal navn fundet *> 3920 else <* pda ukendt *> 3921 answer(1):=11; 3922 end 3923 else <* terminal ukendt *> 3924 answer(1):=11; 3925 if answer(1)=0 then 3926 begin 3927 if (user_index>0) and (term_index>0) then 3928 begin 3929 copy_buf.iaf(1):=user_index; 3930 for i:=2 step 1 until 7 do 3931 copy_buf.iaf(i):=usercat.user_entry(i+11); 3932 copy_buf.iaf(8):=1; 3933 copy_buf.iaf(9):=(4 shift 12)+1; 3934 copy_buf.iaf(10):=(ui+48) shift 16; 3935 copy_buf.iaf(11):=(4 shift 12)+1; 3936 copy_buf.iaf(12):=49 shift 16; 3937 for i:=13 step 1 until 40 do 3938 copy_buf.iaf(i):=usercat.user_entry(i+10); 3939 if data_from_copy_buf(40,mess.buf_addr,answer)<>0 then 3940 write_message(74,1,true,string c_p ); 3941 answer(1):=0; 3942 end 3943 else 3944 answer(1):=10; 3945 end; 3946 end <* alt kopiret *> 3947 else 3948 answer(9):=3; 3949 end <* data kopieret *> 3950 else 3951 write_message(74,2,true,string c_p ); 3952 signal(struc_sema,struc_ref); 3953 if false then 3954 alarm: disable traped(74); 3955 end; 3956 3956 procedure start_sess; 3957 <* 75 *> 3958 <*--------------------------------------------------*> 3959 <* Start en ny session hos kendt bruger og terminal *> 3960 <*--------------------------------------------------*> 3961 begin 3962 integer user_index,term_index,sess_index,i,ui,sess_nr,map,count; 3963 integer array user_id(1:4); 3964 integer array struc_ref(1:1); 3965 3965 trap(alarm); 3966 initref(struc_ref); 3967 wait(struc_sema,struc_ref); 3968 user_index:=term_index:=sess_index:=0; 3969 if data_to_copy_buf(3,mess.buf_addr,answer)=0 then 3970 begin <* data kopieret *> 3971 if answer(2)=6 then 3972 begin 3973 answer(1):=0; 3974 user_index:=copy_buf.iaf(3); 3975 if (user_index>0) and (user_index<=(4*struc_size-7)) then 3976 begin 3977 for i:=1 step 1 until 4 do 3978 user_id(i):=login_struc(user_index+i-1); 3979 if find_user(user_id) then 3980 begin <* bruger kendt *> 3981 if (login_stat>0) and not (false add login_struc(user_index+5)) then 3982 begin <* bruger login ok *> 3983 map:=login_struc(user_index+4) shift (-12); 3984 count:=0; 3985 for i:=0 step (-1) until (-9) do 3986 if false add (map shift i) then 3987 count:=count+1; 3988 if (count<(usercat.user_entry(12) shift (-12))) and 3989 (sessions<max_sessions) then 3990 begin <* ledige sessioner *> 3991 if cur_time<(login_struc(user_index+4) extract 12) then 3992 begin <* tid ok *> 3993 term_index:=find_user_terminal(copy_buf.iaf(1), 3994 login_struc(user_index+6)); 3995 if term_index>0 then 3996 begin <* terminal kendt *> 3997 sess_index:=get_free_login(1); 3998 if sess_index>0 then 3999 begin <* resourcer ok *> 4000 login_struc(sess_index+3):=login_struc(term_index+2); 4001 login_struc(term_index+2):=sess_index; 4002 login_struc(sess_index):=copy_buf.iaf(2); 4003 login_struc(sess_index+2):=0; 4004 ui:=0; 4005 while false add 4006 (login_struc(user_index+4) shift (-ui-12)) do 4007 ui:=ui+1; 4008 <* Sæt ny userindex bit *> 4009 login_struc(user_index+4):= 4010 login_struc(user_index+4)+(1 shift (12+ui)); 4011 sess_nr:=1; 4012 sessions:=sessions+1; 4013 while false add (login_struc(term_index+1) shift 4014 (-sess_nr-12)) do 4015 sess_nr:=sess_nr+1; 4016 <* Sæt ny sessions nummer bit *> 4017 login_struc(term_index+1):= 4018 login_struc(term_index+1)+(1 shift (12+sess_nr)); 4019 login_struc(sess_index+1):= 4020 (sess_nr shift 12)+ui; <* session nr, user-index *> 4021 end <* initialiser *> 4022 else 4023 answer(1):=10; 4024 end 4025 else 4026 answer(1):=11; 4027 end 4028 else 4029 answer(1):=9; 4030 end 4031 else 4032 answer(1):=8; 4033 end 4034 else 4035 answer(1):=1; 4036 end 4037 else 4038 answer(1):=3; 4039 end 4040 else 4041 answer(1):=3; 4042 if answer(1)=0 then 4043 begin 4044 <* sæt returdata i copy_buf *> 4045 copy_buf.iaf(1):=user_index; 4046 for i:=2 step 1 until 7 do 4047 copy_buf.iaf(i):=usercat.user_entry(i+11); 4048 copy_buf.iaf(8):=sess_nr; 4049 copy_buf.iaf(9):=(4 shift 12)+1; 4050 copy_buf.iaf(10):=(ui+48) shift 16; 4051 copy_buf.iaf(11):=(4 shift 12)+1; 4052 copy_buf.iaf(12):=(sess_nr+48) shift 16; 4053 for i:=13 step 1 until 40 do 4054 copy_buf.iaf(i):=usercat.user_entry(i+10); 4055 if data_from_copy_buf(40,mess.buf_addr,answer)<>0 then 4056 write_message(75,1,true,string c_p ); 4057 answer(1):=0; 4058 end; 4059 end 4060 else 4061 answer(9):=3; 4062 end 4063 else 4064 write_message(75,2,true,string c_p ); 4065 signal(struc_sema,struc_ref); 4066 if false then 4067 alarm: disable traped(75); 4068 end; 4069 4069 procedure end_sess; 4070 <* 76 *> 4071 <*-------------------------------------------------------------------------*> 4072 <* Nedlæg en sessions beskrivelse *> 4073 <* Er det sidste session på terminalen, nedlægges terminal beskrivelsen *> 4074 <* Er det sidste terminal på bruger, nedlægges bruger beskrivelsen *> 4075 <*-------------------------------------------------------------------------*> 4076 begin 4077 integer user_index,term_index,sess_index; 4078 integer prev_user_index,prev_term_index,prev_sess_index; 4079 integer next_user_index; 4080 integer array struc_ref(1:1); 4081 boolean found; 4082 4082 trap(alarm); 4083 initref(struc_ref); 4084 wait(struc_sema,struc_ref); 4085 user_index:=mess.mess_array(4); 4086 if (user_index>0) and (user_index<=(4*struc_size-7)) then 4087 begin 4088 found:=false; 4089 prev_term_index:=0; 4090 term_index:=login_struc(user_index+6); 4091 while term_index>0 and not found do 4092 begin <* find terminal beskrivelse *> 4093 if login_struc(term_index)=mess.mess_array(2) then 4094 found:=true 4095 else 4096 begin 4097 prev_term_index:=term_index; 4098 term_index:=login_struc(term_index+3); 4099 end; 4100 end; 4101 if found then 4102 begin <* terminal fundet *> 4103 found:=false; 4104 prev_sess_index:=0; 4105 sess_index:=login_struc(term_index+2); 4106 while sess_index>0 and not found do 4107 begin <* find sessions beskrivelse *> 4108 if login_struc(sess_index)=mess.mess_array(3) then 4109 found:=true 4110 else 4111 begin 4112 prev_sess_index:=sess_index; 4113 sess_index:=login_struc(sess_index+3); 4114 end; 4115 end; 4116 if found then 4117 begin <* session fundet *> 4118 if (prev_sess_index=0) and (login_struc(sess_index+3)=0) then 4119 begin <* sidste session på denne terminal *> 4120 if (prev_term_index=0) and (login_struc(term_index+3)=0) then 4121 begin <* sidste terminal for denne bruger *> 4122 <* nedlæg bruger *> 4123 prev_user_index:=0; 4124 next_user_index:=user_list; 4125 while user_index<>next_user_index do 4126 begin 4127 prev_user_index:=next_user_index; 4128 next_user_index:=login_struc(next_user_index+7); 4129 end; 4130 if prev_user_index=0 then 4131 user_list:=login_struc(user_index+7) 4132 else 4133 login_struc(prev_user_index+7):=login_struc(user_index+7); 4134 release_block(user_index); 4135 release_block(user_index+4); 4136 release_block(term_index); 4137 release_block(sess_index); 4138 terms:=terms-1; 4139 users:=users-1; 4140 sessions:=sessions-1; 4141 answer(1):=2; 4142 end 4143 else 4144 begin 4145 <* nedlæg terminal *> 4146 <* nulstil userindex bit for session i map *> 4147 login_struc(user_index+4):=login_struc(user_index+4) - 4148 (1 shift ((login_struc(sess_index+1) extract 12)+12)); 4149 if prev_term_index=0 then 4150 login_struc(user_index+6):=login_struc(term_index+3) 4151 else 4152 login_struc(prev_term_index+3):=login_struc(term_index+3); 4153 release_block(term_index); 4154 release_block(sess_index); 4155 terms:=terms-1; 4156 sessions:=sessions-1; 4157 answer(1):=1; 4158 end; 4159 end 4160 else 4161 begin 4162 <* nedlæg session *> 4163 <* nulstil userindex bit for session i map *> 4164 login_struc(user_index+4):=login_struc(user_index+4) - 4165 (1 shift ((login_struc(sess_index+1) extract 12)+12)); 4166 <* nulstil sessions nr bit for session i map *> 4167 login_struc(term_index+1):=login_struc(term_index+1) - 4168 (1 shift ((login_struc(sess_index+1) shift (-12))+12)); 4169 if prev_sess_index=0 then 4170 login_struc(term_index+2):=login_struc(sess_index+3) 4171 else 4172 login_struc(prev_sess_index+3):=login_struc(sess_index+3); 4173 release_block(sess_index); 4174 sessions:=sessions-1; 4175 answer(1):=0; 4176 end; 4177 end 4178 else 4179 answer(1):=3; <* session ikke fundet *> 4180 end 4181 else 4182 answer(1):=3; <* terminal ikke fundet *> 4183 end 4184 else 4185 answer(1):=3; <* Ukendt bruger *> 4186 signal(struc_sema,struc_ref); 4187 if false then 4188 alarm: disable traped(76); 4189 end; 4190 4190 procedure modify_pass; 4191 <* 77 *> 4192 <*--------------------------------------*> 4193 <* Sæt nyt password for inlogget bruger *> 4194 <*--------------------------------------*> 4195 begin 4196 integer user_index; 4197 integer array field user_id; 4198 integer array struc_ref(1:1); 4199 4199 trap(alarm); 4200 initref(struc_ref); 4201 wait(struc_sema,struc_ref); 4202 if data_to_copy_buf(5,mess.buf_addr,answer)=0 then 4203 begin <* data læst *> 4204 if answer(2)=10 then 4205 begin <* al data læst *> 4206 answer(1):=1; 4207 user_index:=copy_buf.iaf(1); 4208 if (user_index>0) and (user_index<=(4*struc_size-7)) then 4209 begin <* User ident ok *> 4210 user_id:=(user_index-1)*2; 4211 if find_user(login_struc.user_id) then 4212 begin <* bruger fundet i katalog *> 4213 if (usercat.user_entry(6)=copy_buf.iaf(2)) and 4214 (usercat.user_entry(7)=copy_buf.iaf(3)) then 4215 begin <* old password ok *> 4216 usercat.user_entry(6):=copy_buf.iaf(4); 4217 usercat.user_entry(7):=copy_buf.iaf(5); 4218 usercat.user_entry(61):=usercat.user_entry(61)+1; 4219 write_user_seg; 4220 answer(1):=0; 4221 end; 4222 end; 4223 end; 4224 end 4225 else 4226 answer(9):=3; 4227 end 4228 else 4229 write_message(77,3,true,string c_p ); 4230 signal(struc_sema,struc_ref); 4231 if false then 4232 alarm: disable traped(77); 4233 end; 4234 4234 procedure get_term_data; 4235 <* 78 *> 4236 <*---------------------------------*> 4237 <* Hent terminal type data til TAS *> 4238 <*---------------------------------*> 4239 begin 4240 integer i; 4241 4241 trap(alarm); 4242 answer(1):=1; 4243 if find_type_entry(mess.mess_array(4)) then 4244 begin 4245 if typecat.type_entry(1)>0 then 4246 begin <* type entry fundet *> 4247 for i:=1 step 1 until 53 do <* Kopier data *> 4248 copy_buf.iaf(i):=typecat.type_entry(i); 4249 if data_from_copy_buf(53,mess.buf_addr,answer)<>0 then 4250 write_message(78,1,true,string c_p ); 4251 answer(1):=0; 4252 end; 4253 end; 4254 if false then 4255 alarm: disable traped (78); 4256 end; 4257 4257 <**************************************> 4258 <* Hoveddel af procedure tasterm_mess *> 4259 <**************************************> 4260 trap(alarm); 4261 if (mode<2) or (mode>7) or (mess.sender_pda<>tasterm_pda) then 4262 <* Ukendt mode i message eller illegal sender *> 4263 answer(9):=3 4264 else 4265 begin 4266 answer(9):=1; 4267 case mode-1 of 4268 begin 4269 sign_on; 4270 include_user; 4271 start_sess; 4272 end_sess; 4273 modify_pass; 4274 get_term_data; 4275 end; 4276 end; 4277 if false then 4278 alarm: disable traped(70); 4279 end; 4280 4280 procedure modify_entry; 4281 <* 79 *> 4282 <*-----------------------------------------------*> 4283 <* Behandling af modify_entry message fra bruger *> 4284 <*-----------------------------------------------*> 4285 begin 4286 4286 procedure modify_user_entry; 4287 <* 80 *> 4288 <*------------------------------------------------*> 4289 <* Hent, sæt eller modifiser data i brugerkatalog *> 4290 <*------------------------------------------------*> 4291 begin 4292 integer array field user_id,liaf; 4293 boolean user_exist; 4294 integer func,i; 4295 4295 trap(alarm); 4296 user_id:=12; 4297 func:=mess.mess_array(4)+1; 4298 if (func<1) or (func>4) then 4299 answer(9):=3 4300 else 4301 begin 4302 if data_to_copy_buf((case func of (10,66,66,10)), 4303 mess.buf_addr,answer)=0 then 4304 begin <* data kopieret *> 4305 if check_user_priv(1,answer(1)) then 4306 begin <* operatør ok *> 4307 user_exist:=find_user(copy_buf.user_id); 4308 liaf:=10; 4309 case func of 4310 begin 4311 <* Get data *> 4312 if user_exist then 4313 begin 4314 for i:=2 step 1 until 61 do 4315 copy_buf.liaf(i):=usercat.user_entry(i); 4316 answer(1):=if data_from_copy_buf(66,mess.buf_addr,answer)=0 then 4317 0 <* ok *> 4318 else 4319 8; <* process stopped *> 4320 end 4321 else 4322 answer(1):=2; <* entry not found *> 4323 <* Modify data *> 4324 if user_exist then 4325 begin 4326 if find_login_user(copy_buf.user_id,user_list)=0 then 4327 begin <* bruger er ikke logget ind *> 4328 if copy_buf.liaf(61)=usercat.user_entry(61) then 4329 begin <* time stamp's ens *> 4330 for i:=2 step 1 until 60 do 4331 usercat.user_entry(i):=copy_buf.liaf(i); 4332 <* sæt ny time stamp *> 4333 usercat.user_entry(61):=usercat.user_entry(61)+1; 4334 write_user_seg; 4335 answer(1):=0; 4336 end 4337 else 4338 answer(1):=7; <* Data changed since last get-data *> 4339 end 4340 else 4341 answer(1):=1; <* entry in use *> 4342 end 4343 else 4344 answer(1):=2; <* entry not found *> 4345 <* Set new data *> 4346 if not user_exist then 4347 begin 4348 if find_empty_user_entry( 4349 calc_hash(copy_buf.user_id,usercat_size)) then 4350 begin <* tomt entry fundet *> 4351 for i:=2 step 1 until 60 do 4352 usercat.user_entry(i):=copy_buf.liaf(i); 4353 <* sæt ny time stamp *> 4354 usercat.user_entry(61):=0; 4355 write_user_seg; 4356 answer(1):=0; 4357 end 4358 else 4359 answer(1):=6; <* catalog full *> 4360 end 4361 else 4362 answer(1):=3; <* entry exist *> 4363 <* Delete data *> 4364 if user_exist then 4365 begin 4366 if find_login_user(copy_buf.user_id,user_list)=0 then 4367 begin <* bruger ikke logget ind *> 4368 usercat.user_entry(1):=0; 4369 setstate(usercat,6); 4370 find_user_seg(calc_hash(copy_buf.user_id,usercat_size)); 4371 user_entry:=0; 4372 <* nedtæl hash-nøgle tæller *> 4373 usercat.user_entry(1):=usercat.user_entry(1)-1; 4374 write_user_seg; 4375 answer(1):=0; 4376 end 4377 else 4378 answer(1):=1; <* entry in use *> 4379 end 4380 else 4381 answer(1):=2; <* entry not found *> 4382 end; 4383 end 4384 else 4385 answer(1):=if answer(1)=3 then 4386 4 <* ingen privilegie *> 4387 else 4388 13; <* illegal bruger (operatør) *> 4389 end 4390 else 4391 answer(1):=8; <* bruger proces stoppet *> 4392 end; 4393 if false then 4394 alarm: disable traped(80); 4395 end; 4396 4396 procedure modify_term_entry; 4397 <* 81 *> 4398 <*--------------------------------------------------*> 4399 <* Hent, sæt eller modificer data i terminalkatalog *> 4400 <*--------------------------------------------------*> 4401 begin 4402 integer array field term_id,liaf; 4403 boolean term_exist; 4404 integer func,i; 4405 4405 trap(alarm); 4406 term_id:=12; 4407 func:=mess.mess_array(4)+1; 4408 if (func<1) or (func>4) then 4409 answer(9):=3 4410 else 4411 begin 4412 if data_to_copy_buf((case func of (10,23,23,10)), 4413 mess.buf_addr,answer)=0 then 4414 begin <* data kopieret *> 4415 if check_user_priv(1,answer(1)) then 4416 begin <* operatør ok *> 4417 term_exist:=find_term(copy_buf.term_id); 4418 liaf:=10; 4419 case func of 4420 begin 4421 <* Get data *> 4422 if term_exist then 4423 begin 4424 for i:=2 step 1 until 18 do 4425 copy_buf.liaf(i):=termcat.term_entry(i); 4426 answer(1):=if data_from_copy_buf(23,mess.buf_addr,answer)=0 then 4427 0 <* ok *> 4428 else 4429 8; <* process stopped *> 4430 end 4431 else 4432 answer(1):=2; <* entry not found *> 4433 <* Modify data *> 4434 if term_exist then 4435 begin 4436 if not check_term(copy_buf.term_id) then 4437 begin <* terminal ikke logget ind *> 4438 if copy_buf.liaf(18)=termcat.term_entry(18) then 4439 begin <* time stamp's ens *> 4440 for i:=2 step 1 until 17 do 4441 termcat.term_entry(i):=copy_buf.liaf(i); 4442 <* sæt ny time stamp *> 4443 termcat.term_entry(18):=termcat.term_entry(18)+1; 4444 write_term_seg; 4445 answer(1):=0; 4446 end 4447 else 4448 answer(1):=7; <* Data changed since last get-data *> 4449 end 4450 else 4451 answer(1):=1; <* entry in use *> 4452 end 4453 else 4454 answer(1):=2; <* entry not found *> 4455 <* Set new data *> 4456 if not term_exist then 4457 begin 4458 if find_empty_term_entry( 4459 calc_hash(copy_buf.term_id,termcat_size)) then 4460 begin <* tomt entry fundet *> 4461 for i:=2 step 1 until 17 do 4462 termcat.term_entry(i):=copy_buf.liaf(i); 4463 <* sæt ny time stamp *> 4464 termcat.term_entry(18):=0; 4465 write_term_seg; 4466 answer(1):=0; 4467 end 4468 else 4469 answer(1):=6; <* catalog full *> 4470 end 4471 else 4472 answer(1):=3; <* entry exist *> 4473 <* Delete data *> 4474 if term_exist then 4475 begin 4476 if not check_term(copy_buf.term_id) then 4477 begin <* terminal ikke logget ind *> 4478 termcat.term_entry(1):=0; 4479 setstate(termcat,6); 4480 find_term_seg(calc_hash(copy_buf.term_id,termcat_size)); 4481 term_entry:=0; 4482 <* nedtæl hash-nøgle tæller *> 4483 termcat.term_entry(1):=termcat.term_entry(1)-1; 4484 write_term_seg; 4485 answer(1):=0; 4486 end 4487 else 4488 answer(1):=1; <* entry in use *> 4489 end 4490 else 4491 answer(1):=2; <* entry not found *> 4492 end; 4493 end 4494 else 4495 answer(1):=if answer(1)=3 then 4496 4 <* ingen privilegie *> 4497 else 4498 13; <* illegal bruger (operatør) *> 4499 end 4500 else 4501 answer(1):=8; <* bruger proces stoppet *> 4502 end; 4503 if false then 4504 alarm: disable traped(81); 4505 end; 4506 4506 procedure modify_type_entry; 4507 <* 82 *> 4508 <*----------------------------------------------*> 4509 <* Hent, sæt eller modificer data i typekatalog *> 4510 <*----------------------------------------------*> 4511 begin 4512 integer array field liaf; 4513 boolean type_exist; 4514 integer func,i; 4515 integer field type_nr; 4516 4516 trap(alarm); 4517 type_nr:=14; 4518 func:=mess.mess_array(4)+1; 4519 if (func<1) or (func>4) then 4520 answer(9):=3 4521 else 4522 begin 4523 if data_to_copy_buf((case func of (7,70,70,7)), 4524 mess.buf_addr,answer)=0 then 4525 begin <* data kopieret *> 4526 if check_user_priv(1,answer(1)) then 4527 begin <* operatør ok *> 4528 type_exist:=false; 4529 if find_type_entry(copy_buf.type_nr) then 4530 type_exist:=typecat.type_entry(1)<>0; 4531 liaf:=12; 4532 case func of 4533 begin 4534 <* Get data *> 4535 if type_exist then 4536 begin 4537 for i:=1 step 1 until 64 do 4538 copy_buf.liaf(i):=typecat.type_entry(i); 4539 answer(1):=if data_from_copy_buf(70,mess.buf_addr,answer)=0 then 4540 0 <* ok *> 4541 else 4542 8; <* process stopped *> 4543 end 4544 else 4545 answer(1):=2; <* entry not found *> 4546 <* Modify data *> 4547 if type_exist then 4548 begin 4549 if not check_type(copy_buf.type_nr) then 4550 begin <* type er ikke i login terminaler *> 4551 if copy_buf.liaf(64)=typecat.type_entry(64) then 4552 begin <* time stamp's ens *> 4553 for i:=1 step 1 until 63 do 4554 typecat.type_entry(i):=copy_buf.liaf(i); 4555 <* sæt ny time stamp *> 4556 typecat.type_entry(64):=typecat.type_entry(64)+1; 4557 write_type_seg; 4558 answer(1):=0; 4559 end 4560 else 4561 answer(1):=7; <* Data changed since last get-data *> 4562 end 4563 else 4564 answer(1):=1; <* entry in use *> 4565 end 4566 else 4567 answer(1):=2; <* entry not found *> 4568 <* Set new data *> 4569 if not type_exist then 4570 begin 4571 if find_type_entry(copy_buf.type_nr) then 4572 begin <* tomt entry fundet *> 4573 for i:=1 step 1 until 63 do 4574 typecat.type_entry(i):=copy_buf.liaf(i); 4575 <* sæt ny time stamp *> 4576 typecat.type_entry(64):=0; 4577 write_type_seg; 4578 answer(1):=0; 4579 end 4580 else 4581 answer(1):=6; <* illegal type *> 4582 end 4583 else 4584 answer(1):=3; <* entry exist *> 4585 <* Delete data *> 4586 if type_exist then 4587 begin 4588 if not check_type(copy_buf.type_nr) then 4589 begin <* type benyttes ikke i indlogget terminal *> 4590 typecat.type_entry(1):=0; 4591 write_type_seg; 4592 answer(1):=0; 4593 end 4594 else 4595 answer(1):=1; <* entry in use *> 4596 end 4597 else 4598 answer(1):=2; <* entry not found *> 4599 end; 4600 answer(4):=(typecat_size-1)*(512//type_entry_length); 4601 end 4602 else 4603 answer(1):=if answer(1)=3 then 4604 4 <* ingen privilegie *> 4605 else 4606 13; <* illegal bruger (operatør) *> 4607 end 4608 else 4609 answer(1):=8; <* bruger proces stoppet *> 4610 end; 4611 if false then 4612 alarm: disable traped(82); 4613 end; 4614 4614 <*****************************> 4615 <* Hoved del af modify_entry *> 4616 <*****************************> 4617 trap(alarm); 4618 if (mode<1) or (mode>3) then 4619 answer(9):=3 4620 else 4621 begin 4622 answer(9):=1; 4623 case mode of 4624 begin 4625 modify_user_entry; 4626 modify_term_entry; 4627 modify_type_entry; 4628 end; 4629 end; 4630 if false then 4631 alarm: disable traped(79); 4632 end; 4633 4633 procedure send_text; 4634 <* 83 *> 4635 <*--------------------------------------------------------------------*> 4636 <* Behandling af message fra bruger, med tekst til udskrift på anden *> 4637 <* terminal tilknyttet TAS *> 4638 <*--------------------------------------------------------------------*> 4639 begin 4640 integer array id(1:4); 4641 integer i,user_index,term_index,t,nr; 4642 integer array field liaf; 4643 integer array struc_ref(1:1); 4644 4644 trap(alarm); 4645 initref(struc_ref); 4646 answer(9):=1; 4647 if data_to_copy_buf(256,mess.buf_addr,answer)=0 then 4648 begin <* data kopieret *> 4649 if check_user_priv(3,answer(1)) then 4650 begin <* operatør ok *> 4651 liaf:=14; 4652 t:=0; 4653 answer(1):=0; 4654 for i:=1 step 1 until 4 do 4655 id(i):=mess.mess_array(i+3); 4656 if id(1)<>0 then 4657 begin 4658 user_index:=find_login_user(id,user_list); 4659 if user_index>0 then 4660 begin 4661 nr:=set_text_buf(copy_buf.liaf); 4662 if nr>0 then 4663 begin 4664 term_index:=login_struc(user_index+6); 4665 wait(struc_sema,struc_ref); 4666 while term_index>0 do 4667 begin 4668 mess_to_term(term_index,nr); 4669 t:=t+1; 4670 term_index:=login_struc(term_index+3); 4671 end; 4672 signal(struc_sema,struc_ref); 4673 send_message_text(nr); 4674 end 4675 else 4676 answer(1):=4; 4677 end 4678 else 4679 answer(1):=1; 4680 end 4681 else 4682 begin 4683 nr:=set_text_buf(copy_buf.liaf); 4684 if nr>0 then 4685 begin 4686 wait(struc_sema,struc_ref); 4687 user_index:=user_list; 4688 while user_index>0 do 4689 begin 4690 term_index:=login_struc(user_index+6); 4691 while term_index>0 do 4692 begin 4693 mess_to_term(term_index,nr); 4694 t:=t+1; 4695 term_index:=login_struc(term_index+3); 4696 end; 4697 user_index:=login_struc(user_index+7); 4698 end; 4699 signal(struc_sema,struc_ref); 4700 send_message_text(nr); 4701 end 4702 else 4703 answer(1):=4; 4704 end; 4705 answer(4):=t; 4706 end 4707 else 4708 answer(1):=if answer(1)=3 then 4709 2 4710 else 4711 13; 4712 end 4713 else 4714 answer(1):=3; 4715 if false then 4716 alarm: disable traped(83); 4717 end; 4718 4718 procedure move_mcl; 4719 <* 84 *> 4720 <*-------------------------------------------------------*> 4721 <* Behandling af message til flytning af cmcl programmer *> 4722 <*-------------------------------------------------------*> 4723 begin 4724 integer array ia(1:17),name(1:4),user_bases(1:2); 4725 zone z(1,1,stderror); 4726 integer i,result; 4727 4727 trap(alarm); 4728 if (mode<0) or (mode>2) then 4729 answer(9):=3 <* error; illegal mode *> 4730 else 4731 begin 4732 answer(9):=1; 4733 if data_to_copy_buf(12,mess.buf_addr,answer)=0 then 4734 begin <* data kopieret *> 4735 if check_user_priv(2,result) then 4736 begin <* operatør ok *> 4737 result:=0; 4738 for i:=1 step 1 until 4 do 4739 name(i):=copy_buf.iaf(i+6); 4740 open(z,0,name,0); 4741 user_bases(1):=copy_buf.iaf(11); 4742 user_bases(2):=copy_buf.iaf(12); 4743 if mode=0 then 4744 begin <* Lookup file *> 4745 set_cat_bases(cmcl_bases); 4746 if monitor(42,z,0,ia)<>0 or 4747 ia(9)<>(29 shift 12) then 4748 result:=1 4749 else 4750 begin 4751 for i:=2,3,4,5 do 4752 copy_buf.iaf(i+5):=ia(i); 4753 copy_buf.iaf(11):=ia(6); 4754 copy_buf.iaf(12):=ia(10); 4755 result:=if data_from_copy_buf(12,mess.buf_addr,answer)=0 then 4756 result 4757 else 4758 8; 4759 end; 4760 end 4761 else 4762 if mode=1 then 4763 begin <* move to tascat *> 4764 set_cat_bases(user_bases); 4765 i:=monitor(76,z,0,ia); 4766 if monitor(76,z,0,ia)=0 then 4767 begin 4768 if (ia(8)>0) and 4769 (ia(16) shift (-12) = 29) and 4770 (ia(1) extract 3 = 3) then 4771 begin 4772 result:=monitor(74,z,0,cmcl_bases); 4773 if result=7 then 4774 result:=2; 4775 end 4776 else 4777 result:=9; 4778 end 4779 else 4780 result:=1; 4781 end 4782 else 4783 if mode=2 then 4784 begin <* move to user *> 4785 set_cat_bases(cmcl_bases); 4786 if monitor(42,z,0,ia)=0 then 4787 begin 4788 result:=monitor(74,z,0,user_bases); 4789 if result=7 then 4790 result:=2; 4791 end 4792 else 4793 result:=1; 4794 end; 4795 answer(1):=result; 4796 answer(4):=cmcl_bases(1); 4797 answer(5):=cmcl_bases(2); 4798 set_cat_bases(sys_bases); 4799 end 4800 else 4801 answer(1):=if result=3 then 4802 7 <* ingen privilegie *> 4803 else 4804 13; <* illegal bruger (operatør) *> 4805 end 4806 else 4807 answer(1):=8; <* bruger proces stoppet *> 4808 end; 4809 if false then 4810 alarm: disable traped(84); 4811 end; 4812 4812 <**********************************> 4813 <* Hoved del af catalog korutinen *> 4814 <**********************************> 4815 trap(alarm); 4816 claim(600); <* Reserver plads på stakken *> 4817 <* Hent buffer til message *> 4818 initref(mess); 4819 wait_select:=22; 4820 wait(message_buf_pool,mess); 4821 <* sæt den i wait message pool *> 4822 signal(wait_message_pool,mess); 4823 while true do 4824 begin 4825 <* vent på næste message til TASCAT *> 4826 <* Der behandles kun 1 mess af gangen *> 4827 wait_time:=0; 4828 wait_select:=0; 4829 wait(wait_message,mess); 4830 for i:=1 step 1 until 8 do 4831 answer(i):=0; 4832 answer(9):=3; 4833 operation:=mess.mess_array(1) shift (-12); 4834 mode:=mess.mess_array(1) extract 12; 4835 if false add trace_type then 4836 trace(61,1,operation,mode); 4837 if operation=0 then 4838 attention 4839 else 4840 if operation=3 then 4841 get_segments 4842 else 4843 if operation=9 then 4844 tasterm_mess 4845 else 4846 if operation=11 then 4847 modify_entry 4848 else 4849 if operation=13 then 4850 send_text 4851 else 4852 if operation=15 then 4853 move_mcl; 4854 <* send answer sat af procedure der behandlede message *> 4855 <* answer(9) er sat til answer-result, mens answer(1) *> 4856 <* til answer(8) indeholder svaret (hvis answer(9)=1) *> 4857 monitor(22,dummy_zone,mess.buf_addr,answer); 4858 <* sæt besked buffer i pool så der kan ventes på næste message *> 4859 signal(wait_message_pool,mess); 4860 end; 4861 if false then 4862 alarm: disable traped(67); 4863 end; 4864 4864 <***********************************************> 4865 <***********************************************> 4866 <* Hoved procedurerne for operatør korutinerne *> 4867 <***********************************************> 4868 <***********************************************> 4869 4869 procedure operator(cor_nr); 4870 <* 85 *> 4871 <*------------------------------------------*> 4872 <* Hoved procedure for operator korutinerne *> 4873 <* *> 4874 <* cor_nr (call) : Denne korutines nummer *> 4875 <*------------------------------------------*> 4876 value cor_nr; 4877 integer cor_nr; 4878 begin 4879 zone term_in(13,1,in_error), 4880 term_out(13,1,out_error); 4881 integer i, 4882 head_consol, 4883 buf, 4884 command_value, 4885 command_keyword, 4886 user_ident; 4887 boolean priv, 4888 break, 4889 finis, 4890 out_stop; 4891 integer array term_name(1:4), 4892 command_name(1:4), 4893 ref(1:1), 4894 ia(1:20), 4895 user_id(1:4); 4896 long password; 4897 4897 <**************************************> 4898 <**************************************> 4899 <* Operatør korutine hjælpe procedure *> 4900 <**************************************> 4901 <**************************************> 4902 4902 4902 4902 boolean procedure read_param(term_in,text_param,num_param); 4903 <* 86 *> 4904 <*--------------------------------------------------------------------------*> 4905 <* Læs en parameter fra input fra terminal *> 4906 <* *> 4907 <* text_param (ret) : Den læste parameter (max 11 tegn) konverteret til *> 4908 <* små bogstaver og efterstillet med nul *> 4909 <* num_par (ret) : Den læste parameter omregnet til integer *> 4910 <* Return : True = parameter læst til text_param og num_param *> 4911 <* False = ikke flere parametre (retur param. nulstillet)*> 4912 <*--------------------------------------------------------------------------*> 4913 zone term_in; 4914 integer num_param; 4915 integer array text_param; 4916 begin 4917 integer text_pos,char_class,ch; 4918 long array field laf; 4919 boolean neg; 4920 4920 trap(alarm); 4921 neg:=false; 4922 char_class:=7; 4923 while char_class=7 do 4924 char_class:=readchar(term_in,ch); 4925 laf:=0; 4926 text_pos:=1; 4927 num_param:=0; 4928 text_param.laf(1):=text_param.laf(2):=0; 4929 if (ch=0) or (char_class>=8) then 4930 read_param:=false 4931 else 4932 begin 4933 read_param:=true; 4934 if ch='-' then 4935 neg:=true; 4936 while char_class<7 do 4937 begin 4938 num_param:=if char_class=2 then 4939 (num_param*10)+(ch-48) 4940 else 4941 0; 4942 if (text_pos<12) and (char_class>1) then 4943 put_char(text_param.laf,text_pos,ch); 4944 char_class:=readchar(term_in,ch); 4945 end; 4946 end; 4947 if neg then 4948 num_param:= -num_param; 4949 repeatchar(term_in); 4950 if false then 4951 alarm: disable traped(86); 4952 end; 4953 4953 procedure out_error(z,s,b); 4954 <* 87 *> 4955 <*--------------------------------------------------------------*> 4956 <* Blok procedure for zonen term_out *> 4957 <* Sæt out_stop true hvis der sættes attention status på output *> 4958 <* Sæt break ved fejl *> 4959 <*--------------------------------------------------------------*> 4960 zone z; 4961 integer s,b; 4962 begin 4963 out_stop:=true; 4964 if not (false add (s shift (-16))) then 4965 begin 4966 <* Ikke attention status men give_up eller error *> 4967 break:=true; 4968 b:=0; 4969 end; 4970 end; 4971 4971 procedure in_error(z,s,b); 4972 <* 88 *> 4973 <*-------------------------------------*> 4974 <* Blok procedure for zonen term_in *> 4975 <* Sæt break ved fejl og returner da *> 4976 <* 'em' i input *> 4977 <*-------------------------------------*> 4978 zone z; 4979 integer s,b; 4980 begin 4981 <* Give_up eller error *> 4982 break:=true; 4983 b:=2; 4984 z(1):= real <:<'em'><'em'><'em'>:>; 4985 end; 4986 4986 procedure show_sess(sess_index); 4987 <* 89 *> 4988 <*---------------------------------------------------------------------*> 4989 <* Udskriv en linie på skærmen indeholde data for den angivne sesseion *> 4990 <* *> 4991 <* sess_index (call) : Index i login_struc for sessionen *> 4992 <*---------------------------------------------------------------------*> 4993 integer sess_index; 4994 begin 4995 begin 4996 zone tasterm(1,1,stderror); 4997 integer array ia(1:8),name(1:4); 4998 integer buf; 4999 boolean ok; 5000 5000 trap(alarm); 5001 ok:=false; 5002 open(tasterm,0,tasterm_name,1 shift 9); 5003 ia(1):=12 shift 12 + 0; 5004 ia(2):=login_struc(sess_index); 5005 buf:=send_mess(tasterm,ia); 5006 if wait_ans(tasterm,buf,100,opera_terms(cor_nr,2),true) then 5007 begin 5008 if monitor(18,tasterm,1,ia)=1 then 5009 begin 5010 if ia(1)=0 then 5011 begin 5012 name(1):=ia(5); 5013 name(2):=ia(6); 5014 name(3):=name(4):=0; 5015 write(term_out,<:Id =:>,true,6,name.laf, 5016 <: Index=:>,<<d>, 5017 login_struc(sess_index+1) extract 12); 5018 if ia(2)>0 then 5019 begin 5020 get_proc_name(ia(2),name); 5021 write(term_out,<: Sess.Term=:>,true,11,name.laf); 5022 end 5023 else 5024 write(term_out," ",23); 5025 if ia(3)>0 then 5026 begin 5027 get_proc_name(ia(3),name); 5028 write(term_out,<: User=:>,true,11,name.laf); 5029 end 5030 else 5031 write(term_out," ",18); 5032 if false add login_struc(sess_index+2) then 5033 write(term_out,<: Removing:>) 5034 else 5035 begin 5036 write(term_out,if false add (ia(4) shift (-1)) then 5037 <: :> else <: Active:>); 5038 write(term_out,if false add ia(4) then 5039 <: Direct:> else <::>); 5040 end; 5041 ok:=true; 5042 end; 5043 end; 5044 end; 5045 if not ok then 5046 write(term_out,string c_p ,<:<10>:>); 5047 if false then 5048 alarm: disable traped(89); 5049 end; 5050 end; 5051 5051 procedure show_term(user_index,term_index); 5052 <* 90 *> 5053 <*---------------------------------------------------------------*> 5054 <* Udskriv oplysninger om en inlogget terminal og dens sessioner *> 5055 <* *> 5056 <* user_index (call) : Index i login_struc til den user *> 5057 <* der benytter terminalen *> 5058 <* term_index (call) : Index i login_struc til ønsket terminal *> 5059 <*---------------------------------------------------------------*> 5060 integer user_index,term_index; 5061 begin 5062 begin 5063 integer array user_id,term_id(1:4); 5064 integer i,sess_index; 5065 5065 trap(alarm); 5066 for i:=1 step 1 until 4 do 5067 user_id(i):=login_struc(user_index-1+i); 5068 get_proc_name(login_struc(term_index),term_id); 5069 i:=login_struc(user_index+4) extract 12; 5070 write(term_out,<:<10>User=:>,true,11,user_id.laf, 5071 <: Terminal =:>,true,11,term_id.laf, 5072 <: Logout :>); 5073 if i>=100 then 5074 i:=i-100; 5075 if i=25 then 5076 write(term_out,<:disabled for user:>) 5077 else 5078 if timecheck_stat then 5079 begin 5080 write(term_out,if i>25 or i=0 then 5081 <:now:> else <:time :>); 5082 if i<25 and i>0 then 5083 write(term_out,<<dd>,i); 5084 end 5085 else 5086 begin 5087 write(term_out,<:disabled (:>); 5088 if i>25 or i=0 then 5089 write(term_out,<:now):>) 5090 else 5091 write(term_out,<<dd>,i,<:):>); 5092 end; 5093 write(term_out,<:<10>:>); 5094 sess_index:=login_struc(term_index+2); 5095 while sess_index>0 do 5096 begin 5097 show_sess(sess_index); 5098 write(term_out,<:<10>:>); 5099 sess_index:=login_struc(sess_index+3); 5100 end; 5101 if false then 5102 alarm: disable traped(90); 5103 end; 5104 end; 5105 5105 boolean procedure check_priv(priv_nr); 5106 <* 91 *> 5107 <*--------------------------------------------------------*> 5108 <* Check privilegie for bruger, udskriv fejl hvis ikke ok *> 5109 <* *> 5110 <* priv_nr (call) : Privilegie nummeret der checkes *> 5111 <*--------------------------------------------------------*> 5112 integer priv_nr; 5113 begin 5114 trap(alarm); 5115 if false add ((priv extract 12) shift (priv_nr-11)) then 5116 check_priv:=true 5117 else 5118 begin 5119 check_priv:=false; 5120 write(term_out,<:*** no privilege<10>:>); 5121 end; 5122 if false then 5123 alarm: disable traped(91); 5124 end; 5125 5125 5125 procedure opr_finis; 5126 <* 92 *> 5127 <*-------------------------------------------*> 5128 <* Stop udførelsen af operatør kommandoer og *> 5129 <* send continue message til terminal hvis *> 5130 <* denne ikke er hovedterminalen *> 5131 <*-------------------------------------------*> 5132 begin 5133 5133 trap(alarm); 5134 write(term_out,<:Operator finis<10>:>); 5135 finis:=true; 5136 setposition(term_out,0,0); 5137 if cor_nr<>4 then 5138 begin 5139 <* Send continue message til terminal *> 5140 ia(1):=128 shift 12 + 0; 5141 ia(2):=0; 5142 ia(3):=8 shift 12 + 8; 5143 ia(4):=<:ope:> shift (-24) extract 24; 5144 ia(5):=<:rat:> shift (-24) extract 24; 5145 ia(6):=<:or:> shift (-24) extract 24; 5146 buf:=send_mess(term_in,ia); 5147 wait_ans(term_in,buf,100,opera_terms(cor_nr,2),true); 5148 end; 5149 if false then 5150 alarm: disable traped(92); 5151 end; 5152 5152 procedure opr_disp; 5153 <* 93 *> 5154 <*---------------------------------------------------*> 5155 <* Udskriv oplysninger om bruger / terminal / system *> 5156 <*---------------------------------------------------*> 5157 begin 5158 zone tasterm(1,1,stderror); 5159 long array text(1:6); 5160 integer user_index,term_index; 5161 integer array ia(1:8); 5162 integer array struc_ref(1:1); 5163 boolean ok; 5164 5164 trap(alarm); 5165 initref(struc_ref); 5166 if read_param(term_in,command_name,0) then 5167 begin 5168 command_keyword:=find_keyword_value(command_name.laf(1),1); 5169 if command_keyword=8 then 5170 begin <* terminal *> 5171 if check_priv(4) then 5172 begin 5173 wait(struc_sema,struc_ref); 5174 if read_param(term_in,command_name,0) then 5175 begin 5176 term_index:=find_login_terminal(command_name,user_index); 5177 if term_index>0 then 5178 show_term(user_index,term_index) 5179 else 5180 write(term_out,string t_n_l); 5181 end 5182 else 5183 opr_terminal; 5184 signal(struc_sema,struc_ref); 5185 end; 5186 end 5187 else 5188 if command_keyword=9 or command_keyword=18 then 5189 begin <* user *> 5190 if check_priv(4) then 5191 begin 5192 wait(struc_sema,struc_ref); 5193 if read_param(term_in,command_name,0) then 5194 begin 5195 user_index:=find_login_user(command_name,user_list); 5196 if user_index>0 then 5197 begin 5198 term_index:=login_struc(user_index+6); 5199 while term_index>0 and not out_stop do 5200 begin 5201 show_term(user_index,term_index); 5202 term_index:=login_struc(term_index+3); 5203 end; 5204 end 5205 else 5206 write(term_out,string u_n_l); 5207 end 5208 else 5209 opr_user; 5210 signal(struc_sema,struc_ref); 5211 end; 5212 end 5213 else 5214 if command_keyword=15 then 5215 begin <* system *> 5216 if system_stop then 5217 write(term_out,<:<10>System is stopping:>); 5218 write(term_out,<:<10>--- Sign on ---:>); 5219 write(term_out,<:<10>:>,host_id.laf); 5220 date(text); 5221 write(term_out,<:<10>:>,text); 5222 write(term_out,<:<10>:>,signon_text.laf); 5223 write(term_out,<:<10>--- Status ---:>); 5224 write(term_out,<< dddd >,<:<10>Users : :>,users, 5225 <:Free::>,maxterminals-terms); 5226 write(term_out,<< dddd >,<:<10>Terminals : :>,terms, 5227 <:Max ::>,max_terms); 5228 write(term_out,<< dddd >,<:<10>Sessions : :>,sessions); 5229 write(term_out,<:<10>Timecheck : :>,if timecheck_stat then 5230 <:activ:> 5231 else 5232 <:passiv:>, 5233 <:<10>Login : :>); 5234 if login_stat=96 then 5235 write(term_out,<:enabled:>) 5236 else 5237 if login_stat=0 then 5238 write(term_out,<:disabled:>) 5239 else 5240 write(term_out,<:disabled from terminal group :>,login_stat); 5241 write(term_out,<:<10><10>--- Release dates ---:>); 5242 write(term_out,<:<10>Tasterm : :>,<<dddddd >, 5243 tastermverd,tastermvert); 5244 write(term_out,<:<10>Tascat : :>,<<dddddd >,reld,relt); 5245 write(term_out,<:<10>Init : :>,<<dddddd >,initver); 5246 end 5247 else 5248 if command_keyword=19 then 5249 begin <* Resources *> 5250 ok:=false; 5251 open(tasterm,0,tasterm_name,1 shift 9); 5252 ia(1):=18 shift 12; 5253 if wait_ans(tasterm,send_mess(tasterm,ia), 5254 100,operaterms(cor_nr,2),true) then 5255 begin 5256 if monitor(18,tasterm,1,ia)=1 then 5257 begin 5258 ok:=true; 5259 write(term_out,<:<10>Resource Maximum:>, 5260 <: Used % Used<10>:>, 5261 <:<10>Create pools :>, 5262 <<dddd >,cps,cps-ia(1), 5263 <<ddd>,if cps=0 then 0 else (cps-ia(1))/cps*100, 5264 <:<10>Create links :>, 5265 <<dddd >,cls,ia(2), 5266 <<ddd>,if cls=0 then 0 else ia(2)/cls*100, 5267 <:<10>Sessions :>, 5268 <<dddd >,maxsessions,sessions, 5269 <<ddd>,sessions/maxsessions*100, 5270 <:<10>Terminals :>, 5271 <<dddd >,maxterminals,terms, 5272 <<ddd>,terms/maxterminals*100, 5273 <:<10>Users :>, 5274 <<dddd >,maxusers,users, 5275 <<ddd>,users/maxusers*100, 5276 <:<10>System menues :>, 5277 <<dddd >,maxsysmenu,ia(3), 5278 <<ddd>,ia(3)/maxsysmenu*100, 5279 <:<10>Terminal types :>, 5280 <<dddd >,termtypes,termtypes-ia(6), 5281 <<ddd>,(termtypes-ia(6))/termtypes*100, 5282 <:<10>Mcl programs :>, 5283 <<dddd >,mclprogs,mclprogs-ia(5), 5284 <<ddd>,(mclprogs-ia(5))/mclprogs*100, 5285 <:<10>Core buffers :>, 5286 <<dddd >,corebufs,corebufs-ia(4), 5287 <<ddd>,(corebufs-ia(4))/corebufs*100, 5288 <:<10>Spool segments :>, 5289 <<dddd >,ia(7),ia(7)-ia(8), 5290 <<ddd>,(ia(7)-ia(8))/ia(7)*100); 5291 end; 5292 end; 5293 if not ok then 5294 write(term_out,string c_p,<:<10>:>); 5295 end 5296 else 5297 write(term_out,string ill_par,command_name.laf); 5298 end 5299 else 5300 write(term_out,string miss_par); 5301 write(term_out,<:<10>:>); 5302 if false then 5303 alarm: disable traped(93); 5304 end; 5305 5305 procedure opr_message; 5306 <* 94 *> 5307 <*---------------------------------------------------*> 5308 <* Send meddelelser til bruger og terminal *> 5309 <*---------------------------------------------------*> 5310 begin 5311 long array text(0:34); 5312 integer i,t,user_index,term_index,nr; 5313 integer array struc_ref(1:1); 5314 5314 boolean procedure read_term_text(text); 5315 <* 95 *> 5316 <*--------------------------------------------------------------*> 5317 <* Læs tekst fra terminal til text i mcl-format *> 5318 <* prompt for hver linie. Afslut ved '.' først på linie *> 5319 <* *> 5320 <* text (ret) : Den læste tekst i mcl-format *> 5321 <* Return : True = Tekst læst, False = Fejl ved læsning *> 5322 <*--------------------------------------------------------------*> 5323 long array text; 5324 begin 5325 long array line(1:14); 5326 integer i,pos; 5327 5327 trap(alarm); 5328 pos:=1; 5329 repeat 5330 i:=read_line(line); 5331 if i>0 then 5332 i:=put_txt(text,pos,line,i); 5333 until i<1; 5334 if i=0 then 5335 begin 5336 put_ch(text,pos,0,3); 5337 put_ch(text,200,0,3); 5338 pos:=pos-4; 5339 text(0):=((((pos+2)//3)*2+1) shift 12) + pos; 5340 read_term_text:=true; 5341 end 5342 else 5343 read_term_text:=false; 5344 if false then 5345 alarm: disable traped(95); 5346 end; 5347 5347 integer procedure read_line(line); 5348 <* 96 *> 5349 <*--------------------------------------------------------------------*> 5350 <* Læs en linie fra terminal *> 5351 <* *> 5352 <* line (ret) : Den læste linie *> 5353 <* Return : Antal tegn læst ink. 'nl' (0 = '.' først på linie) *> 5354 <*--------------------------------------------------------------------*> 5355 long array line; 5356 begin 5357 integer ch,i,pos; 5358 5358 trap(alarm); 5359 write(term_out,<:>:>); 5360 setposition(term_out,0,0); 5361 setposition(term_in,0,0); 5362 pos:=1; 5363 repeat 5364 readchar(term_in,ch); 5365 i:=put_ch(line,pos,ch,1); 5366 until (ch='nl') or (i<1) or (((ch='.') or (ch='/')) and (pos=2)); 5367 if ch='nl' then 5368 read_line:=pos-1 5369 else 5370 if ch='/' then 5371 read_line:=-1 5372 else 5373 read_line:=pos-2; 5374 if false then 5375 alarm: disable traped(96); 5376 end; 5377 5377 trap(alarm); 5378 initref(struc_ref); 5379 if read_param(term_in,command_name,0) then 5380 begin 5381 command_keyword:=find_keyword_value(command_name.laf(1),1); 5382 if command_keyword=16 then 5383 begin <* login *> 5384 if check_priv(0) then 5385 begin 5386 t:=0; 5387 if read_term_text(text) then 5388 begin 5389 nr:=set_text_buf(text.iaf); 5390 if nr>0 then 5391 begin 5392 wait(struc_sema,struc_ref); 5393 user_index:=user_list; 5394 while user_index>0 do 5395 begin 5396 term_index:=login_struc(user_index+6); 5397 while term_index>0 do 5398 begin 5399 mess_to_term(term_index,nr); 5400 t:=t+1; 5401 term_index:=login_struc(term_index+3); 5402 end; 5403 user_index:=login_struc(user_index+7); 5404 end; 5405 signal(struc_sema,struc_ref); 5406 send_message_text(nr); 5407 end 5408 else 5409 write(term_out,<:No free text buffer<10>:>); 5410 end 5411 else 5412 write(term_out,string long_text); 5413 write(term_out,<<d>,<:Message sent to :>,t,<: terminal:>, 5414 if t<>1 then <:s:> else <::>); 5415 end; 5416 end 5417 else 5418 if command_keyword=13 then 5419 begin <* sign on *> 5420 if check_priv(0) then 5421 begin 5422 if read_term_text(text) then 5423 begin 5424 signon_text(0):=text(0) extract 24; 5425 for i:=1 step 1 until 34 do 5426 signon_text.laf(i):=text(i); 5427 end 5428 else 5429 write(term_out,string long_text); 5430 end; 5431 end 5432 else 5433 if command_keyword=12 then 5434 begin <* all *> 5435 if check_priv(0) then 5436 begin 5437 t:=0; 5438 if read_term_text(text) then 5439 begin 5440 signon_text(0):=text(0) extract 24; 5441 for i:=1 step 1 until 34 do 5442 signon_text.laf(i):=text(i); 5443 nr:=set_text_buf(text.iaf); 5444 if nr>0 then 5445 begin 5446 wait(struc_sema,struc_ref); 5447 user_index:=user_list; 5448 while user_index>0 do 5449 begin 5450 term_index:=login_struc(user_index+6); 5451 while term_index>0 do 5452 begin 5453 mess_to_term(term_index,nr); 5454 t:=t+1; 5455 term_index:=login_struc(term_index+3); 5456 end; 5457 user_index:=login_struc(user_index+7); 5458 end; 5459 signal(struc_sema,struc_ref); 5460 send_message_text(nr); 5461 end 5462 else 5463 write(term_out,<:No free text buffer<10>:>); 5464 end 5465 else 5466 write(term_out,string long_text); 5467 write(term_out,<<d>,<:Message sent to :>,t,<: terminal:>, 5468 if t<>1 then <:s:> else <::>); 5469 end; 5470 end 5471 else 5472 if command_keyword=9 then 5473 begin <* user *> 5474 if read_param(term_in,command_name,0) then 5475 begin 5476 if check_priv(3) then 5477 begin 5478 t:=0; 5479 user_index:=find_login_user(command_name,user_list); 5480 if user_index>0 then 5481 begin 5482 if read_term_text(text) then 5483 begin 5484 nr:=set_text_buf(text.iaf); 5485 if nr>0 then 5486 begin 5487 wait(struc_sema,struc_ref); 5488 user_index:=find_login_user(command_name,user_list); 5489 if user_index>0 then 5490 term_index:=login_struc(user_index+6) 5491 else 5492 term_index:=0; 5493 while term_index>0 do 5494 begin 5495 mess_to_term(term_index,nr); 5496 t:=t+1; 5497 term_index:=login_struc(term_index+3); 5498 end; 5499 signal(struc_sema,struc_ref); 5500 send_message_text(nr); 5501 end 5502 else 5503 write(term_out,<:No free text buffer<10>:>); 5504 write(term_out,<<d>,<:Message sent to :>,t,<: terminal:>, 5505 if t<>1 then <:s:> else <::>); 5506 end 5507 else 5508 write(term_out,string long_text); 5509 end 5510 else 5511 write(term_out,string u_n_l); 5512 end; 5513 end 5514 else 5515 write(term_out, string miss_par); 5516 end 5517 else 5518 if command_keyword=8 then 5519 begin <* terminal *> 5520 if read_param(term_in,command_name,0) then 5521 begin 5522 if check_priv(3) then 5523 begin 5524 term_index:=find_login_terminal(command_name,0); 5525 if term_index>0 then 5526 begin 5527 if read_term_text(text) then 5528 begin 5529 nr:=set_text_buf(text.iaf); 5530 if nr>0 then 5531 begin 5532 wait(struc_sema,struc_ref); 5533 term_index:=find_login_terminal(command_name,0); 5534 if term_index>0 then 5535 mess_to_term(term_index,nr); 5536 signal(struc_sema,struc_ref); 5537 send_message_text(nr); 5538 end 5539 else 5540 write(term_out,<:No free text buffer<10>:>); 5541 end 5542 else 5543 write(term_out,string long_text); 5544 end 5545 else 5546 write(term_out,string t_n_l); 5547 end; 5548 end 5549 else 5550 write(term_out, string miss_par); 5551 end 5552 else 5553 write(term_out,string ill_par,command_name.laf); 5554 end 5555 else 5556 write(term_out,string miss_par); 5557 write(term_out,<:<10>:>); 5558 if false then 5559 alarm: disable traped(94); 5560 end; 5561 5561 procedure opr_remove; 5562 <* 97 *> 5563 <*---------------------------------------------------*> 5564 <* Nedlæg session, terminal eller bruger *> 5565 <*---------------------------------------------------*> 5566 begin 5567 integer array user_id,term_id(1:4); 5568 integer index,user_index,term_index,sess_index,t; 5569 integer array struc_ref(1:1); 5570 boolean found; 5571 5571 trap(alarm); 5572 initref(struc_ref); 5573 if read_param(term_in,command_name,0) then 5574 begin 5575 if check_priv(0) then 5576 begin 5577 command_keyword:=find_keyword_value(command_name.laf(1),1); 5578 if command_keyword=14 then 5579 begin <* session *> 5580 if read_param(term_in,user_id,0) and 5581 read_param(term_in,command_name,index) then 5582 begin 5583 wait(struc_sema,struc_ref); 5584 user_index:=find_login_user(user_id,user_list); 5585 if user_index>0 then 5586 begin 5587 if false add (login_struc(user_index+4) shift (-12-index)) then 5588 begin 5589 found:=false; 5590 term_index:=login_struc(user_index+6); 5591 while not found and term_index>0 do 5592 begin 5593 sess_index:=login_struc(term_index+2); 5594 while not found and sess_index>0 do 5595 begin 5596 if (login_struc(sess_index+1) extract 12)=index then 5597 found:=true 5598 else 5599 sess_index:=login_struc(sess_index+3); 5600 end; 5601 term_index:=login_struc(term_index+3); 5602 end; 5603 if not remove_sess(sess_index) then 5604 write(term_out,<:*** session not removed:>); 5605 end 5606 else 5607 write(term_out,<:*** unknow user index:>); 5608 end 5609 else 5610 write(term_out,string u_n_l); 5611 signal(struc_sema,struc_ref); 5612 end 5613 else 5614 write(term_out,string miss_par); 5615 end 5616 else 5617 if command_keyword=9 then 5618 begin <* user *> 5619 if read_param(term_in,user_id,0) then 5620 begin 5621 t:=0; 5622 wait(struc_sema,struc_ref); 5623 user_index:=find_login_user(user_id,user_list); 5624 if user_index>0 then 5625 begin 5626 term_index:=login_struc(user_index+6); 5627 while term_index>0 do 5628 begin 5629 sess_index:=login_struc(term_index+2); 5630 while sess_index>0 do 5631 begin 5632 if remove_sess(sess_index) then 5633 t:=t+1; 5634 sess_index:=login_struc(sess_index+3); 5635 end; 5636 term_index:=login_struc(term_index+3); 5637 end; 5638 end 5639 else 5640 write(term_out,string u_n_l); 5641 signal(struc_sema,struc_ref); 5642 write(term_out,<<dd >,t,<:session:>,if t<>1 then <:s:> else <::>, 5643 <: removed:>); 5644 end 5645 else 5646 write(term_out,string miss_par); 5647 end 5648 else 5649 if command_keyword=8 then 5650 begin <* terminal *> 5651 if read_param(term_in,term_id,0) then 5652 begin 5653 t:=0; 5654 wait(struc_sema,struc_ref); 5655 term_index:=find_login_terminal(term_id,0); 5656 if term_index>0 then 5657 begin 5658 sess_index:=login_struc(term_index+2); 5659 while sess_index>0 do 5660 begin 5661 if remove_sess(sess_index) then 5662 t:=t+1; 5663 sess_index:=login_struc(sess_index+3); 5664 end; 5665 term_index:=login_struc(term_index+3); 5666 end 5667 else 5668 write(term_out,string t_n_l); 5669 signal(struc_sema,struc_ref); 5670 write(term_out,<<dd >,t,<:session:>,if t<>1 then <:s:> else <::>, 5671 <: removed:>); 5672 end 5673 else 5674 write(term_out,string miss_par); 5675 end 5676 else 5677 write(term_out,string ill_par,command_name.laf); 5678 end; 5679 end 5680 else 5681 write(term_out,string miss_par); 5682 write(term_out,<:<10>:>); 5683 if false then 5684 alarm: disable traped(97); 5685 end; 5686 5686 procedure opr_set; 5687 <* 98 *> 5688 <*---------------------------------------------------*> 5689 <* Sæt værdi for timecheck eller antal terminaler *> 5690 <*---------------------------------------------------*> 5691 begin 5692 integer user_index; 5693 integer array user_id(1:4),ref(1:1),struc_ref(1:1); 5694 5694 trap(alarm); 5695 initref(struc_ref); 5696 if read_param(term_in,command_name,0) then 5697 begin 5698 if check_priv(0) then 5699 begin 5700 command_keyword:=find_keyword_value(command_name.laf(1),1); 5701 if command_keyword=8 then 5702 begin <* terminal *> 5703 if read_param(term_in,command_name,command_value) then 5704 begin 5705 if command_value<=maxterminals then 5706 max_terms:=command_value 5707 else 5708 write(term_out,<:*** not enough resources<10>:>); 5709 end 5710 else 5711 write(term_out,string miss_par); 5712 end 5713 else 5714 if command_keyword=17 then 5715 begin <* timecheck *> 5716 if read_param(term_in,command_name,0) then 5717 begin 5718 command_keyword:=find_keyword_value(command_name.laf(1),1); 5719 if command_keyword=10 or command_keyword=11 then 5720 begin <* on/off *> 5721 timecheck_stat:=if command_keyword=10 then 5722 true 5723 else 5724 false; 5725 end 5726 else 5727 if command_keyword=9 then 5728 begin <* user *> 5729 if read_param(term_in,user_id,0) then 5730 begin 5731 if read_param(term_in,command_name,command_value) then 5732 begin 5733 if find_keyword_value(command_name.laf(1),1)=11 then 5734 command_value:=25; 5735 if command_value<=25 and command_value>=0 then 5736 begin 5737 wait(struc_sema,struc_ref); 5738 user_index:=find_login_user(user_id,user_list); 5739 if user_index>0 then 5740 login_struc(user_index+4):= 5741 ((login_struc(user_index+4) shift (-12)) shift 12)+ 5742 command_value 5743 else 5744 write(term_out,string u_n_l); 5745 signal(struc_sema,struc_ref); 5746 end 5747 else 5748 write(term_out,string ill_time); 5749 end 5750 else 5751 write(term_out, string miss_par); 5752 end 5753 else 5754 write(term_out,string miss_par); 5755 end 5756 else 5757 write(term_out,string ill_par,command_name.laf,<:<10>:>); 5758 end; 5759 <* start time check *> 5760 initref(ref); 5761 wait_select:=6; 5762 wait(message_buf_pool,ref); 5763 signal(time_sem,ref); 5764 end 5765 else 5766 write(term_out,string ill_par,command_name.laf,<:<10>:>); 5767 end; 5768 end 5769 else 5770 write(term_out,string miss_par); 5771 if false then 5772 alarm: disable traped(98); 5773 end; 5774 5774 procedure opr_start; 5775 <* 99 *> 5776 <*---------------------------------------------------*> 5777 <* Start inlogning til systemet *> 5778 <*---------------------------------------------------*> 5779 begin 5780 integer array ref(1:1); 5781 5781 trap(alarm); 5782 if read_param(term_in,command_name,0) then 5783 begin 5784 if check_priv(0) then 5785 begin 5786 command_keyword:=find_keyword_value(command_name.laf(1),1); 5787 if command_keyword=16 then 5788 begin <* login *> 5789 login_stat:=96; 5790 end 5791 else 5792 if command_keyword=15 then 5793 begin <* system *> 5794 if system_stop then 5795 begin 5796 initref(ref); 5797 wait_select:=6; 5798 wait(message_buf_pool,ref); 5799 signal(free_sem,ref); 5800 write(term_out,<:System restarted<10>:>); 5801 end 5802 else 5803 write(term_out,<:*** System not stoped<10>:>); 5804 end 5805 else 5806 write(term_out,string ill_par,command_name.laf,<:<10>:>); 5807 end; 5808 end 5809 else 5810 write(term_out,string miss_par); 5811 if false then 5812 alarm: disable traped(99); 5813 end; 5814 5814 procedure opr_stop; 5815 <* 100 *> 5816 <*---------------------------------------------------*> 5817 <* Stop inlogning eller hele systemet *> 5818 <*---------------------------------------------------*> 5819 begin 5820 zone z(4,1,stderror); 5821 integer array ia(1:8); 5822 integer array dummy(1:1); 5823 integer user_index,i,stop_time; 5824 5824 trap(alarm); 5825 initref(dummy); 5826 if read_param(term_in,command_name,0) then 5827 begin 5828 if check_priv(4) then 5829 begin 5830 command_keyword:=find_keyword_value(command_name.laf(1),1); 5831 if command_keyword=15 then 5832 begin <* system *> 5833 if read_param(term_in,command_name,stop_time) then 5834 begin 5835 if stop_time=0 then 5836 begin 5837 command_keyword:=find_keyword_value(command_name.laf(1),1); 5838 if command_keyword=20 then 5839 begin <* check *> 5840 stop_time:=8388606; 5841 write(term_out,<:System stopping after check<10>:>); 5842 end 5843 else 5844 if command_name.laf(1)<> long <:0:> then 5845 begin 5846 write(term_out,string ill_par,command_name.laf,<:<10>:>); 5847 goto start; 5848 end; 5849 end 5850 else 5851 write(term_out,<:System stopping<10>:>); 5852 setposition(term_out,0,0); 5853 opera_terms(cor_nr,1):=1; 5854 login_stat:=0; 5855 system_stop:=true; 5856 timecheck_stat:=false; 5857 write_message(-100,if stop_time<>8388606 then stop_time 5858 else -1,true,<:Operator system stop:>); 5859 for i:=1 step 1 until stop_time do 5860 begin 5861 if (stop_time=8388606) and (sessions=0) then 5862 goto stop_sys; 5863 notis_users(stop_txt); 5864 if i<stop_time then 5865 begin 5866 wait(struc_sema,dummy); 5867 user_index:=user_list; 5868 while user_index>0 do 5869 begin 5870 if login_struc(user_index+4) extract 12 = 26 then 5871 login_struc(user_index+4):= 5872 (login_struc(user_index+4) shift (-12)) shift 12 ; 5873 user_index:=login_struc(user_index+7); 5874 end; 5875 signal(struc_sema,dummy); 5876 end; 5877 wait_time:=600; 5878 if wait(free_sem,dummy)>0 then 5879 begin 5880 signal(message_buf_pool,dummy); 5881 system_stop:=false; 5882 finis:=true; 5883 if head_consol=1 then 5884 write(term_out,<:System restarted<10>:>); 5885 head_consol:=1; 5886 wait(struc_sema,dummy); 5887 user_index:=user_list; 5888 while user_index>0 do 5889 begin 5890 login_struc(user_index+4):= 5891 ((login_struc(user_index+4) shift (-12)) shift 12) + 25; 5892 user_index:=login_struc(user_index+7); 5893 end; 5894 signal(struc_sema,dummy); 5895 goto start; 5896 end; 5897 end; 5898 stop_sys: 5899 <* Send stop message til tasterm *> 5900 ia(1):=14 shift 12 + 0; 5901 ia(2):=0; 5902 open(z,0,tasterm_name,0); 5903 send_mess(z,ia); 5904 monitor(18,z,1,ia); 5905 goto stop; 5906 end 5907 else 5908 write(term_out,string miss_par); 5909 end 5910 else 5911 if command_keyword=16 then 5912 begin <* login *> 5913 read_param(term_in,command_name,i); 5914 if i<0 or i>95 then 5915 write(term_out,string ill_val) 5916 else 5917 login_stat:=i; 5918 end 5919 else 5920 write(term_out,string ill_par,command_name.laf,<:<10>:>); 5921 end; 5922 end 5923 else 5924 write(term_out,string miss_par); 5925 start: 5926 if false then 5927 alarm: disable traped(100); 5928 end; 5929 5929 procedure opr_terminal; 5930 <* 101 *> 5931 <*---------------------------------------------------*> 5932 <* Udskriv alle terminaler der er inlogget *> 5933 <*---------------------------------------------------*> 5934 begin 5935 integer user_index,term_index,t,i; 5936 integer array term_id,user_id(1:4); 5937 5937 trap(alarm); 5938 t:=0; 5939 user_index:=user_list; 5940 while user_index>0 and not out_stop do 5941 begin 5942 for i:=0 step 1 until 3 do 5943 user_id(i+1):=login_struc(user_index+i); 5944 term_index:=login_struc(user_index+6); 5945 while term_index>0 and not out_stop do 5946 begin 5947 get_proc_name(login_struc(term_index),term_id); 5948 write(term_out,<:<10>:>,true,20,term_id.laf,true,11,user_id.laf); 5949 term_index:=login_struc(term_index+3); 5950 t:=t+1; 5951 end; 5952 user_index:=login_struc(user_index+7); 5953 end; 5954 write(term_out,<:<10><10>Terminals = :>,t); 5955 if false then 5956 alarm: disable traped(101); 5957 end; 5958 5958 procedure opr_user; 5959 <* 102 *> 5960 <*---------------------------------------------------*> 5961 <* Udskriv alle brugerer der er tilmeldt *> 5962 <*---------------------------------------------------*> 5963 begin 5964 integer user_index,t,i; 5965 integer array user_id(1:4); 5966 5966 trap(alarm); 5967 t:=0; 5968 user_index:=user_list; 5969 while user_index>0 and not out_stop do 5970 begin 5971 for i:=0 step 1 until 3 do 5972 user_id(i+1):=login_struc(user_index+i); 5973 write(term_out,<:<10>:>,true,11,user_id.laf); 5974 t:=t+1; 5975 user_index:=login_struc(user_index+7); 5976 end; 5977 write(term_out,<:<10><10>Users = :>,t); 5978 if false then 5979 alarm: disable traped(102); 5980 end; 5981 5981 5981 <****************************************> 5982 <* Hoved rutinen for operatør korutinen *> 5983 <****************************************> 5984 trap(alarm); 5985 claim(600); <* Reserver plads på stakken *> 5986 initref(ref); 5987 wait_time:=0; 5988 wait_select:=0; 5989 while true do 5990 begin 5991 break:=false; 5992 finis:=false; 5993 wait(opera_terms(cor_nr,2),ref); 5994 head_consol:=ref(3); 5995 <* sæt uændret besked buffer tilbage i pool *> 5996 signal(message_buf_pool,ref); 5997 if get_proc_name(opera_terms(cor_nr,1),term_name) then 5998 begin 5999 open(term_out,8,term_name,1 shift 16 + 1 shift 9); 6000 open(term_in,8,term_name,1 shift 9); 6001 if head_consol=1 then 6002 begin <* Ikke hoved terminalen *> 6003 <* Hent user id fra terminal *> 6004 getzone6(term_in,ia); 6005 ia(1):=131 shift 12 + 0; <* get user id *> 6006 ia(2):=ia(19)+1; <* first address *> 6007 ia(3):=ia(19)+11; <* last address *> 6008 buf:=send_mess(term_in,ia); 6009 if buf=0 then 6010 break:=true 6011 else 6012 begin 6013 if not wait_ans(term_in,buf,100,opera_terms(cor_nr,2),false) then 6014 break:=true <* Der blev ikke svaret inden 10 sek. *> 6015 else 6016 begin 6017 if monitor(18,term_in,1,ia)<>1 then 6018 break:=true 6019 else 6020 if ia(1)<>0 then 6021 break:=true 6022 else 6023 begin 6024 close(term_in,false); 6025 for i:=1,2 do 6026 user_id.laf(i):=term_in.laf(i); 6027 password:=term_in.laf(3); 6028 open(term_in,8,term_name,1 shift 9); 6029 <* Find privilegier i login_struc *> 6030 user_ident:=find_login_user(user_id,user_list); 6031 if user_ident=0 then 6032 break:=true <* Bruger ikke login *> 6033 else 6034 priv:=false add (login_struc(user_ident+5) shift (-12)); 6035 end; 6036 end; 6037 end; 6038 end 6039 else 6040 priv:=true; <* alle privilegier *> 6041 if not break then 6042 write(term_out,<:<10>Operator ready<10>:>) 6043 else 6044 begin 6045 write(term_out, 6046 <:Tas operatør-adgang ikke tilladt fra denne terminal<10>:>); 6047 setposition(term_out,0,0); 6048 monitor(64,term_out,0,command_name <*dummy*>); 6049 end; 6050 while not (finis or break) do 6051 begin <* Udfør operatør kommunikation *> 6052 setposition(term_out,0,0); 6053 write(term_out,<:$ :>);<* Prompt *> 6054 setposition(term_out,0,0); 6055 setposition(term_in,0,0); <* Slet input buffer *> 6056 if read_param(term_in,command_name,0) then 6057 begin 6058 if not break then <* break evt. sat af write el. read_param *> 6059 begin 6060 <* fortolk kommando i commandline *> 6061 command_keyword:=find_keyword_value(command_name.laf(1),1); 6062 if command_keyword>7 or command_keyword=0 then 6063 begin 6064 write(term_out,<:*** unknown command: :>, 6065 command_name.laf,<:<10>:>); 6066 setposition(term_out,0,0); 6067 end 6068 else 6069 begin 6070 out_stop:=false; 6071 case command_keyword of 6072 begin 6073 <* Udfør kommando *> 6074 <* Test for out_stop ved hver setposition på output *> 6075 <* er denne true stoppes evt ydeligerer udskrift *> 6076 <* Test for break efter hver i/o, er denne true *> 6077 <* stoppes udførelsen af kommandoen *> 6078 opr_finis; 6079 opr_disp; 6080 opr_message; 6081 opr_remove; 6082 opr_set; 6083 opr_start; 6084 opr_stop; 6085 end; 6086 end; 6087 end; 6088 end; 6089 if head_consol=0 then 6090 begin 6091 write(term_out,<:ok<10>:>); 6092 finis:=true; <* Hoved terminal *> 6093 end; 6094 end; <* session *> 6095 end; 6096 close(term_in,true); 6097 close(term_out,true); 6098 opera_terms(cor_nr,1):=0; 6099 end; <* while true *> 6100 stop: 6101 if false then 6102 alarm: disable traped(85); 6103 end; <* Operatør korutine *> 6104 6104 <**************************************> 6105 <**************************************> 6106 <* Procedure til time ckeck korutinen *> 6107 <**************************************> 6108 <**************************************> 6109 6109 integer procedure next_hour; 6110 <* 103 *> 6111 <*------------------------------------------------------------*> 6112 <* Beregn ventetiden til næste hele klokkeslet i *> 6113 <* 0.1 sek enheder *> 6114 <* *> 6115 <* Return : Tiden til næste hele klokkeslet i 0.1 sek enheder *> 6116 <*------------------------------------------------------------*> 6117 begin 6118 real r; 6119 long t; 6120 6120 systime(1,0,r); 6121 t:=r; 6122 next_hour:=round(3600-t+t//3600*3600)*10; 6123 end; 6124 6124 procedure notis_users(txt); 6125 <* 104 *> 6126 <*--------------------------------------------------------------------*> 6127 <* Find bruger der har overskredet tiden eller alle hvis stop *> 6128 <* Send log_txt og mærk tiden med 26 *> 6129 <* Gentag for alle brugere *> 6130 <*--------------------------------------------------------------------*> 6131 integer array txt; 6132 begin 6133 integer user_index,term_index,map,ut,nr; 6134 boolean found; 6135 integer array ref(1:1),struc_ref(1:1); 6136 6136 trap(alarm); 6137 initref(ref); 6138 initref(struc_ref); 6139 found:=true; 6140 repeat 6141 nr:=set_text_buf(txt); 6142 if nr=0 then 6143 begin 6144 wait_time:=100; 6145 wait(delay_sem,ref); 6146 end; 6147 until nr>0; 6148 while found do 6149 begin 6150 wait(struc_sema,struc_ref); 6151 found:=false; 6152 user_index:=user_list; 6153 while user_index>0 and not found do 6154 begin 6155 ut:=login_struc(user_index+4) extract 12; 6156 found:=(ut<=cur_time) or (system_stop and (ut<>26)); 6157 if not found then 6158 user_index:=login_struc(user_index+7); 6159 end; 6160 if found then 6161 begin 6162 map:=login_struc(user_index+4) shift (-12); 6163 login_struc(user_index+4):=(map shift 12)+26; 6164 term_index:=login_struc(user_index+6); 6165 while term_index>0 do 6166 begin 6167 mess_to_term(term_index,nr); 6168 term_index:=login_struc(term_index+3); 6169 end; 6170 end; 6171 signal(struc_sema,struc_ref); 6172 send_message_text(nr); 6173 end; 6174 if false then 6175 alarm: disable traped(104); 6176 end; 6177 6177 procedure remove_users; 6178 <* 105 *> 6179 <*--------------------------------------------------------------------*> 6180 <* Find første bruger der har 26 sat i tid *> 6181 <* Send remove session message til TAS og sæt tid 27 *> 6182 <* Gentag for alle *> 6183 <*--------------------------------------------------------------------*> 6184 begin 6185 integer user_index,term_index,sess_index,map; 6186 boolean found; 6187 integer array struc_ref(1:1); 6188 6188 trap(alarm); 6189 initref(struc_ref); 6190 found:=true; 6191 while found do 6192 begin 6193 wait(struc_sema,struc_ref); 6194 found:=false; 6195 user_index:=user_list; 6196 while user_index>0 and not found do 6197 begin 6198 found:=(login_struc(user_index+4) extract 12)=26; 6199 if not found then 6200 user_index:=login_struc(user_index+7); 6201 end; 6202 if found then 6203 begin 6204 map:=login_struc(user_index+4) shift (-12); 6205 login_struc(user_index+4):=(map shift 12)+27; 6206 term_index:=login_struc(user_index+6); 6207 while term_index>0 do 6208 begin 6209 sess_index:=login_struc(term_index+2); 6210 while sess_index>0 do 6211 begin 6212 remove_sess(sess_index); 6213 sess_index:=login_struc(sess_index+3); 6214 end; 6215 term_index:=login_struc(term_index+3); 6216 end; 6217 end; 6218 signal(struc_sema,struc_ref); 6219 end; 6220 if false then 6221 alarm: disable traped(105); 6222 end; 6223 6223 procedure timeco; 6224 <* 106 *> 6225 <*--------------------------------------------*> 6226 <* Hoved procedure for check time korutinen *> 6227 <*--------------------------------------------*> 6228 begin 6229 integer array dummy(1:1); 6230 integer user_index,i,last_time; 6231 integer array id(1:4); 6232 6232 trap(alarm); 6233 claim(500); 6234 initref(dummy); 6235 while true do 6236 begin 6237 wait_time:=next_hour; 6238 if wait(time_sem,dummy)>0 then 6239 signal(message_buf_pool,dummy); 6240 if cur_time=0 then 6241 begin 6242 wait(struc_sema,dummy); 6243 user_index:=user_list; 6244 while user_index>0 do 6245 begin 6246 for i:=0,1,2,3 do 6247 id(i+1):=login_struc(user_index+i); 6248 find_user(id); 6249 last_time:=if check_time(last_time) then 6250 last_time 6251 else 6252 0; 6253 login_struc(user_index+4):= 6254 ((login_struc(user_index+4) shift (-12)) shift 12) + last_time; 6255 user_index:=login_struc(user_index+7); 6256 end; 6257 signal(struc_sema,dummy); 6258 end; 6259 for i:=1 step 1 until log_time do 6260 begin 6261 if timecheck_stat then 6262 begin 6263 notis_users(log_txt); 6264 if i<log_time then 6265 begin 6266 wait(struc_sema,dummy); 6267 user_index:=user_list; 6268 while user_index>0 do 6269 begin 6270 if login_struc(user_index+4) extract 12 = 26 then 6271 login_struc(user_index+4):= 6272 (login_struc(user_index+4) shift (-12)) shift 12 ; 6273 user_index:=login_struc(user_index+7); 6274 end; 6275 signal(struc_sema,dummy); 6276 end; 6277 wait_time:=600; 6278 if wait(time_sem,dummy)>0 then 6279 signal(message_buf_pool,dummy); 6280 end; 6281 end; 6282 if timecheck_stat then 6283 remove_users; 6284 end; 6285 if false then 6286 alarm: disable traped(106); 6287 end; 6288 6288 procedure write_term_text; <* Korutine *> 6289 <* 107 *> 6290 <*---------------------------------------------------------------*> 6291 <* Gemmenløb alle terminaler for at udskrive en evt tekst der er *> 6292 <* markeret i login_struc. Start gennemløb ved signalering fra *> 6293 <* send_text proceduren. Efter udskrift frigives text-buffer *> 6294 <* *> 6295 <* Formater af sem-message: *> 6296 <* *> 6297 <* Ved send_text: (1) buf nr. *> 6298 <* (2) message_buf_addr *> 6299 <* (3) text_write_sem *> 6300 <* (4) zone array index *> 6301 <* *> 6302 <* Ved signal : (1) 0 *> 6303 <* (2) 8 *> 6304 <* (3) text buf. nr. *> 6305 <* (4) 0 *> 6306 <* *> 6307 <*---------------------------------------------------------------*> 6308 begin 6309 integer array ref(1:1),answer(1:8); 6310 integer out_count,i,buf_nr; 6311 boolean finis; 6312 zone array z(max_text_count,1,1,stderror); 6313 6313 boolean procedure write_next_term; 6314 <* 108 *> 6315 <*-----------------------------------------------------*> 6316 <* Udskriv text på en terminal (den første der findes) *> 6317 <*-----------------------------------------------------*> 6318 begin 6319 integer array ref(1:1),share(1:12); 6320 integer user_index,term_index,bufs,nr,i,buf_addr; 6321 integer array struc_ref(1:1); 6322 boolean found; 6323 6323 trap(alarm); 6324 initref(ref); 6325 initref(struc_ref); 6326 wait(struc_sema,struc_ref); 6327 found:=false; 6328 user_index:=user_list; 6329 while (user_index>0) and (not found) do 6330 begin 6331 term_index:=login_struc(user_index+6); 6332 while term_index>0 and not found do 6333 begin 6334 bufs:=login_struc(term_index+1) shift (-21); 6335 if bufs<>0 then 6336 begin 6337 found:=true; 6338 nr:=0; 6339 while not (false add (bufs shift (-nr))) do 6340 nr:=nr+1; 6341 nr:=nr+1; 6342 login_struc(term_index+1):=login_struc(term_index+1)- 6343 (1 shift (20+nr)); 6344 i:=1; 6345 repeat 6346 getshare6(z(i),share,1); 6347 i:=i+1; 6348 until share(1)<2; 6349 i:=i-1; 6350 share(4):=16 shift 12; 6351 share(5):=nr; 6352 share(6):=login_struc(term_index); 6353 setshare6(z(i),share,1); 6354 buf_addr:=monitor(16,z(i),1,share); 6355 if buf_addr=0 then 6356 write_message(998,1,false,<:Claims exceeded:>); 6357 text_buf_reserved(nr):=if text_buf_reserved(nr)=-1 then 6358 1 6359 else 6360 text_buf_reserved(nr)+1; 6361 wait_select:=8; 6362 wait(message_buf_pool,ref); 6363 ref(1):=nr; 6364 ref(2):=buf_addr; 6365 ref(3):=text_write_sem; 6366 ref(4):=i; 6367 signal(wait_answer_pool,ref); 6368 end 6369 else 6370 term_index:=login_struc(term_index+3); 6371 end; 6372 user_index:=login_struc(user_index+7); 6373 end; 6374 write_next_term:=not found; 6375 signal(struc_sema,struc_ref); 6376 if false then 6377 alarm: disable traped(108); 6378 end; <* write_next_text *> 6379 6379 6379 trap(alarm); <* main write_term_text *> 6380 claim(500); 6381 initref(ref); 6382 out_count:=0; 6383 for i:=1,2,3 do 6384 text_buf_reserved(i):=0; 6385 for i:=1 step 1 until max_text_count do 6386 open(z(i),0,tasterm_name,1 shift 9); 6387 while true do 6388 begin 6389 wait(text_write_sem,ref); 6390 if ref(1)<>0 then 6391 begin 6392 <* answer *> 6393 monitor(18,z(ref(4)),1,answer); 6394 text_buf_reserved(ref(1)):=text_buf_reserved(ref(1))-1; 6395 ref(1):=0; 6396 ref(2):=8; 6397 signal(message_buf_pool,ref); 6398 out_count:=out_count-1; 6399 end 6400 else 6401 begin 6402 <* Ny tekst *> 6403 buf_nr:=ref(3); 6404 signal(message_buf_pool,ref); 6405 finis:=false; 6406 while not finis do 6407 begin 6408 if out_count=max_text_count then 6409 begin 6410 wait_select:=-1; 6411 wait(text_write_sem,ref); 6412 monitor(18,z(ref(4)),1,answer); 6413 text_buf_reserved(ref(1)):=text_buf_reserved(ref(1))-1; 6414 ref(1):=0; 6415 ref(2):=8; 6416 signal(message_buf_pool,ref); 6417 out_count:=out_count-1; 6418 end; 6419 finis:=write_next_term; 6420 if not finis then 6421 out_count:=out_count+1; 6422 end; 6423 if text_buf_reserved(buf_nr)=-1 then 6424 text_buf_reserved(buf_nr):=0; 6425 end; 6426 end; 6427 if false then 6428 alarm: disable traped(107); 6429 end; 6430 6430 6430 <*************************************************> 6431 <* Start af tascat og initialisering af korutiner*> 6432 <*************************************************> 6433 6433 trap(alarm); 6434 <* Initialiser login_struc *> 6435 init_login_struc; 6436 <* Opret korutinerne og semafor beskrivelserne *> 6437 activity(3+number_of_opera); 6438 coroutines(5+number_of_opera,test_out); 6439 sys_start:=true; 6440 <***********************************************************> 6441 <* Alloker alle besked buffere på stakken og signaler dem *> 6442 <* til semaforen message_buf_pool *> 6443 <* En buffer kan hentes fra poolen på følgende måde: *> 6444 <* wait_selct:= 'besked buffer størrelse'; *> 6445 <* wait(message_buf_pool,ref); *> 6446 <* *> 6447 <* Når bufferen ikke skal benyttes mere sættes den tilbage *> 6448 <* ref(1):=0; *> 6449 <* ref(2):='besked buffer størrelse'; *> 6450 <* signal(message_buf_pool,ref); *> 6451 <***********************************************************> 6452 for i:=1 step 1 until (2*number_of_opera) do 6453 allocate(message_buf_pool,6,0); 6454 for i:=1 step 1 until (3 + max_text_count) do 6455 allocate(message_buf_pool,8,0); 6456 allocate(message_buf_pool,22,0); 6457 allocate(struc_sema,6,0); 6458 select_test:=test_select; 6459 <* Vent på synkronisering med tasterm *> 6460 wait_tasterm(false); 6461 <* Start korutinerne *> 6462 new_activity(1,0,catco); <* Katalog hovedrutinen *> 6463 new_activity(2,0,timeco); <* Time check rutinen *> 6464 new_activity(3,0,write_term_text); 6465 for i:=4 step 1 until number_of_opera+3 do 6466 new_activity(i,0,operator,i); <* Operatør rutinerne *> 6467 6467 <* Start kerne, Udskriv version *> 6468 write_message(struc_size,number_of_opera,true,<:Tas version 1.0 ready:>); 6469 i:=kernel(traped); 6470 6470 answer(4):= <:ok :> shift (-24) extract 24; 6471 answer(5):= <: :> shift (-24) extract 24; 6472 if not system_stop then 6473 begin 6474 alarm:traped(0); 6475 write_message(run_alarm_pos,run_alarm_cause,true,<:Run error:>); 6476 answer(4):= <:err:> shift (-24) extract 24; 6477 answer(5):= <:or :> shift (-24) extract 24; 6478 end; 6479 close(usercat,true); 6480 close(termcat,true); 6481 close(typecat,true); 6482 close_test_out; 6483 sys_start:=false; 6484 end; <* TASCAT *> 6485 6485 6485 <******************************************> 6486 <* Program start og initialisering *> 6487 <******************************************> 6488 6488 <* Sæt global trap lable *> 6489 trap(init_alarm); 6490 6490 <* sæt fields *> 6491 sender_pda:=2; 6492 reciever_pda:=4; 6493 buf_addr:=6; 6494 mess_array:=6; 6495 laf:=iaf:=baf:=0; 6496 6496 <* sæt status *> 6497 trap_mode:=-1; 6498 sys_start:=false; 6499 system_stop:=false; 6500 test_on:=false; 6501 killed:=false; 6502 users:= 6503 sessions:= 6504 terms:=0; 6505 6505 run_alarm_pos:= 6506 run_alarm_cause:=0; 6507 6507 <* initialiser konstant tekster *> 6508 ill_par:= real <:*** illegal parameter: :>; 6509 miss_par:= real <:*** missing parameter<10>:>; 6510 ill_val:= real <:*** illegal value<10>:>; 6511 long_text:= real <:*** text too long or input terminated by /<10>:>; 6512 t_n_l:= real <:*** terminal not login<10>:>; 6513 u_n_l:= real <:*** user not login<10>:>; 6514 ill_time:= real <:*** illegal login time<10>:>; 6515 c_p := real <:*** communication problems<10>:>; 6516 6516 <* Fjern fp area proces og in zonen *> 6517 open(test_out,4,<:fp:>,0); 6518 close(test_out,true); 6519 close(in,true); 6520 <* Fjern c og v entry *> 6521 open(copy_buf,0,<:c:>,0); 6522 monitor(48,copy_buf,i,log_txt); 6523 close(copy_buf,true); 6524 open(copy_buf,0,<:v:>,0); 6525 monitor(48,copy_buf,i,log_txt); 6526 close(copy_buf,true); 6527 6527 isotable(char_table); 6528 for i:=0 step 1 until 127 do 6529 char_table(i+128):=char_table(i)+128; 6530 char_table(46):=7 shift 12 + 46; 6531 intable(char_table); 6532 6532 <* Initialiser hovedterminalen *> 6533 head_term_pda:=system(7,i,head_term_name.laf); 6534 6534 <* initialiser keywords *> 6535 keywords_init; 6536 6536 <* Læs fp parametre *> 6537 read_param_line; 6538 6538 <* Sæt konstant værdier m.m fra init fil *> 6539 init_tascat; 6540 6540 <* Åben test output filen *> 6541 open_test(testout_name); 6542 6542 <* initialiser semafor navnene med nummer *> 6543 init_sem; 6544 6544 <* Test og initialiser baserne for processen *> 6545 init_bases; 6546 6546 <* init opera_terms array'et *> 6547 init_opera_terms; 6548 6548 <* Beregn struc_size og test processens størrelse *> 6549 struc_size:=2*max_users+max_terminals+max_sessions; 6550 max_terms:=if fp_maxterms>0 then 6551 fp_maxterms 6552 else 6553 max_terminals; 6554 system(2,own_size,prog_name.laf); 6555 <* Hent oversættelses dato og tid for tascat *> 6556 begin 6557 integer segm,rel; 6558 integer array tail(1:10); 6559 zone z(128,1,stderror); 6560 open(z,4,prog_name,0); 6561 monitor(42,z,0,tail); 6562 segm:=tail(7) shift (-12); 6563 rel:=tail(7) extract 12; 6564 setposition(z,0,segm); 6565 inrec6(z,rel-4); 6566 inrec6(z,4); 6567 reld:=z(1) shift (-24) extract 24; 6568 relt:=z(1) extract 24; 6569 close(z,true); 6570 end; 6571 6571 if struc_size>(own_size-5000-number_of_opera*1500)//8 then 6572 write_message(own_size,25000+number_of_opera*1500+struc_size*8, 6573 false,<:Process too small:>) 6574 else 6575 begin 6576 <* Åben katalogerne *> 6577 open_catalogs(usercat_name,termcat_name,typecat_name); 6578 6578 <* test buffer claims *> 6579 system(5,own_pda+26,testout_name <* work array *>); 6580 if (testout_name(1) shift (-12))<(max_text_count+3+ number_of_opera) then 6581 write_message(testout_name(1) shift (-12)+2, 6582 max_text_count+5+number_of_opera, 6583 false,<:Not enough buffers:>); 6584 6584 if false then 6585 begin <* trap i initialiseringen *> 6586 init_alarm: traped(0); 6587 write_message(run_alarm_pos,run_alarm_cause,true,<:Initiation error:>); 6588 wait_tasterm(true); 6589 answer(4):= <:err:> shift (-24) extract 24; 6590 answer(5):= <:or :> shift (-24) extract 24; 6591 end 6592 else 6593 6593 <* start hovedproceduren *> 6594 tascat; 6595 6595 if killed then 6596 write_message(0,3,true,<:System breaked:>) 6597 else 6598 write_message(0,4,true,<:System stopped:>); 6599 system(11,i,log_txt); 6600 sys_bases(1):=log_txt(1); 6601 sys_bases(2):=log_txt(2); 6602 set_cat_bases(sys_bases); 6603 answer(1):=2 shift 12 + 1; 6604 answer(2):= <: st:> shift (-24) extract 24; 6605 answer(3):= <:op :> shift (-24) extract 24; 6606 for i:=6,7,8 do 6607 answer(i):=0; 6608 system(10,0,answer); 6609 end; 6610 end;\f algol end 280 *o c ▶EOF◀