EQGRP/archive_files/tftpd-on-target-linux-solaris/up/i686-pc-linux-gnu-redhat-7.0/netReceiveServer.pl

92 lines
2.1 KiB
Perl
Executable file

#!/usr/bin/perl
#
# netReceiveServer.pl
#
# usage:
#
# netReceiveServer.pl [<port>] [<filename>]
#
# Default <port>: 6666
# Default <filename>: "cisco-config"
#
# Listens on the supplied port for connections. When one arrives,
# copies the stream on the connection to the supplied filename.
# A one up from one number is appended to the filenames.
#
# To test, in another window run:
#
# nc localhost 6666 <cisco-config
#
use Socket;
$port = shift || 6666;
$outputFilename = shift || "cisco-config";
$outputFilenumber = 0;
sub makeNextFilename {
$doneLooping = 0;
while(not $doneLooping) {
$outputFilenumber++;
$trial = "$outputFilename.$outputFilenumber";
open(TRIAL, "<$trial") || $doneLooping++;
$doneLooping || close TRIAL;
}
}
$proto = getprotobyname('tcp');
($port) = $port =~ /^(\d+)$/ or die "invalid port";
print "Port is $port\n";
socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
bind(Server, sockaddr_in($port, INADDR_LOOPBACK)) || die "bind: $!";
listen(Server,SOMAXCONN) || die "listen: $!";
use POSIX ":sys_wait_h";
sub REAPER {
my $child;
while (($waitedpid = waitpid(-1,WNOHANG)) > 0) {
# print "reaped $waitedpid" . ($? ? " with exit $?" : '');
# print "\n";
}
$SIG{CHLD} = \&REAPER; # loathe sysV
}
$SIG{CHLD} = \&REAPER;
for ($waitedpid = 0;
($paddr = accept(Client,Server)) || $waitedpid;
$waitedpid = 0, close Client) {
next if $waitedpid and not $paddr;
($port,$iaddr) = sockaddr_in($paddr);
$name = gethostbyaddr($iaddr,AF_INET);
print "Connect from $name\n";
makeNextFilename;
$pid = fork;
next if $pid;
$bytesReceived = 0;
open(OUTPUT, ">$outputFilename.$outputFilenumber") || die "open: $!";
while(($rc = sysread Client, $buf, 512) > 0) {
syswrite OUTPUT, $buf, $rc;
$bytesReceived += $rc;
}
close Client;
close OUTPUT;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime(time);
$now = sprintf "%02d:%02d:%02d", $hour, $min, $sec;
print "$now Received file $outputFilename.$outputFilenumber ($bytesReceived bytes)\n";
exit 0;
}
exit 0;