#!/usr/bin/env perl use v5.34.1; use strict; use warnings; use IO::Socket::UNIX; use Path::Tiny qw/path/; my $HOME = $ENV{HOME}; my $PACKET_HELLO = 0; my $fh = IO::Socket::UNIX->new( Type => SOCK_STREAM(), Peer => 'msgba.sock', ) || die "Can't open socket: $IO::Socket::errstr"; my $rom = path($HOME)->child('ruby.gba')->slurp; my $sav = path($HOME)->child('ruby.ss1')->slurp; my $packet_hello = ""; open my $fh_packet_hello, '>', \$packet_hello; write_packet_hello($fh_packet_hello, \$rom, \$sav); close $fh_packet_hello; my $packet = ""; open my $fh_packet, '>', \$packet; write_packet($fh_packet, $PACKET_HELLO, \$packet_hello); close $fh_packet; print $fh $packet; while (retrieve_packet($fh)) { } sub retrieve_packet { my $fh = shift; (read $fh, my $id, 8) or return 0; $id = unpack('Q>', $id); (read $fh, my $size, 8) or return 0; $size = unpack('Q>', $size); (read $fh, my $raw_data, $size) or return 0; say $id; say $size; return 1; } sub write_packet { my $fh = shift; my $id = shift; my $raw_data = ret_scalar(shift); print $fh pack('Q>', $id); print $fh pack('Q>', length $raw_data); print $fh $raw_data; } sub write_packet_hello { my $fh = shift or die "No file handle"; my $rom = ret_scalar(shift); my $save = ret_scalar(shift); my $rom_length = length $rom; my $save_length = length $save; say "Packet size = @{[16 + $rom_length + $save_length]}"; print $fh pack 'Q>', $rom_length; print $fh $rom; print $fh pack 'Q>', $save_length; print $fh $save; } sub ret_scalar { my $arg = shift; if (check_scalar_ref($arg)) { return ${$arg}; } die "No scalar ref"; } sub check_scalar_ref { my $arg = shift or die "Undefined scalar ref"; if ((ref $arg) eq 'SCALAR') { return 1; } return 0; }