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