summaryrefslogtreecommitdiff
path: root/Ivy.pm
diff options
context:
space:
mode:
authorchatty1999-01-08 10:21:38 +0000
committerchatty1999-01-08 10:21:38 +0000
commit9609c859ff4e5eab04e7ea9429086ad8dc12f6ef (patch)
tree16fdc8209d5b20fe26bc1f8988d62a508ecf2f3b /Ivy.pm
parentaa276044c03db222f8c5d25cec55623249e4ff0f (diff)
downloadivy-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
Diffstat (limited to 'Ivy.pm')
-rw-r--r--Ivy.pm76
1 files changed, 47 insertions, 29 deletions
diff --git a/Ivy.pm b/Ivy.pm
index 593b3bb..dd9fd2f 100644
--- a/Ivy.pm
+++ b/Ivy.pm
@@ -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" ;
}
}