summaryrefslogtreecommitdiff
path: root/storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/ServerINET.pm
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/ServerINET.pm')
-rw-r--r--storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/ServerINET.pm116
1 files changed, 116 insertions, 0 deletions
diff --git a/storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/ServerINET.pm b/storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/ServerINET.pm
new file mode 100644
index 00000000000..a065c186855
--- /dev/null
+++ b/storage/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/ServerINET.pm
@@ -0,0 +1,116 @@
+package NDB::Net::ServerINET;
+
+use strict;
+use Carp;
+use Socket;
+
+require NDB::Net::Server;
+
+use vars qw(@ISA);
+@ISA = qw(NDB::Net::Server);
+
+# constructors
+
+my $log;
+
+sub initmodule {
+ $log = NDB::Util::Log->instance;
+}
+
+NDB::Net::ServerINET->attributes(
+ host => sub { s/^\s+|\s+$//g; /^\S+$/ },
+ port => sub { s/^\s+|\s+$//g; /^\d+$/ },
+ canon => sub { s/^\s+|\s+$//g; /^\S+$/ },
+ aliases => sub { ref($_) eq 'ARRAY' },
+);
+
+
+sub desc {
+ my $server = shift;
+ my $id = $server->getid;
+ my $host = $server->gethost;
+ return "server $id at $host";
+}
+
+sub new {
+ my $class = shift;
+ @_ % 2 == 0 or confess 0+@_;
+ my(%attr) = @_;
+ my $server = $class->SUPER::new(%attr);
+ $server->setid($attr{id})
+ or $log->push, return undef;
+ $server->setdomain(PF_INET)
+ or $log->push, return undef;
+ $server->sethost($attr{host})
+ or $log->push, return undef;
+ $server->setport($attr{port})
+ or $log->push, return undef;
+ my($canon, $aliases) = gethostbyname($server->gethost);
+ if (! defined($canon)) {
+ $log->put("%s: unknown host", $server->gethost);
+ return undef;
+ }
+ $server->setcanon($canon)
+ or $log->push, return undef;
+ $server->setaliases([ split(' ', $aliases) ])
+ or $log->push, return undef;
+ $server->add or
+ $log->push, return undef;
+ $log->put("added")->push($server)->debug;
+ return $server;
+}
+
+# find matching servers
+
+sub match {
+ my $class = shift;
+ @_ == 3 or confess 0+@_;
+ my($host, $port, $servers) = @_;
+ if (! defined($port) && $host =~ /:/) {
+ ($host, $port) = split(/:/, $host, 2);
+ }
+ $host =~ s/^\s+|\s+$//g;
+ my($canon) = gethostbyname($host);
+ unless (defined($canon)) {
+ $log->put("$host: unknown host");
+ return undef;
+ }
+ my $hostport = $host;
+ if (defined($port)) {
+ $port =~ s/^\s+|\s+$//g;
+ $port =~ /\d+$/
+ or $log->put("$port: non-numeric port"), return undef;
+ $hostport .= ":$port";
+ }
+ my @server = ();
+ for my $s (@$servers) {
+ ($s->getdomain == PF_INET) || next;
+ ($s->getcanon eq $canon) || next;
+ ($port && $s->getport != $port) && next;
+ push(@server, $s);
+ }
+ if (! @server) {
+ $log->put("$hostport: no server found");
+ }
+ if (@server > 1) {
+ $log->put("$hostport: multiple servers at ports ",
+ join(' ', map($_->getport, @server)));
+ }
+ return \@server;
+}
+
+# client side
+
+sub connect {
+ my $server = shift;
+ @_ == 0 or confess 0+@_;
+ my $socket;
+ $socket = NDB::Util::SocketINET->new or
+ $log->push, return undef;
+ $socket->connect($server->gethost, $server->getport) or
+ $log->push, return undef;
+ return $socket;
+}
+
+1;
+# vim:set sw=4: