use strict;
use warnings;
+use FindBin qw($Bin);
+use lib "$Bin";
# use Exporter;
use Sys::Syslog qw(syslog);
use Net::Server::PreFork;
my %transports = (
RAW => \&raw_transport,
telnet => \&telnet_transport,
- # http => \&http_transport, # for http just use the OPAC
);
#
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'",
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);
# 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 = '';