X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;ds=sidebyside;f=C4%2FSIP%2FSIPServer.pm;h=44c58b42f0b633f7f1d43d1535d2e2f2e3c8ecb2;hb=8e485c6112756f3fe8404d9d4d700535f0e87306;hp=bab51e894293ccf655c5bcf11158277102aee6dc;hpb=7183a241c4f696c0f7cea9868ee82573328fe98a;p=koha_fer diff --git a/C4/SIP/SIPServer.pm b/C4/SIP/SIPServer.pm index bab51e8942..44c58b42f0 100644 --- a/C4/SIP/SIPServer.pm +++ b/C4/SIP/SIPServer.pm @@ -2,6 +2,8 @@ package SIPServer; use strict; use warnings; +use FindBin qw($Bin); +use lib "$Bin"; # use Exporter; use Sys::Syslog qw(syslog); use Net::Server::PreFork; @@ -35,7 +37,6 @@ BEGIN { my %transports = ( RAW => \&raw_transport, telnet => \&telnet_transport, - # http => \&http_transport, # for http just use the OPAC ); # @@ -126,31 +127,18 @@ sub raw_transport { my $self = shift; my ($input); my $service = $self->{service}; - my $strikes = 3; - eval { - local $SIG{ALRM} = sub { die "raw_transport Timed Out!\n"; }; - syslog("LOG_DEBUG", "raw_transport: timeout is %d", $service->{timeout}); - while ($strikes--) { - alarm $service->{timeout}; - $input = Sip::read_SIP_packet(*STDIN); - alarm 0; - if (!$input) { - # EOF on the socket - syslog("LOG_INFO", "raw_transport: shutting down: EOF during login"); - return; - } - $input =~ s/[\r\n]+$//sm; # Strip off trailing line terminator(s) - last if Sip::MsgType::handle($input, $self, LOGIN); - } - }; - - if (length $@) { - syslog("LOG_ERR", "raw_transport: LOGIN ERROR: '$@'"); - die "raw_transport: login error (timeout? $@), exiting"; - } elsif (!$self->{account}) { - syslog("LOG_ERR", "raw_transport: LOGIN FAILED"); - die "raw_transport: Login failed (no account), exiting"; + while (!$self->{account}) { + local $SIG{ALRM} = sub { die "raw_transport Timed Out!\n"; }; + syslog("LOG_DEBUG", "raw_transport: timeout is %d", $service->{timeout}); + $input = Sip::read_SIP_packet(*STDIN); + if (!$input) { + # EOF on the socket + syslog("LOG_INFO", "raw_transport: shutting down: EOF during login"); + return; + } + $input =~ s/[\r\n]+$//sm; # Strip off trailing line terminator(s) + last if Sip::MsgType::handle($input, $self, LOGIN); } syslog("LOG_DEBUG", "raw_transport: uname/inst: '%s/%s'", @@ -161,7 +149,7 @@ sub raw_transport { syslog("LOG_INFO", "raw_transport: shutting down"); } -sub get_clean_string ($) { +sub get_clean_string { my $string = shift; if (defined $string) { syslog("LOG_DEBUG", "get_clean_string pre-clean(length %s): %s", length($string), $string); @@ -269,32 +257,29 @@ sub sip_protocol_loop { # In short, we'll take any valid message here. #my $expect = SC_STATUS; my $expect = ''; - my $strikes = 3; - while ($input = Sip::read_SIP_packet(*STDIN)) { + while (1) { + $input = Sip::read_SIP_packet(*STDIN); + unless ($input) { + return; # EOF + } # begin input hacks ... a cheap stand in for better Telnet layer $input =~ s/^[^A-z0-9]+//s; # Kill leading bad characters... like Telnet handshakers $input =~ s/[^A-z0-9]+$//s; # Same on the end, should get DOSsy ^M line-endings too. while (chomp($input)) {warn "Extra line ending on input";} unless ($input) { - if ($strikes--) { - syslog("LOG_ERR", "sip_protocol_loop: empty input skipped"); - next; - } else { - syslog("LOG_ERR", "sip_protocol_loop: quitting after too many errors"); - die "sip_protocol_loop: quitting after too many errors"; - } + syslog("LOG_ERR", "sip_protocol_loop: empty input skipped"); + print("96$CR"); + next; } # end cheap input hacks my $status = Sip::MsgType::handle($input, $self, $expect); if (!$status) { syslog("LOG_ERR", "sip_protocol_loop: failed to handle %s",substr($input,0,2)); - die "sip_protocol_loop: failed Sip::MsgType::handle('$input', $self, '$expect')"; } next if $status eq REQUEST_ACS_RESEND; if ($expect && ($status ne $expect)) { # We received a non-"RESEND" that wasn't what we were expecting. syslog("LOG_ERR", "sip_protocol_loop: expected %s, received %s, exiting", $expect, $input); - die "sip_protocol_loop: exiting: expected '$expect', received '$status'"; } # We successfully received and processed what we were expecting $expect = '';