#!/usr/bin/perl -w use strict; sub cat { my ($dir, $F1, $F2) = @_; for (;;) { if (!sysread $F1, $_, 4096) { return if $! == 11; #EAGAIN; print STDERR 'conn closed:', $! || 'EOF', "\n"; exit; } length == syswrite $F2, $_ or die; s/^\+//; s/^\$//; s/#..\Z//s; substr($_, 62) = '...' if length $_ > 64; print "$dir $_\n"; } } sub main_loop { my ($F1, $F2) = @_; # FIONBIO ioctl $F1, 0x5421, pack 'i!', 1 or die $!; ioctl $F2, 0x5421, pack 'i!', 1 or die $!; for (my $rfd = '';;) { vec($rfd, fileno $F1, 1) = 1; vec($rfd, fileno $F2, 1) = 1; 0 < select $rfd, undef, undef, undef or die; cat '=>', $F1, $F2 if vec $rfd, fileno $F1, 1; cat '<=', $F2, $F1 if vec $rfd, fileno $F2, 1; } } sub wait_for_connect { my $port = 0+shift; socket my $sk, 2,1,0 or return die "sock create: $!"; defined setsockopt $sk, 1,2,1 or return die "sock reuseaddr: $!"; bind $sk, pack 'Sna12', 2, $port, '' or return die "sock bind $port port: $!"; listen $sk, 2 or return die "sock listen: $!"; print "wait for connection on $port port ...\n"; accept my $conn, $sk or return die "sock accept: $!"; return $conn; } sub main { my $port = 2000; if (@_) { $port = shift; die "Usage: $0 [port]\n" if @_ || $port =~ /\D/; } my $conn = wait_for_connect $port or exit; sysopen my $ugdb, '/proc/ugdb', 2 or die 0; main_loop $conn, $ugdb; } main @ARGV;