diff options
author | chatty | 1999-01-08 10:21:38 +0000 |
---|---|---|
committer | chatty | 1999-01-08 10:21:38 +0000 |
commit | 9609c859ff4e5eab04e7ea9429086ad8dc12f6ef (patch) | |
tree | 16fdc8209d5b20fe26bc1f8988d62a508ecf2f3b | |
parent | aa276044c03db222f8c5d25cec55623249e4ff0f (diff) | |
download | ivy-perl-9609c859ff4e5eab04e7ea9429086ad8dc12f6ef.zip ivy-perl-9609c859ff4e5eab04e7ea9429086ad8dc12f6ef.tar.gz ivy-perl-9609c859ff4e5eab04e7ea9429086ad8dc12f6ef.tar.bz2 ivy-perl-9609c859ff4e5eab04e7ea9429086ad8dc12f6ef.tar.xz |
Now handles broadcast domains through IVYDOMAINS and args to Ivy::start
Bus->Ivy
-rw-r--r-- | Ivy.pm | 76 |
1 files changed, 47 insertions, 29 deletions
@@ -1,12 +1,16 @@ -package Bus ; # +# Ivy, Perl interface # -# -# -# -# -# +# Copyright 1997-1999 +# Centre d'Etudes de la Navigation Aerienne +# +# All functions # +# $Id$ +# + +package Ivy ; + require 5.004 ; use Sys::Hostname; @@ -27,7 +31,7 @@ sub start (@); # debut de l'integration au bus : # getConnections # pour etablir les connections "application" -sub stop (); # - envoie un BYE et clos les connections +sub stop (); # - envoie un BYE et clot les connections sub bindRegexp ($$) ; # permet d'associer une regexp avec un callBack # ou d'annuler une precedente association @@ -49,7 +53,7 @@ sub pruneRegexp (@); # optimisation : si l'on connait les sujets des messages # qu'on envoie, on appelle cette fonction avec une # liste de sujets, et les regexps qui ne matchent pas # ce sujet sont eliminees Cette fonction doit etre - # appelee avant le Bus::start + # appelee avant le Ivy::start ################ PRIVEE #################################################### sub _getBonjour (); # lit le (ou les) bonjour(s) sur le canal de supervision @@ -200,21 +204,32 @@ BEGIN {$SIG{'PIPE'} = sub {warn "broken pipe, ignoring ...\n";}} sub start (@) { my %options = @_; + + # valeurs par defaut pour le parametre : variable d'environnement + # ou valeur cablee, a defaut + my $default_domains = $ENV{"IVYDOMAINS"}; + $default_domains = BROADCAST_ADDRS unless defined ($default_domains); + my %defaultOptions = ( #PARAMETRES OBLIGATOIRES -loopMode => undef, # TK ou LOCAL + -appName => undef, + # nom de l'appli + + # PARAMETRES FACULTATIFS (avec valeurs par defaut) -broadcastPort => $ENV{"BUS"}, # No de port UDP Si non specifie la variable # d'environnement BUS sera examinee - - -appName => undef, - # nom de l'appli - -messWhenReady => "_APP NAME READY", + -domains => $default_domains, + # Liste des domaines ou se fait le broadcast + # si non specifie, on utilise la variable + # d'environnement ou la valeur par defaut + + -messWhenReady => "_APP NAME READY", # message de synchro a envoyer quand pret - # PARAMETRES FACULTATIFS (avec valeurs par defaut) -neededApp => [], # liste des appplis necessaires @@ -244,18 +259,19 @@ sub start (@) $options{$opt} = $defaultOptions{$opt} ; } else { # parametre obligatoire - die "ERREUR Bus::start vous devez specifier ". + die "ERREUR Ivy::start vous devez specifier ". "l'option $opt\n"; } } foreach my $opt (keys %options) { - die "ERREUR Bus::start option $opt inconnue\n" unless + die "ERREUR Ivy::start option $opt inconnue\n" unless exists ($defaultOptions{$opt}); } my $loopMode = $options{-loopMode}; my $broadcastPort = $options{-broadcastPort} ; + my $broadcastAddrs = $options{-domains} ; $appName = $options{-appName} ; $messWhenReady = $options{-messWhenReady} eq "_APP NAME READY" ? "$appName READY" : $options{-messWhenReady}; @@ -275,15 +291,19 @@ sub start (@) die "le premier argument (mainloop mode) doit etre TK ou LOCAL\n"; } - my $hostAddr = (gethostbyname (hostname()))[4] ; - # cree la socket de connexion, recupere le no de port $connSock = IO::Socket::INET->new(Listen => 128, Proto => 'tcp', Reuse => 1) ; + # on memorise tout ca, ce qui evitera par la suite de se + # repondre a soi-meme. On le fait sous nos deux noms : + # le nom de machine et 'localhost' + my $hostAddr = (gethostbyname (hostname()))[4] ; + my $localhostAddr = (gethostbyname ('localhost'))[4] ; $cnnxion{"$hostAddr:". $connSock->sockport} = "\004"; + $cnnxion{"$localhostAddr:". $connSock->sockport} = "\004"; - + # cree la socket de broadcast $supSock = IO::Socket::INET->new(LocalPort => $broadcastPort, Proto => 'udp', Type => SOCK_DGRAM, @@ -293,8 +313,6 @@ sub start (@) # on determine la liste des adresses de broadcast - my $broadcastAddrs = $ENV{'IVYDOMAINS'}; - $broadcastAddrs = BROADCAST_ADDRS unless defined $broadcastAddrs; $broadcastAddrs =~ s/ //g; my @broadcastAddrs = split (',', $broadcastAddrs); @@ -314,7 +332,7 @@ sub start (@) my $netAddrInet = inet_aton ($netAddr); my $netBroadcastAddr = pack_sockaddr_in ($broadcastPort, $netAddrInet); send ($supSock, $bonjourMsg, 0, $netBroadcastAddr) or - warn "Bus::start envoi du bonjour a echoue sur $netAddr : $!\n"; + warn "Ivy::start envoi du bonjour a echoue sur $netAddr : $!\n"; } # callback pour traiter la reception des bonjours &$fileEventFunc ($supSock, \&_getBonjour) ; @@ -438,7 +456,7 @@ sub sendDirectMsgs ($$@) } return 1; } else { - warn "Bus::sendDirectMsgs appli $to inconnue\n"; + warn "Ivy::sendDirectMsgs appli $to inconnue\n"; return 0; } } @@ -457,7 +475,7 @@ sub sendDieTo ($) } return 1; } else { - warn "Bus::sendDieTo appli $to inconnue\n"; + warn "Ivy::sendDieTo appli $to inconnue\n"; return 0; } } @@ -479,10 +497,10 @@ sub ping ($$) } -############### PROCEDURE BUS STOP +############### PROCEDURE IVY STOP sub stop () { - # pour routes les connections + # pour toutes les connections foreach my $fd (values %sockList) { send ($fd, sprintf (MSG_FMT, BYE, 0, ""), 0) or _removeFileDescriptor ($fd); @@ -595,12 +613,12 @@ sub _getBonjour () } # on verifie qu'on ne se repond pas et qu'on ne - # ne reconnecte pas a un process deja connecte + # se reconnecte pas a un process deja connecte if (exists ($cnnxion{"$addr:$peerPort"})) { - #print "DBG> : bonjour de $peerName:$peerPort : DEJA CONNECTE\n" ; +# print "DBG> : bonjour de $peerName:$peerPort : DEJA CONNECTE\n" ; return ; } else { - #print "DBG> : reception de $peerName : bonjour $peerPort\n" ; +# print "DBG> : reception de $peerName : bonjour $peerPort\n" ; } $cnnxion{"$addr:$peerPort"} = 1; @@ -619,7 +637,7 @@ sub _getBonjour () # on balance les regexps qui nous interessent a l'appli distante _sendWantedRegexp ($appSock); } else { - warn "Bus::_getBonjour ERROR cannot connect to server " . + warn "Ivy::_getBonjour ERROR cannot connect to server " . "$peerName:$peerPort\n" ; } } |