Commit | Line | Data |
---|---|---|
99fb1867 IJ |
1 | #!/usr/bin/perl -w |
2 | ||
3 | use strict; | |
4 | use POSIX; | |
5 | ||
6 | open R, '/dev/urandom' or die $!; | |
7 | ||
8 | system 'cat >/dev/null &'; | |
9 | ||
10 | sub randbytes ($) { | |
11 | my ($count) = @_; | |
12 | my $s; | |
13 | my $r = read R, $s, $count; | |
14 | die $! unless $r==$count; | |
15 | return $s; | |
16 | } | |
17 | ||
18 | sub randbyteval () { | |
19 | my $b = randbytes 1; | |
20 | my ($r) = unpack 'C', $b; | |
21 | return $r; | |
22 | } | |
23 | ||
24 | sub randvalue ($$) { | |
25 | my ($min,$maxplus1) = @_; | |
26 | my $b = randbyteval; | |
27 | return floor(($b/256.0) * ($maxplus1-$min)) + $min; | |
28 | } | |
29 | ||
30 | for (;;) { | |
31 | my $lenbits = randvalue 0,14; | |
32 | my $len= (randbyteval << 8) | randbyteval; | |
33 | $len &= (1 << $lenbits)-1; | |
34 | my $data = randbytes $len; | |
35 | if (randbyteval >= 0x80) { | |
36 | $data =~ s{[\xc0\xdb]}{ | |
37 | $& eq "\xc0" ? "\xcb\xdc" : | |
38 | $& eq "\xdb" ? "\xcb\xdd" : | |
39 | die | |
40 | }ge; | |
41 | } | |
42 | print "\xc0"; | |
43 | print $data; | |
44 | STDOUT->flush; | |
45 | } |