home *** CD-ROM | disk | FTP | other *** search
- package network;
- $version = "950311.5";
-
-
-
- sub connect_to
- {
- local(*FD, $arg1, $arg2) = @_;
- local($from, $to) = ($arg1, $arg2); ## for one interpretation.
- local($host, $port) = ($arg1, $arg2); ## for the other
-
- if (defined($to) && length($from)==16 && length($to)==16) {
- } elsif (defined($host)) {
- $to = &get_addr($host, $port);
- return qq/unknown address "$host"/ unless defined $to;
- $from = &my_addr;
- } else {
- return "unknown arguments to network'connect_to";
- }
-
- return "connect_to failed (socket: $!)" unless &my_inet_socket(*FD);
- return "connect_to failed (bind: $!)" unless bind(FD, $from);
- return "connect_to failed (connect: $!)" unless connect(FD, $to);
- local($old) = select(FD); $| = 1; select($old);
- undef;
- }
-
-
-
- sub listen_at
- {
- local(*FD, $port) = @_;
- local($empty) = pack('S n a4 x8', 2 ,$port, "\0\0\0\0");
- return "listen_for failed (socket: $!)" unless &my_inet_socket(*FD);
- return "listen_for failed (bind: $!)" unless bind(FD, $empty);
- return "listen_for failed (listen: $!)" unless listen(FD, 5);
- local($old) = select(FD); $| = 1; select($old);
- undef;
- }
-
-
- sub addr_to_ascii
- {
- local($addr) = @_;
- return "bad arg" if length $addr != 16;
- return join('.', unpack("CCCC", (unpack('S n a4 x8', $addr))[2]));
- }
-
- sub get_addr
- {
- local($host, $port) = @_;
- return $addr{$host,$port} if defined $addr{$host,$port};
- local($addr);
-
- if ($host =~ m/^\d+\.\d+\.\d+\.\d+$/)
- {
- $addr = pack("C4", split(/\./, $host));
- }
- elsif ($addr = (gethostbyname($host))[4], !defined $addr)
- {
- local(@lookup) = `nslookup $host 2>&1`;
- if (@lookup)
- {
- local($lookup) = join('', @lookup[2 .. $#lookup]);
- if ($lookup =~ m/^Address:\s*(\d+\.\d+\.\d+\.\d+)/) {
- $addr = pack("C4", split(/\./, $1));
- }
- }
- if (!defined $addr) {
- return undef;
- }
- }
- $addr{$host,$port} = pack('S n a4 x8', 2 ,$port, $addr);
- }
-
-
- sub my_addr
- {
- local(@x) = gethostbyname('localhost');
- local(@y) = gethostbyname($x[0]);
- return pack('S n a4 x8', 2 ,0, $y[4]);
- }
-
-
- sub my_inet_socket
- {
- local(*FD) = @_;
- local($socket);
-
- if (!defined $socket_values_queried)
- {
- if (!defined &main'_SYS_SOCKET_H_) {
- eval 'package main;
- local($^W) = 0;
- require("sys/socket.ph")||require("socket.ph");';
- }
-
- $PF_INET = defined &main'PF_INET ? &main'PF_INET : 2;
- $AF_NS = defined &main'AF_NS ? &main'AF_NS : 6;
- $SOCK_STREAM = &main'SOCK_STREAM if defined &main'SOCK_STREAM;
-
- $socket_values_queried = 1;
- }
-
- if (defined $SOCK_STREAM) {
- $socket = socket(FD, $PF_INET, $SOCK_STREAM, $AF_NS);
- } else {
- $socket = socket(FD, $PF_INET, 1, $AF_NS);
- if ($socket) {
- $SOCK_STREAM = 1; ## got it.
- } elsif ($! =~ m/not supported/i) {
- $socket = socket(FD, $PF_INET, $SOCK_STREAM = 2, $AF_NS);
- }
- }
- $socket;
- }
-
- sub dummy {
- 1 || $version || &dummy;
- }
-
- 1;
- __END__
-