improve get_pkt() code in bridge perl lib.
- length filter for received packets - no more in-band signalling - allow new packet types
This commit is contained in:
parent
2b5341713b
commit
4f859c82a0
|
@ -16,11 +16,17 @@ our $bridge; # Open device
|
||||||
our $quiet=0;
|
our $quiet=0;
|
||||||
our $timediff=60*60*2;
|
our $timediff=60*60*2;
|
||||||
|
|
||||||
|
my $rxlen=0; # Filter for get_pkt()
|
||||||
|
|
||||||
### Utility
|
### Utility
|
||||||
sub sprint{
|
sub sprint{
|
||||||
return join("",map {
|
return join("",map {
|
||||||
if (ord($_)>30 && ord($_)<127){
|
if (ord($_)>30 && ord($_)<127){
|
||||||
|
if(ord($_)==92){
|
||||||
|
"\\\\";
|
||||||
|
}else{
|
||||||
$_;
|
$_;
|
||||||
|
};
|
||||||
}else{
|
}else{
|
||||||
# "[x".unpack("H*",$_)."]";
|
# "[x".unpack("H*",$_)."]";
|
||||||
"\\".unpack("C",$_);
|
"\\".unpack("C",$_);
|
||||||
|
@ -93,8 +99,9 @@ sub writebeacon{
|
||||||
### Packet mgmt
|
### Packet mgmt
|
||||||
|
|
||||||
our $buffer;
|
our $buffer;
|
||||||
our $firstpkt=2;
|
our $firstpkt=1;
|
||||||
sub get_packet{
|
sub get_data{
|
||||||
|
my $filter=shift||0;
|
||||||
sub _get_bytes{
|
sub _get_bytes{
|
||||||
my $rr;
|
my $rr;
|
||||||
sysread($bridge,$rr,1024);
|
sysread($bridge,$rr,1024);
|
||||||
|
@ -102,25 +109,33 @@ sub get_packet{
|
||||||
select(undef,undef,undef,0.05);
|
select(undef,undef,undef,0.05);
|
||||||
};
|
};
|
||||||
$buffer.=$rr;
|
$buffer.=$rr;
|
||||||
|
# print "recv: ",unpack("H*",$rr),"\n";
|
||||||
};
|
};
|
||||||
|
|
||||||
my $cnt=0;
|
my $cnt=0;
|
||||||
while(1){
|
while(1){
|
||||||
if(length($buffer)<2){
|
if(length($buffer)<2){
|
||||||
_get_bytes();
|
_get_bytes();
|
||||||
}elsif($buffer !~ /^\\[12]/){
|
}elsif($buffer !~ /^\\[1-9]/){
|
||||||
$buffer=~s/^(.[^\\]*)//s;
|
if($buffer =~ /[^\\]\\[1-9]/){
|
||||||
|
$buffer =~ s/^(.*?[^\\])(\\[1-9])/\2/s;
|
||||||
|
}else{
|
||||||
|
$buffer = s/(.*)//s;
|
||||||
|
};
|
||||||
if($firstpkt){
|
if($firstpkt){
|
||||||
$firstpkt--;
|
$firstpkt--;
|
||||||
}else{
|
}else{
|
||||||
print STDERR "Unparseable stuff: <",sprint($1),">\n" if(!$quiet);
|
print STDERR "Unparseable stuff: <",sprint($1),">\n" if(!$quiet);
|
||||||
};
|
};
|
||||||
}elsif ($buffer =~ s/^\\2\\0//s){
|
}elsif ($buffer =~ s/^\\(\d)(.*?)\\0//s){
|
||||||
return 'ack'; # In-band signalling. Evil %)
|
my ($type,$str)=($1,$2);
|
||||||
}elsif ($buffer =~ s/^\\1(.*?)\\0//s){
|
|
||||||
my $str=$1;
|
|
||||||
$str=~s/\\\\/\\/g; # dequote
|
$str=~s/\\\\/\\/g; # dequote
|
||||||
|
# print STDERR "ret:pkt[$type]=",(sprint $str),"\n";
|
||||||
|
if($filter==0){
|
||||||
|
return ($type,$str);
|
||||||
|
}elsif($filter==$type){
|
||||||
return $str;
|
return $str;
|
||||||
|
};
|
||||||
}else{
|
}else{
|
||||||
_get_bytes();
|
_get_bytes();
|
||||||
};
|
};
|
||||||
|
@ -132,6 +147,16 @@ sub get_packet{
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sub get_packet{
|
||||||
|
my $pkt;
|
||||||
|
while(1){
|
||||||
|
$pkt=get_data(1);
|
||||||
|
if($rxlen==0 || length($pkt)==$rxlen){
|
||||||
|
return $pkt;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
sub rest{
|
sub rest{
|
||||||
if(length($buffer)>0){
|
if(length($buffer)>0){
|
||||||
print "rest: <", sprint($buffer), ">\n" if(!$quiet);
|
print "rest: <", sprint($buffer), ">\n" if(!$quiet);
|
||||||
|
@ -271,6 +296,7 @@ sub nice_beacon{
|
||||||
$out->{string}=sprintf "NICK beacon=%s nick=%s",
|
$out->{string}=sprintf "NICK beacon=%s nick=%s",
|
||||||
$out->{beacon},
|
$out->{beacon},
|
||||||
$out->{nick};
|
$out->{nick};
|
||||||
|
addbeacon($out->{beacon},$out->{nick});
|
||||||
}else{
|
}else{
|
||||||
$out->{string}="<?:".unpack("H*",$pkt).">";
|
$out->{string}="<?:".unpack("H*",$pkt).">";
|
||||||
};
|
};
|
||||||
|
@ -332,15 +358,16 @@ sub set_channel {
|
||||||
send_pkt_num(pack("C",shift),5);
|
send_pkt_num(pack("C",shift),5);
|
||||||
};
|
};
|
||||||
sub set_rxlen {
|
sub set_rxlen {
|
||||||
|
$rxlen=$_[0];
|
||||||
send_pkt_num(pack("C",shift),6);
|
send_pkt_num(pack("C",shift),6);
|
||||||
};
|
};
|
||||||
|
|
||||||
sub wait_ok {
|
sub wait_ok {
|
||||||
my $pkt;
|
my ($type,$pkt);
|
||||||
$pkt=get_packet();
|
($type,$pkt)=get_data();
|
||||||
while($pkt ne "ack"){
|
while($type ne "2"){
|
||||||
print "pkt=",(sprint $pkt),"\n";
|
print "pkt[$type]=[",length($pkt),"]",(sprint $pkt),"\n";
|
||||||
$pkt=get_packet();
|
($type,$pkt)=get_data();
|
||||||
};
|
};
|
||||||
print "ok!\n";
|
print "ok!\n";
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue