diff options
Diffstat (limited to 'Spline/Socketmap.pm')
-rw-r--r-- | Spline/Socketmap.pm | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/Spline/Socketmap.pm b/Spline/Socketmap.pm new file mode 100644 index 0000000..df1a6a9 --- /dev/null +++ b/Spline/Socketmap.pm @@ -0,0 +1,65 @@ +package Spline::Socketmap; + +use strict; +use warnings; +use base qw(Net::Server::PreFork); + +use Spline::Netstring; +use Spline::Srs qw( srs_forward srs_reverse ); + +use base 'Exporter'; +our @EXPORT = qw( ); +our @EXPORT_OK = qw( ); + +our $timeout = 10; +our $handler = undef; + +sub call_handler(@) { + return unless ref($handler) eq 'CODE'; + return \&$handler(@_); +} + +sub handle_request($) { + my $data = shift; + + my ($map, $key) = split(/ /, $data, 2); + my $result = call_handler($map, $key); + if (defined $result) { + reply($result); + } + else { + reply('TEMP Protocol error'); + } +} + +sub process_request { + my $self = shift; + + eval { + local $SIG{'ALRM'} = sub { die "Timed Out!\n" }; + alarm($timeout); + + handle_request(netstring_read(*STDIN)); + alarm(0); + }; + my $err = $@; + alarm(0); + + + if ($err) { + if ($err =~ /timed out/i) { + reply('TEMP Timeout'); + } + else { + reply('TEMP Unknown error'); + } + } +} + +sub reply($) { + netstring_write(*STDOUT, @_); +} + +1; + +# vim: set et ts=4: |