# start quick and EXTREMELY dirty xmodem transfert sub xmodemrecv { print $sock "\x15"; #NAK A000: while(1) { SOH: while(1) { if (sysread($sock,$buf,1) <= 0) { die "*** died$! ***\n"; } #SOH last SOH if ( $buf eq "\x01" ) || ( $buf eq "\x04" ) } # leave if last byte received is an EOT last A000 if ($buf eq "\x04"); # last byte received was SOH if (sysread($sock,$buf,1) <= 0) { die "*** died$! ***\n"; } $seq = unpack("c",$buf); if (sysread($sock,$buf,1) <= 0) { die "*** died$! ***\n"; } $cseq = unpack("c",$buf); $mseq = - ($seq & 255) -1; # just for fun we calculate the cmpl seq as well if (sysread($sock,$buf,128) <= 0) { die "*** died$! ***\n"; } $sum = 0; for ($i = 0; $i < 128; $i++) { $sum += unpack("c",substr($buf,$i,1)); } $sum = pack("c",($sum & 255)); print "$buf"; if (sysread($sock,$buf,1) <= 0) { die "*** died$! ***\n"; } $crc = $buf; if ($crc eq $sum) { # packet ok print $sock "\x06"; #ACK } else { # packet nok - crc differs print $sock "\x15"; #NAK } } print $sock "\x06"; #ACK }