-sub _cat_async_step ($$$) {
- my ($self, $inflight, $in) = @_;
- my $pair = shift @$inflight or die 'BUG: inflight empty';
- my ($cb, $arg) = @$pair;
- local $/ = "\n";
- my $head = $in->getline;
+sub my_readline ($$) {
+ my ($fh, $rbuf) = @_;
+ while (1) {
+ if ((my $n = index($$rbuf, "\n")) >= 0) {
+ return substr($$rbuf, 0, $n + 1, '');
+ }
+ my $r = sysread($fh, $$rbuf, $PIPE_BUFSIZ, length($$rbuf));
+ next if $r || (!defined($r) && $! == EINTR);
+ return defined($r) ? '' : undef; # EOF or error
+ }
+}
+
+sub cat_async_step ($$) {
+ my ($self, $inflight) = @_;
+ die 'BUG: inflight empty or odd' if scalar(@$inflight) < 2;
+ my ($cb, $arg) = splice(@$inflight, 0, 2);
+ my $head = my_readline($self->{in}, $self->{'--batch'});