~LAT_PORTAL.BCKLAT_PORTAL.BCK$BACK [.DECUS] LAT_PORTAL.BCK/SAV/LOG JOLIN _ 'V5.4 _ALPHA::  _$1$DUA5: V5.3 ~ 5 *[JOLIN.LAT_PORTAL.DECUS]A.LIRE;2+,g ./ 4N-80123KPWO56`i'7'8ۧ\9GHJ lat_portal =========='Remi JOLIN - TAT (decusf::jolin_r)----------------MCe programme est destine a assurer une liaison bidirectionnelle entre 2 portsNasynchrones situes sur 2 vax relies par un reseau decnet. Le but premier etaitLde "multiplexer" une liaison asynchrone non DEC sur un reseau decnet WAN... Fonctionnement general :< +-----------+ +-----------+< | | | |< | VAX A | Decnet | VAX B |D tt1 -----+ +------------------+ +---- tt2< | | | |< +-----------+ +-----------+Cl'utilisateur est sur le vax A, il lance la procedure "connect.com"5Ca etablit un lien decnet vers la tache "distant.com">Il faut modifier ces deux procedures en fonction de la config.LIl faut que l'utilisateur, ainsi que le user qui fait tourner la tache sur BHaient les privileges : "log_io, tmpmbx, netmbx", on peut aussi installerMl'image lat_portal.exe avec ces privileges... (on peut peut-etre se passer de=log_io, mais je n'ai pas eu le temps de chercher vraiment...)JJe crois bien me souvenir que rien n'est prevu pour sortir du programme...M(voir le commentaire du debut...). Mais ca ne devrait pas etre trop complique7de rajouter une out of band ast sur un truc genre ^\...KLe tout est ecrit en pascal... et ca marche sur lat (sur le reste aussi...,5mais sur lat, il faut gerer un peu plus de choses...)N------------------------------------------------------------------------------I Le tout est mis a disposition tel quel sans aucun support garanti... N------------------------------------------------------------------------------%*[JOLIN.LAT_PORTAL.DECUS]CONNECT.COM;1+,^$./ 49-80123KPWO56B'7 }B'8 \9GHJ$! connect.com $ set noon9$ define terminal tt ! c'est le terminal de l'utilisateur8$ define distant "B::""task=distant""" ! tache distante$ run la_ou_c_est:lat_portal$ exit%*[JOLIN.LAT_PORTAL.DECUS]DISTANT.COM;1+,ZA./ 4-80123KPWO56@'7 '8`~\9GHJ$! distant.com $ set noon$ set proc/name="Distant-tt2"$ define distant sys$net$ define terminal tt2$ run la_ou_c_est:lat_portal$ exit(*[JOLIN.LAT_PORTAL.DECUS]LAT_PORTAL.EXE;1+, . / 4 -80123 KPWO 56*u7.^'8<}\9GHJ0DX0205(~th TACHE01~t05-05   ?! LIBRTL_001+g PASRTL_001>> Erreur : qio ecriture ecranArmement qio tacheIosb tacheqio read terminalqio ecriture tacheHangup terminal...connexion vers le port remoterecu 'unsolicited message' : Armement qio mailbox terminalIosb mailbox terminaldistantterminalouverture canal mbx terminalNom du terminal : \_LTAOn connecte le terminalconnexion vers le port remotesense mode terminalOn n'est pas sur un terminal...set mode terminalqio vers tache distanteQio sur mailbox terminalouverture canal tache "#<~ <^}<^^\<PP1 <2,8%\^~(nn% ^^P '<~ P buffer_tache : packed array[1..long_buffer_tache] of char;7 buffer_mbx_terminal : packed record case integer ofK 0 : (c : packed array[1..long_buffer] of char);1 1 : (mess_type : mot;, unit : mot; taille_c : byte;2 controler_name : packed array[1..15] of char;? reste : varying[235] of char); end;' efn_terminal, efn_tache : unsigned; caract_term,) caract_term_avant : [volatile] record, class, typ : byte; page_width : word; basic_char : tt$type; extend_char : tt2$type; end;( raison_sortie : [volatile] unsigned;; exit_handler_block : [volatile] array[1..4] of integer;/ nom_terminal : packed array[1..64] of char; process_mode : unsigned; ,procedure erreur(texte : varying[n] of char;! etat : integer); BEGIN writeln('>> Erreur : ',texte); lib$signal(etat); $exit(1) END; PROCEDURE sert_canal_tache; BEGIN CASE iosb_tache.cond_val OF ss$_normal : BEGIN- etat := $qiow(chan := canal_terminal, efn := efn_tache,. func := io$_writevblk + io$m_noformat, p1 := buffer_tache,! p2 := iosb_tache.nb_car); IF not odd(etat) THEN' erreur('qio ecriture ecran',etat);) etat := $qio(chan := canal_tache, func := io$_readvblk, iosb := iosb_tache,+ astadr := %immed sert_canal_tache, p1 := buffer_tache," p2 := long_buffer_tache); IF not odd(etat) THEN' erreur('Armement qio tache', etat) END; otherwise5 erreur('Iosb tache',iosb_tache.cond_val) END; END;  PROCEDURE sert_canal_terminal; BEGIN& CASE iosb_mbx_terminal.cond_val OF ss$_normal :  BEGIN, CASE buffer_mbx_terminal.mess_type OF msg$_trmunsolic : BEGIN REPEAT etat := $qiow (# chan := canal_terminal,# func := io$_readvblk +  io$m_noecho + io$m_nofiltr +  io$m_timed," iosb := iosb_terminal,$ p1 := buffer_terminal,) p2 := long_buffer_terminal, p3 := 0,! p4 := %ref masque); IF odd(etat) THEN( etat := iosb_terminal.cond_val;1 IF (not odd(etat)) and (etat <> ss$_timeout) THEN+ erreur('qio read terminal', etat); IF iosb_terminal.nb_car > 0 THEN BEGIN+ etat := $qiow(chan := canal_tache, efn := efn_terminal, func := io$_writevblk, p1 := buffer_terminal,% p2 := iosb_terminal.nb_car); IF not odd(etat) THEN( erreur('qio ecriture tache',etat); END;7 UNTIL (iosb_terminal.cond_val = ss$_timeout) or (not odd(etat)); END; msg$_trmhangup : BEGIN2 writeln('Hangup terminal...');" { on tente une reconnexion } etat := $qiow ( chan := canal_terminal,- func := io$_tty_port + io$m_lt_connect, iosb := iosb_connect); IF odd(etat) THEN! etat := iosb_connect.cond_val; IF not odd(etat) THEN0 erreur('connexion vers le port remote',etat); END; OTHERWISE1 writeln('recu ''unsolicited message'' : ', = buffer_mbx_terminal.mess_type:0); END;. etat := $qio(chan := canal_mbx_terminal, func := io$_readvblk, iosb := iosb_mbx_terminal,* astadr := %immed sert_canal_terminal, p1 := buffer_mbx_terminal, p2 := long_buffer); IF not odd(etat) THEN5 erreur('Armement qio mailbox terminal', etat) END; OTHERWISEA erreur('Iosb mailbox terminal',iosb_tache.cond_val); END; END; 3[ ASYNCHRONOUS, UNBOUND ] PROCEDURE handler_sortie;  {+ FUNCTIONAL DESCRIPTION: A Cette procedure est appelle lors du 'run down' de l'image  -} BEGIN< { on remet le terminal dans l'etat ou on l'a trouve... } $qiow ( chan := canal_terminal, func := io$_setmode, iosb := iosb_terminal, p1 := caract_term_avant,& p2 := SIZE( caract_term_avant )); END;  BEGIN(etat := $assign('distant', canal_tache);lib$signal(etat);IF etat = ss$_remoteTHEN BEGIN lib$get_ef (+ event_flag_number := efn_terminal); lib$get_ef (( event_flag_number := efn_tache); etat := lib$asn_wth_mbx (* device_name := 'terminal',4 maximum_message_size := long_buffer,, buffer_quota := long_buffer,1 device_channel := canal_terminal,7 mailbox_channel := canal_mbx_terminal); lib$signal(etat); IF not odd(etat) THEN- erreur('ouverture canal mbx terminal',etat);@ { si le process est 'network' et si le terminal est LTAxxx }@ { on fait le 'connect' vers le port remote } lib$getjpi ( item_code := jpi$_mode,) resultant_value := process_mode);# IF process_mode = jpi$k_network THEN BEGIN lib$getdvi (+ item_code := dvi$_tt_phydevnam,& channel := canal_terminal,. resultant_string := nom_terminal);3 writeln('Nom du terminal : \', nom_terminal, '\');0 IF SUBSTR( nom_terminal, 1, 4 ) = '_LTA' THEN BEGIN( writeln('On connecte le terminal'); etat := $qiow ( chan := canal_terminal,, func := io$_tty_port + io$m_lt_connect, iosb := iosb_connect); IF odd(etat) THEN etat := iosb_connect.cond_val; IF not odd(etat) THEN/ erreur('connexion vers le port remote',etat); END; END; etat := $qiow () chan := canal_terminal,( func := io$_sensemode,( iosb := iosb_terminal,& p1 := caract_term,/ p2 := SIZE( caract_term )); IF odd(etat) THEN' etat := iosb_terminal.cond_val; IF not odd(etat) THEN, erreur('sense mode terminal', etat);$ IF caract_term.class <> dc$_term THENO erreur('On n''est pas sur un terminal...' + dec(caract_term.class), 4);% caract_term_avant := caract_term;( { on connecte le handler de sortie } exit_handler_block[1] := 0;7 exit_handler_block[2] := iaddress(handler_sortie);  exit_handler_block[3] := 1;5 exit_handler_block[4] := iaddress(raison_sortie); etat := $dclexh (. desblk := exit_handler_block); IF not odd(etat) THEN $exit(etat); WITH caract_term DO BEGIN WITH basic_char DO BEGIN" tt$v_hostsync := true; tt$v_mechform := true; tt$v_mechtab := true; tt$v_noecho := true; tt$v_notypeahd := false; tt$v_ttsync := true; tt$v_wrap := false; END; WITH extend_char DO BEGIN$ tt2$v_autobaud := false; tt2$v_edit := false; tt2$v_editing := false; tt2$v_localecho := false; tt2$v_pasthru := true; END; END; etat := $qiow () chan := canal_terminal,& func := io$_setmode,( iosb := iosb_terminal,& p1 := caract_term,/ p2 := SIZE( caract_term )); IF odd(etat) THEN' etat := iosb_terminal.cond_val; IF not odd(etat) THEN* erreur('set mode terminal', etat);% etat := $qio(chan := canal_tache, func := io$_readvblk, iosb := iosb_tache,% astadr := %immed sert_canal_tache, p1 := buffer_tache, p2 := long_buffer_tache); IF not odd(etat) THEN) erreur('qio vers tache distante', etat);, etat := $qio(chan := canal_mbx_terminal, func := io$_readvblk, iosb := iosb_mbx_terminal,( astadr := %immed sert_canal_terminal, p1 := buffer_mbx_terminal, p2 := long_buffer); IF not odd(etat) THEN( erreur('Qio sur mailbox terminal',etat) ENDELSE* erreur('ouverture canal tache', etat);$hiberEND..T~LAT_PORTAL.BCKLAT_PORTAL.BCK$BACK [.DECUS] LAT_PORTAL.BCK/SAV/LOG JOLIN _ 'V5.4 _ALPHA::  _$1$DUA5: V5.3 ~ 5 *[JOLIN.LAT_PORTAL.DECUS]A.LIRE;2+,g ./ 4N-80123KPWO56`i'7'8ۧ\9GHJ lat_portal =========='Remi JOLIN - TAT (decusf::jolin_r)----------------MCe programme est destine a assurer une liaison bidirectionnelle entre 2 portsNasynchrones situes sur 2 vax relies par un reseau decnet. Le but premier etaitLde "multiplexer" une liaison asynchrone non DEC sur un reseau decnet WAN... Fonctionnement general :< +-----------+ +-----------+< | | | |< | VAX A | Decnet | VAX B |D tt1 -----+ +------------------+ +---- tt2< | | | |< +-----------+ +-----------+Cl'utilisateur est sur le vax A, il lance la procedure "connect.com"5Ca etablit un lien decnet vers la tache "distant.com">Il faut modifier ces deux procedures en fonction de la config.LIl faut que l'utilisateur, ainsi que le user qui fait tourner la tache sur BHaient les privileges : "log_io, tmpmbx, netmbx", on peut aussi installerMl'image lat_portal.exe avec ces privileges... (on peut peut-etre se passer de=log_io, mais je n'ai pas eu le temps de chercher vraiment...)JJe crois bien me souvenir que rien n'est prevu pour sortir du programme...M(voir le commentaire du debut...). Mais ca ne devrait pas etre trop complique7de rajouter une out of band ast sur un truc genre ^\...KLe tout est ecrit en pascal... et ca marche sur lat (sur le reste aussi...,5mais sur lat, il faut gerer un peu plus de choses...)N------------------------------------------------------------------------------I Le tout est mis a disposition tel quel sans aucun support garanti... N------------------------------------------------------------------------------%*[JOLIN.LAT_PORTAL.DECUS]CONNECT.COM;1+,^$./ 49-80123KPWO56B'7 }B'8 \9GHJ$! connect.com $ set noon9$ define terminal tt ! c'est le terminal de l'utilisateur8$ define distant "B::""task=distant""" ! tache distante$ run la_ou_c_est:lat_portal$ exit%*[JOLIN.LAT_PORTAL.DECUS]DISTANT.COM;1+,ZA./ 4-80123KPWO56@'7 '8`~\9GHJ$! distant.com $ set noon$ set proc/name="Distant-tt2"$ define distant sys$net$ define terminal tt2$ run la_ou_c_est:lat_portal$ exit(*[JOLIN.LAT_PORTAL.DECUS]LAT_PORTAL.EXE;1+, . / 4 -80123 KPWO 56*u7.^'8<}\9GHJ0DX0205(~th TACHE01~t05-05   ?! LIBRTL_001+g PASRTL_001>> Erreur : qio ecriture ecranArmement qio tacheIosb tacheqio read terminalqio ecriture tacheHangup terminal...connexion vers le port remoterecu 'unsolicited message' : Armement qio mailbox terminalIosb mailbox terminaldistantterminalouverture canal mbx terminalNom du terminal : \_LTAOn connecte le terminalconnexion vers le port remotesense mode terminalOn n'est pas sur un terminal...set mode terminalqio vers tache distanteQio sur mailbox terminalouverture canal tache "#<~ <^}<^^\<PP1 <2,8%\^~(nn% ^^P '<~ P buffer_tache : packed array[1..long_buffer_tache] of char;7 buffer_mbx_terminal : packed record case integer ofK 0 : (c : packed array[1..long_buffer] of char);1 1 : (mess_type : mot;, unit : mot; taille_c : byte;2 controler_name : packed array[1..15] of char;? reste : varying[235] of char); end;' efn_terminal, efn_tache : unsigned; caract_term,) caract_term_avant : [volatile] record, class, typ : byte; page_width : word; basic_char : tt$type; extend_char : tt2$type; end;( raison_sortie : [volatile] unsigned;; exit_handler_block : [volatile] array[1..4] of integer;/ nom_terminal : packed array[1..64] of char; process_mode : unsigned; ,procedure erreur(texte : varying[n] of char;! etat : integer); BEGIN writeln('>> Erreur : ',texte); lib$signal(etat); $exit(1) END; PROCEDURE sert_canal_tache; BEGIN CASE iosb_tache.cond_val OF ss$_normal : BEGIN- etat := $qiow(chan := canal_terminal, efn := efn_tache,. func := io$_writevblk + io$m_noformat, p1 := buffer_tache,! p2 := iosb_tache.nb_car); IF not odd(etat) THEN' erreur('qio ecriture ecran',etat);) etat := $qio(chan := canal_tache, func := io$_readvblk, iosb := iosb_tache,+ astadr := %immed sert_canal_tache, p1 := buffer_tache," p2 := long_buffer_tache); IF not odd(etat) THEN' erreur('Armement qio tache', etat) END; otherwise5 erreur('Iosb tache',iosb_tache.cond_val) END; END;  PROCEDURE sert_canal_terminal; BEGIN& CASE iosb_mbx_terminal.cond_val OF ss$_normal :  BEGIN, CASE buffer_mbx_terminal.mess_type OF msg$_trmunsolic : BEGIN REPEAT etat := $qiow (# chan := canal_terminal,# func := io$_readvblk +  io$m_noecho + io$m_nofiltr +  io$m_timed," iosb := iosb_terminal,$ p1 := buffer_terminal,) p2 := long_buffer_terminal, p3 := 0,! p4 := %ref masque); IF odd(etat) THEN( etat := iosb_terminal.cond_val;1 IF (not odd(etat)) and (etat <> ss$_timeout) THEN+ erreur('qio read terminal', etat); IF iosb_terminal.nb_car > 0 THEN BEGIN+ etat := $qiow(chan := canal_tache, efn := efn_terminal, func := io$_writevblk, p1 := buffer_terminal,% p2 := iosb_terminal.nb_car); IF not odd(etat) THEN( erreur('qio ecriture tache',etat); END;7 UNTIL (iosb_terminal.cond_val = ss$_timeout) or (not odd(etat)); END; msg$_trmhangup : BEGIN2 writeln('Hangup terminal...');" { on tente une reconnexion } etat := $qiow ( chan := canal_terminal,- func := io$_tty_port + io$m_lt_connect, iosb := iosb_connect); IF odd(etat) THEN! etat := iosb_connect.cond_val; IF not odd(etat) THEN0 erreur('connexion vers le port remote',etat); END; OTHERWISE1 writeln('recu ''unsolicited message'' : ', = buffer_mbx_terminal.mess_type:0); END;. etat := $qio(chan := canal_mbx_terminal, func := io$_readvblk, iosb := iosb_mbx_terminal,* astadr := %immed sert_canal_terminal, p1 := buffer_mbx_terminal, p2 := long_buffer); IF not odd(etat) THEN5 erreur('Armement qio mailbox terminal', etat) END; OTHERWISEA erreur('Iosb mailbox terminal',iosb_tache.cond_val); END; END; 3[ ASYNCHRONOUS, UNBOUND ] PROCEDURE handler_sortie;  {+ FUNCTIONAL DESCRIPTION: A Cette procedure est appelle lors du 'run down' de l'image  -} BEGIN< { on remet le terminal dans l'etat ou on l'a trouve... } $qiow ( chan := canal_terminal, func := io$_setmode, iosb := iosb_terminal, p1 := caract_term_avant,& p2 := SIZE( caract_term_avant )); END;  BEGIN(etat := $assign('distant', canal_tache);lib$signal(etat);IF etat = ss$_remoteTHEN BEGIN lib$get_ef (+ event_flag_number := efn_terminal); lib$get_ef (( event_flag_number := efn_tache); etat := lib$asn_wth_mbx (* device_name := 'terminal',4 maximum_message_size := long_buffer,, buffer_quota := long_buffer,1 device_channel := canal_terminal,7 mailbox_channel := canal_mbx_terminal); lib$signal(etat); IF not odd(etat) THEN- erreur('ouverture canal mbx terminal',etat);@ { si le process est 'network' et si le terminal est LTAxxx }@ { on fait le 'connect' vers le port remote } lib$getjpi ( item_code := jpi$_mode,) resultant_value := process_mode);# IF process_mode = jpi$k_network THEN BEGIN lib$getdvi (+ item_code := dvi$_tt_phydevnam,& channel := canal_terminal,. resultant_string := nom_terminal);3 writeln('Nom du terminal : \', nom_terminal, '\');0 IF SUBSTR( nom_terminal, 1, 4 ) = '_LTA' THEN BEGIN( writeln('On connecte le terminal'); etat := $qiow ( chan := canal_terminal,, func := io$_tty_port + io$m_lt_connect, iosb := iosb_connect); IF odd(etat) THEN etat := iosb_connect.cond_val; IF not odd(etat) THEN/ erreur('connexion vers le port remote',etat); END; END; etat := $qiow () chan := canal_terminal,( func := io$_sensemode,( iosb := iosb_terminal,& p1 := caract_term,/ p2 := SIZE( caract_term )); IF odd(etat) THEN' etat := iosb_terminal.cond_val; IF not odd(etat) THEN, erreur('sense mode terminal', etat);$ IF caract_term.class <> dc$_term THENO erreur('On n''est pas sur un terminal...' + dec(caract_term.class), 4);% caract_term_avant := caract_term;( { on connecte le handler de sortie } exit_handler_block[1] := 0;7 exit_handler_block[2] := iaddress(handler_sortie);  exit_handler_block[3] := 1;5 exit_handler_block[4] := iaddress(raison_sortie); etat := $dclexh (. desblk := exit_handler_block); IF not odd(etat) THEN $exit(etat); WITH caract_term DO BEGIN WITH basic_char DO BEGIN" tt$v_hostsync := true; tt$v_mechform := true; tt$v_mechtab := true; tt$v_noecho := true; tt$v_notypeahd := false; tt$v_ttsync := true; tt$v_wrap := false; END; WITH extend_char DO BEGIN$ tt2$v_autobaud := false; tt2$v_edit := false; tt2$v_editing := false; tt2$v_localecho := false; tt2$v_pasthru := true; END; END; etat := $qiow () chan := canal_terminal,& func := io$_setmode,( iosb := iosb_terminal,& p1 := caract_term,/ p2 := SIZE( caract_term )); IF odd(etat) THEN' etat := iosb_terminal.cond_val; IF not odd(etat) THEN* erreur('set mode terminal', etat);% etat := $qio(chan := canal_tache, func := io$_readvblk, iosb := iosb_tache,% astadr := %immed sert_canal_tache, p1 := buffer_tache, p2 := long_buffer_tache); IF not odd(etat) THEN) erreur('qio vers tache distante', etat);, etat := $qio(chan := canal_mbx_terminal, func := io$_readvblk, iosb := iosb_mbx_terminal,( astadr := %immed sert_canal_terminal, p1 := buffer_mbx_terminal, p2 := long_buffer); IF not odd(etat) THEN( erreur('Qio sur mailbox terminal',etat) ENDELSE* erreur('ouverture canal tache', etat);$hiberEND..