stas 2004/06/09 07:46:22
Modified: . Changes lib/Apache compat.pm t/conf modperl_extra.pl t/filter/TestFilter in_bbs_body.pm in_bbs_consume.pm in_bbs_inject_header.pm in_bbs_msg.pm in_bbs_underrun.pm out_bbs_basic.pm out_bbs_ctx.pm t/protocol/TestProtocol echo_bbs.pm echo_bbs2.pm echo_block.pm echo_timeout.pm eliza.pm t/response/TestAPR brigade.pm bucket.pm flatten.pm t/response/TestError runtime.pm todo release xs/APR/Brigade APR__Brigade.h xs/APR/Bucket APR__Bucket.h xs/APR/Socket APR__Socket.h xs/maps apr_functions.map xs/tables/current/ModPerl FunctionTable.pm Log: - $socket->recv(), $bucket->read() and $bucket->flatten are now all return the number of bytes read and fill the buffer passed as an argument with the read data - flatten() throws APR::Error exceptions Revision Changes Path 1.389 +7 -3 modperl-2.0/Changes Index: Changes =================================================================== RCS file: /home/cvs/modperl-2.0/Changes,v retrieving revision 1.388 retrieving revision 1.389 diff -u -u -r1.388 -r1.389 --- Changes 4 Jun 2004 09:38:07 -0000 1.388 +++ Changes 9 Jun 2004 14:46:21 -0000 1.389 @@ -12,7 +12,8 @@ =item 1.99_15-dev -provide a workaround for a bug in perl's newSVpvn, so that now +APR::Socket::recv() now returns the length of the read data [Stas] + APR::Bucket's read() returns "" instead of undef when there is no data to read. [Stas] @@ -74,10 +75,13 @@ - destroy() now throws APR::Error exception (not returning rc) - rename empty => is_empty - added the method cleanup() + - flatten() now returns the number of bytes read (and passed the + buffer by the argument) and throws APR::Error exception APR::Bucket: [Stas] - - read() now returns read data and throws APR::Error exception (not - returning rc). The returned scalar is now TAINTED. + - read() now returns the length of the read data and throws + APR::Error exception (not returning rc). The returned scalar is + now TAINTED. - type->name now has a module APR::BucketType - type(), length(), start(), data() are now all readonly - new() fix a bug in offset handling 1.108 +2 -2 modperl-2.0/lib/Apache/compat.pm Index: compat.pm =================================================================== RCS file: /home/cvs/modperl-2.0/lib/Apache/compat.pm,v retrieving revision 1.107 retrieving revision 1.108 diff -u -u -r1.107 -r1.108 --- compat.pm 4 Jun 2004 09:34:46 -0000 1.107 +++ compat.pm 9 Jun 2004 14:46:21 -0000 1.108 @@ -501,8 +501,8 @@ last; } - my $buf = $b->read; - $data .= $buf if length $buf; + $b->read(my $buf); + $data .= $buf; } } while (!$seen_eos); 1.52 +4 -3 modperl-2.0/t/conf/modperl_extra.pl Index: modperl_extra.pl =================================================================== RCS file: /home/cvs/modperl-2.0/t/conf/modperl_extra.pl,v retrieving revision 1.51 retrieving revision 1.52 diff -u -u -r1.51 -r1.52 --- modperl_extra.pl 4 Jun 2004 09:35:37 -0000 1.51 +++ modperl_extra.pl 9 Jun 2004 14:46:21 -0000 1.52 @@ -164,9 +164,9 @@ last; } - my $buf = $b->read; + $b->read(my $buf); warn "read_post: DATA bucket: [$buf]\n" if $debug; - $data .= $buf if length $buf; + $data .= $buf; } } while (!$seen_eos); @@ -273,7 +273,8 @@ my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { - push @data, $b->type->name, $b->read; + $b->read(my $bdata); + push @data, $b->type->name, $bdata; } # send the sniffed info to STDERR so not to interfere with normal 1.6 +1 -1 modperl-2.0/t/filter/TestFilter/in_bbs_body.pm Index: in_bbs_body.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_body.pm,v retrieving revision 1.5 retrieving revision 1.6 diff -u -u -r1.5 -r1.6 --- in_bbs_body.pm 1 Jun 2004 23:36:16 -0000 1.5 +++ in_bbs_body.pm 9 Jun 2004 14:46:21 -0000 1.6 @@ -34,7 +34,7 @@ last; } - if (my $data = $bucket->read) { + if ($bucket->read(my $data)) { #warn"[$data]\n"; $bucket = APR::Bucket->new(scalar reverse $data); } 1.5 +1 -2 modperl-2.0/t/filter/TestFilter/in_bbs_consume.pm Index: in_bbs_consume.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_consume.pm,v retrieving revision 1.4 retrieving revision 1.5 diff -u -u -r1.4 -r1.5 --- in_bbs_consume.pm 1 Jun 2004 23:36:16 -0000 1.4 +++ in_bbs_consume.pm 9 Jun 2004 14:46:21 -0000 1.5 @@ -75,8 +75,7 @@ my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $seen_eos++, last if $b->is_eos; - my $bdata = $b->read; - $bdata = '' unless defined $bdata; + $b->read(my $bdata); push @data, $bdata; } return (join('', @data), $seen_eos); 1.9 +2 -2 modperl-2.0/t/filter/TestFilter/in_bbs_inject_header.pm Index: in_bbs_inject_header.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_inject_header.pm,v retrieving revision 1.8 retrieving revision 1.9 diff -u -u -r1.8 -r1.9 --- in_bbs_inject_header.pm 21 May 2004 22:01:16 -0000 1.8 +++ in_bbs_inject_header.pm 9 Jun 2004 14:46:21 -0000 1.9 @@ -63,7 +63,7 @@ if (1) { # extra debug, wasting cycles - my $data = $bucket->read; + $bucket->read(my $data); debug "injected header: [$data]"; } else { @@ -166,7 +166,7 @@ last; } - my $data = $bucket->read; + $bucket->read(my $data); debug "filter read:\n[$data]"; # check that we really work only on the headers 1.10 +1 -1 modperl-2.0/t/filter/TestFilter/in_bbs_msg.pm Index: in_bbs_msg.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_msg.pm,v retrieving revision 1.9 retrieving revision 1.10 diff -u -u -r1.9 -r1.10 --- in_bbs_msg.pm 1 Jun 2004 23:36:16 -0000 1.9 +++ in_bbs_msg.pm 9 Jun 2004 14:46:21 -0000 1.10 @@ -38,7 +38,7 @@ last; } - my $data = $bucket->read; + $bucket->read(my $data); debug "FILTER READ:\n$data"; if ($data and $data =~ s,GET $from_url,GET $to_url,) { 1.8 +1 -2 modperl-2.0/t/filter/TestFilter/in_bbs_underrun.pm Index: in_bbs_underrun.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/in_bbs_underrun.pm,v retrieving revision 1.7 retrieving revision 1.8 diff -u -u -r1.7 -r1.8 --- in_bbs_underrun.pm 1 Jun 2004 23:36:16 -0000 1.7 +++ in_bbs_underrun.pm 9 Jun 2004 14:46:21 -0000 1.8 @@ -121,8 +121,7 @@ my @data; for (my $b = $bb->first; $b; $b = $bb->next($b)) { $seen_eos++, last if $b->is_eos; - my $bdata = $b->read; - $bdata = '' unless defined $bdata; + $b->read(my $bdata); push @data, $bdata; } return (join('', @data), $seen_eos); 1.5 +1 -1 modperl-2.0/t/filter/TestFilter/out_bbs_basic.pm Index: out_bbs_basic.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_bbs_basic.pm,v retrieving revision 1.4 retrieving revision 1.5 diff -u -u -r1.4 -r1.5 --- out_bbs_basic.pm 21 May 2004 18:40:50 -0000 1.4 +++ out_bbs_basic.pm 9 Jun 2004 14:46:21 -0000 1.5 @@ -32,7 +32,7 @@ for (my $bucket = $bb->first; $bucket; $bucket = $bb->next($bucket)) { ok $bucket->type->name; ok $bucket->length == 2; - my $data = $bucket->read; + $bucket->read(my $data); ok (defined $data and $data eq 'ok'); } 1.6 +1 -2 modperl-2.0/t/filter/TestFilter/out_bbs_ctx.pm Index: out_bbs_ctx.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/filter/TestFilter/out_bbs_ctx.pm,v retrieving revision 1.5 retrieving revision 1.6 diff -u -u -r1.5 -r1.6 --- out_bbs_ctx.pm 21 May 2004 18:40:50 -0000 1.5 +++ out_bbs_ctx.pm 9 Jun 2004 14:46:21 -0000 1.6 @@ -43,8 +43,7 @@ last; } - my $bdata = $bucket->read; - if (defined $bdata) { + if ($bucket->read(my $bdata)) { $data .= $bdata; my $len = length $data; 1.2 +1 -2 modperl-2.0/t/protocol/TestProtocol/echo_bbs.pm Index: echo_bbs.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_bbs.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -u -r1.1 -r1.2 --- echo_bbs.pm 3 Jun 2004 08:20:50 -0000 1.1 +++ echo_bbs.pm 9 Jun 2004 14:46:22 -0000 1.2 @@ -47,8 +47,7 @@ last; } - my $data = $bucket->read; - if (length $data) { + if ($bucket->read(my $data)) { last if $data =~ /^[\r\n]+$/; $bucket = APR::Bucket->new(uc $data); } 1.2 +1 -1 modperl-2.0/t/protocol/TestProtocol/echo_bbs2.pm Index: echo_bbs2.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_bbs2.pm,v retrieving revision 1.1 retrieving revision 1.2 diff -u -u -r1.1 -r1.2 --- echo_bbs2.pm 4 Jun 2004 04:12:53 -0000 1.1 +++ echo_bbs2.pm 9 Jun 2004 14:46:22 -0000 1.2 @@ -36,7 +36,7 @@ last; } - my $data = $bb_in->flatten; + next unless $bb_in->flatten(my $data); $bb->cleanup; #warn "read: [$data]\n"; last if $data =~ /^[\r\n]+$/; 1.6 +2 -6 modperl-2.0/t/protocol/TestProtocol/echo_block.pm Index: echo_block.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_block.pm,v retrieving revision 1.5 retrieving revision 1.6 diff -u -u -r1.5 -r1.6 --- echo_block.pm 3 Jun 2004 08:22:21 -0000 1.5 +++ echo_block.pm 9 Jun 2004 14:46:22 -0000 1.6 @@ -31,12 +31,8 @@ or die "failed to set blocking mode"; } - while (1) { - my $buff = $socket->recv(BUFF_LEN); - last unless length $buff; # EOF - - my $wlen = $socket->send($buff); - last if $wlen != length $buff; # write failure? + while ($socket->recv(my $buff, BUFF_LEN)) { + $socket->send($buff); } Apache::OK; 1.5 +3 -3 modperl-2.0/t/protocol/TestProtocol/echo_timeout.pm Index: echo_timeout.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/echo_timeout.pm,v retrieving revision 1.4 retrieving revision 1.5 diff -u -u -r1.4 -r1.5 --- echo_timeout.pm 3 Jun 2004 08:22:21 -0000 1.4 +++ echo_timeout.pm 9 Jun 2004 14:46:22 -0000 1.5 @@ -29,20 +29,20 @@ $socket->timeout_set(20_000_000); while (1) { - my $buff = eval { $socket->recv(BUFF_LEN) }; + my $buff; + my $rlen = eval { $socket->recv($buff, BUFF_LEN) }; if ($@) { die "timed out, giving up: $@" if $@ == APR::TIMEUP; die $@; } - last unless length $buff; # EOF + last unless $rlen; # EOF my $wlen = eval { $socket->send($buff) }; if ($@) { die "timed out, giving up: $@" if $@ == APR::TIMEUP; die $@; } - last if $wlen != length $buff; # write failure? } Apache::OK; 1.7 +1 -4 modperl-2.0/t/protocol/TestProtocol/eliza.pm Index: eliza.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/protocol/TestProtocol/eliza.pm,v retrieving revision 1.6 retrieving revision 1.7 diff -u -u -r1.6 -r1.7 --- eliza.pm 4 May 2004 06:14:44 -0000 1.6 +++ eliza.pm 9 Jun 2004 14:46:22 -0000 1.7 @@ -19,10 +19,7 @@ my APR::Socket $socket = $c->client_socket; my $last = 0; - while (1) { - my $buff = $socket->recv(BUFF_LEN); - last unless length $buff; # EOF - + while ($socket->recv(my $buff, BUFF_LEN)) { # \r is sent instead of \n if the client is talking over telnet $buff =~ s/[\r\n]*$//; $last++ if $buff eq "Good bye, Eliza"; 1.4 +11 -4 modperl-2.0/t/response/TestAPR/brigade.pm Index: brigade.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/response/TestAPR/brigade.pm,v retrieving revision 1.3 retrieving revision 1.4 diff -u -u -r1.3 -r1.4 --- brigade.pm 21 May 2004 22:01:56 -0000 1.3 +++ brigade.pm 9 Jun 2004 14:46:22 -0000 1.4 @@ -20,7 +20,7 @@ my $r = shift; - plan $r, tests => 10; + plan $r, tests => 13; # basic + pool + destroy { @@ -59,7 +59,9 @@ $bb1->concat($bb2); # bb1: 11, 12, 21, 22 ok t_cmp(8, $bb1->length, "total data length in bb"); - ok t_cmp("11122122", $bb1->flatten, "bb flatten"); + my $len = $bb1->flatten(my $data); + ok t_cmp(8, $len, "bb flatten/len"); + ok t_cmp("11122122", $data, "bb flatten/data"); t_debug('$bb2 is empty'); ok $bb2->is_empty; @@ -67,9 +69,14 @@ my $b = $bb1->first; # 11 $b = $bb1->next($b); # 12 my $bb3 = $bb1->split($b); + # bb1: 11, bb3: 12, 21, 22 - ok t_cmp("11", $bb1->flatten, "bb flatten"); - ok t_cmp("122122", $bb3->flatten, "bb flatten"); + $len = $bb1->flatten($data); + ok t_cmp(2, $len, "bb1 flatten/len"); + ok t_cmp("11", $data, "bb1 flatten/data"); + $len = $bb3->flatten($data); + ok t_cmp(6, $len, "bb3 flatten/len"); + ok t_cmp("122122", $data, "bb3 flatten/data"); } Apache::OK; 1.4 +16 -9 modperl-2.0/t/response/TestAPR/bucket.pm Index: bucket.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/response/TestAPR/bucket.pm,v retrieving revision 1.3 retrieving revision 1.4 diff -u -u -r1.3 -r1.4 --- bucket.pm 4 Jun 2004 23:57:32 -0000 1.3 +++ bucket.pm 9 Jun 2004 14:46:22 -0000 1.4 @@ -20,7 +20,7 @@ my $r = shift; - plan $r, tests => 26; + plan $r, tests => 29; my $ba = $r->connection->bucket_alloc; @@ -47,8 +47,9 @@ my $offset = 3; my $real = substr $data, $offset; my $b = APR::Bucket->new($data, $offset); - my $read = $b->read; - ok t_cmp($real, $read, 'new($data, $offset)'); + my $rlen = $b->read(my $read); + ok t_cmp($real, $read, 'new($data, $offset)/buffer'); + ok t_cmp(length($read), $rlen, 'new($data, $offset)/len'); ok t_cmp($offset, $b->start, 'offset'); } @@ -60,8 +61,9 @@ my $len = 3; my $real = substr $data, $offset, $len; my $b = APR::Bucket->new($data, $offset, $len); - my $read = $b->read; - ok t_cmp($real, $read, 'new($data, $offset, $len)'); + my $rlen = $b->read(my $read); + ok t_cmp($real, $read, 'new($data, $offset, $len)/buffer'); + ok t_cmp(length($read), $rlen, 'new($data, $offse, $lent)/len'); } # new: offset+ too big len @@ -97,7 +99,9 @@ ok t_cmp(0, $b->length, "eos b->length"); # buckets with no data to read should return an empty string - ok t_cmp("", $b->read, "eos b->read"); + my $rlen = $b->read(my $read); + ok t_cmp("", $read, 'eos b->read/buffer'); + ok t_cmp(0, $rlen, 'eos b->read/len'); } # flush_create @@ -137,14 +141,16 @@ ### now test my $b = $bb->first; - ok t_cmp("d1", $b->read, "d1 bucket"); + $b->read(my $read); + ok t_cmp("d1", $read, "d1 bucket"); $b = $bb->next($b); t_debug("is_flush"); ok $b->is_flush; $b = $bb->next($b); - ok t_cmp("d2", $b->read, "d2 bucket"); + $b->read($read); + ok t_cmp("d2", $read, "d2 bucket"); $b = $bb->last(); t_debug("is_eos"); @@ -176,7 +182,8 @@ my $b = APR::Bucket->new("bbb"); $bb->insert_head($b); my $b_first = $bb->first; - ok t_cmp("bbb", $b->read, "first bucket"); + $b->read(my $read); + ok t_cmp("bbb", $read, "first bucket"); # but there is no prev ok t_cmp(undef, $bb->prev($b_first), "no prev bucket"); 1.4 +37 -46 modperl-2.0/t/response/TestAPR/flatten.pm Index: flatten.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/response/TestAPR/flatten.pm,v retrieving revision 1.3 retrieving revision 1.4 diff -u -u -r1.3 -r1.4 --- flatten.pm 29 Jan 2004 01:26:49 -0000 1.3 +++ flatten.pm 9 Jun 2004 14:46:22 -0000 1.4 @@ -16,7 +16,7 @@ my $r = shift; - plan $r, tests => 14; + plan $r, tests => 20; # first, create a brigade my $pool = $r->pool; @@ -39,35 +39,26 @@ # syntax: require a $bb eval { APR::Brigade::flatten("") }; - ok t_cmp(qr!expecting an APR::Brigade derived object!, + ok t_cmp(qr!usage: \$bb->flatten\(\$buf, \[\$wanted\]\)!, $@, 'APR::Brigade::flatten() requires a brigade'); # flatten() will slurp up the entire brigade # equivalent to calling apr_brigade_pflatten { - my $data = $bb->flatten(); + my $len = $bb->flatten(my $data); - ok t_cmp(200000, - length($data), - '$bb->flatten() returned all the data'); - - # don't use t_cmp() here, else we get 200,000 characters - # to look at in verbose mode - t_debug("data all 'x' characters"); - ok ($data !~ m/[^x]/); + verify(200000, $len, $data, 1); } # flatten(0) returns 0 bytes { - my $data = $bb->flatten(0); + my $len = $bb->flatten(my $data, 0); t_debug('$bb->flatten(0) returns a defined value'); ok (defined $data); - - ok t_cmp(0, - length($data), - '$bb->flatten(0) returned no data'); + + verify(0, $len, $data, 0); } @@ -75,53 +66,53 @@ # equivalent to calling apr_brigade_flatten { # small - my $data = $bb->flatten(30); - - ok t_cmp(30, - length($data), - '$bb->flatten(30) returned 30 characters'); - - t_debug("APR::Brigade::flatten() data all 'x' characters"); - ok ($data !~ m/[^x]/); + my $len = $bb->flatten(my $data, 30); + verify(30, $len, $data, 1); } { - # large - my $data = $bb->flatten(190000); - - ok t_cmp(190000, - length($data), - '$bb->flatten(190000) returned 19000 characters'); - - t_debug("data all 'x' characters"); - ok ($data !~ m/[^x]/); + # large + my $len = $bb->flatten(my $data, 190000); + verify(190000, $len, $data, 1); } { # more than enough - my $data = $bb->flatten(300000); - - ok t_cmp(200000, - length($data), - '$bb->flatten(300000) returned all 200000 characters'); - - t_debug("data all 'x' characters"); - ok ($data !~ m/[^x]/); + my $len = $bb->flatten(my $data, 300000); + verify(200000, $len, $data, 1); } # fetch from a brigade with no data in it { - my $data = APR::Brigade->new($pool, $ba)->flatten(); + my $len = APR::Brigade->new($pool, $ba)->flatten(my $data); t_debug('empty brigade returns a defined value'); ok (defined $data); - - ok t_cmp(0, - length($data), - 'empty brigade returns data of 0 length'); + + verify(0, $len, $data, 0); } Apache::OK; } + +sub verify { + my($expected_len, $len, $data, $check_content) = @_; + + ok t_cmp($expected_len, + $len, + "\$bb->flatten(\$data, $len) returned $len bytes"); + ok t_cmp($len, + length($data), + "\$bb->flatten(\$data, $len) returned all expected data"); + + if ($check_content) { + # don't use t_cmp() here, else we get 200,000 characters + # to look at in verbose mode + t_debug("data all 'x' characters"); + ok ($data !~ m/[^x]/); + } + +} + 1; 1.5 +2 -2 modperl-2.0/t/response/TestError/runtime.pm Index: runtime.pm =================================================================== RCS file: /home/cvs/modperl-2.0/t/response/TestError/runtime.pm,v retrieving revision 1.4 retrieving revision 1.5 diff -u -u -r1.4 -r1.5 --- runtime.pm 30 May 2004 18:51:30 -0000 1.4 +++ runtime.pm 9 Jun 2004 14:46:22 -0000 1.5 @@ -85,7 +85,7 @@ sub eval_string_mp_error { my($r, $socket) = @_; - eval "\$socket->recv(SIZE)"; + eval '$socket->recv(my $buffer, SIZE)'; if ($@ && ref($@) && $@ == APR::TIMEUP) { $r->print("ok eval_string_mp_error"); } @@ -121,7 +121,7 @@ # fails because of the timeout set earlier in the handler sub mp_error { my $socket = shift; - $socket->recv(SIZE); + $socket->recv(my $buffer, SIZE); } 1; 1.29 +4 -0 modperl-2.0/todo/release Index: release =================================================================== RCS file: /home/cvs/modperl-2.0/todo/release,v retrieving revision 1.28 retrieving revision 1.29 diff -u -u -r1.28 -r1.29 --- release 5 Jun 2004 05:05:21 -0000 1.28 +++ release 9 Jun 2004 14:46:22 -0000 1.29 @@ -4,6 +4,10 @@ -- see also todo/api_status +* the following methods/functions are using compat implementations in + tests and should use the real 2.0 API: method_register, + server_root_relative + * filters reset $@ generated by eval, see if we can fix that. The TODO test: TestFilter::out_str_eval presents the case The description is here: 1.13 +20 -24 modperl-2.0/xs/APR/Brigade/APR__Brigade.h Index: APR__Brigade.h =================================================================== RCS file: /home/cvs/modperl-2.0/xs/APR/Brigade/APR__Brigade.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -u -r1.12 -r1.13 --- APR__Brigade.h 21 May 2004 22:01:16 -0000 1.12 +++ APR__Brigade.h 9 Jun 2004 14:46:22 -0000 1.13 @@ -114,20 +114,20 @@ #define mp_xs_sv2_bb mp_xs_sv2_APR__Brigade static MP_INLINE -SV *mpxs_APR__Brigade_flatten(pTHX_ I32 items, - SV **MARK, SV **SP) +apr_size_t mpxs_APR__Brigade_flatten(pTHX_ I32 items, + SV **MARK, SV **SP) { apr_bucket_brigade *bb; - apr_size_t length; - apr_status_t status; - SV *data; - - mpxs_usage_va_1(bb, "$bb->flatten([$length])"); - - if (items > 1) { - /* APR::Brigade->flatten($length); */ - length = SvIV(*MARK); + apr_size_t wanted; + apr_status_t rc; + SV *buffer; + + mpxs_usage_va_2(bb, buffer, "$bb->flatten($buf, [$wanted])"); + + if (items > 2) { + /* APR::Brigade->flatten($wanted); */ + wanted = SvIV(*MARK); } else { /* APR::Brigade->flatten(); */ @@ -137,25 +137,21 @@ */ apr_off_t actual; apr_brigade_length(bb, 1, &actual); - length = (apr_size_t)actual; + wanted = (apr_size_t)actual; } - data = newSV(0); - mpxs_sv_grow(data, length); + (void)SvUPGRADE(buffer, SVt_PV); + mpxs_sv_grow(buffer, wanted); - status = apr_brigade_flatten(bb, SvPVX(data), &length); - if (status != APR_SUCCESS) { - /* XXX croak? - * note that reading from an empty brigade will return - * an empty string, not undef, so there is a difference - */ - return &PL_sv_undef; + rc = apr_brigade_flatten(bb, SvPVX(buffer), &wanted); + if (!(rc == APR_SUCCESS || rc == APR_EOF)) { + modperl_croak(aTHX_ rc, "APR::Brigade::flatten"); } - mpxs_sv_cur_set(data, length); - SvTAINTED_on(data); + mpxs_sv_cur_set(buffer, wanted); + SvTAINTED_on(buffer); - return data; + return wanted; } static MP_INLINE 1.10 +9 -21 modperl-2.0/xs/APR/Bucket/APR__Bucket.h Index: APR__Bucket.h =================================================================== RCS file: /home/cvs/modperl-2.0/xs/APR/Bucket/APR__Bucket.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -u -r1.9 -r1.10 --- APR__Bucket.h 4 Jun 2004 09:38:06 -0000 1.9 +++ APR__Bucket.h 9 Jun 2004 14:46:22 -0000 1.10 @@ -35,34 +35,22 @@ return modperl_bucket_sv_create(aTHX_ sv, offset, len); } -static MP_INLINE SV *mpxs_APR__Bucket_read(pTHX_ - apr_bucket *bucket, - apr_read_type_e block) +static MP_INLINE +apr_size_t mpxs_APR__Bucket_read(pTHX_ + apr_bucket *bucket, + SV *buffer, + apr_read_type_e block) { - SV *buf; apr_size_t len; const char *str; apr_status_t rc = apr_bucket_read(bucket, &str, &len, block); - - if (rc == APR_EOF) { - return newSVpvn("", 0); - } - if (rc != APR_SUCCESS) { - modperl_croak(aTHX_ rc, "APR::Bucket::read"); + if (!(rc == APR_SUCCESS || rc == APR_EOF)) { + modperl_croak(aTHX_ rc, "APR::Bucket::read"); } - /* XXX: bug in perl, newSVpvn(NULL, 0) doesn't produce "" sv */ - if (len) { - buf = newSVpvn(str, len); - } - else { - buf = newSVpvn("", 0); - } - - SvTAINTED_on(buf); - - return buf; + sv_setpvn(buffer, (len ? str : ""), len); + return len; } static MP_INLINE int mpxs_APR__Bucket_is_eos(apr_bucket *bucket) 1.11 +12 -14 modperl-2.0/xs/APR/Socket/APR__Socket.h Index: APR__Socket.h =================================================================== RCS file: /home/cvs/modperl-2.0/xs/APR/Socket/APR__Socket.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -u -r1.10 -r1.11 --- APR__Socket.h 2 Jun 2004 03:34:32 -0000 1.10 +++ APR__Socket.h 9 Jun 2004 14:46:22 -0000 1.11 @@ -14,24 +14,22 @@ */ static MP_INLINE -SV *mpxs_APR__Socket_recv(pTHX_ apr_socket_t *socket, apr_size_t len) +apr_size_t mpxs_APR__Socket_recv(pTHX_ apr_socket_t *socket, + SV *buffer, + apr_size_t len) { - SV *buf = NEWSV(0, len); - apr_status_t rc = apr_socket_recv(socket, SvPVX(buf), &len); + apr_status_t rc; - if (len > 0) { - mpxs_sv_cur_set(buf, len); - SvTAINTED_on(buf); - } - else if (rc == APR_EOF) { - sv_setpvn(buf, "", 0); - } - else if (rc != APR_SUCCESS) { - SvREFCNT_dec(buf); - modperl_croak(aTHX_ rc, "APR::Socket::recv"); + mpxs_sv_grow(buffer, len); + rc = apr_socket_recv(socket, SvPVX(buffer), &len); + + if (!(rc == APR_SUCCESS || rc == APR_EOF)) { + modperl_croak(aTHX_ rc, "APR::Socket::recv"); } - return buf; + mpxs_sv_cur_set(buffer, len); + SvTAINTED_on(buffer); + return len; } static MP_INLINE 1.82 +1 -1 modperl-2.0/xs/maps/apr_functions.map Index: apr_functions.map =================================================================== RCS file: /home/cvs/modperl-2.0/xs/maps/apr_functions.map,v retrieving revision 1.81 retrieving revision 1.82 diff -u -u -r1.81 -r1.82 --- apr_functions.map 4 Jun 2004 04:12:54 -0000 1.81 +++ apr_functions.map 9 Jun 2004 14:46:22 -0000 1.82 @@ -116,7 +116,7 @@ mpxs_APR__Bucket_insert_before #APR_BUCKET_INSERT_AFTER mpxs_APR__Bucket_remove #APR_BUCKET_REMOVE #apr_bucket_read - mpxs_APR__Bucket_read | | bucket, block=APR_BLOCK_READ + mpxs_APR__Bucket_read | | bucket, buffer, block=APR_BLOCK_READ #modperl_bucket_sv_create mpxs_APR__Bucket_new | | classname, sv, offset=0, len=0 >apr_bucket_alloc 1.163 +12 -8 modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm Index: FunctionTable.pm =================================================================== RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v retrieving revision 1.162 retrieving revision 1.163 diff -u -u -r1.162 -r1.163 --- FunctionTable.pm 2 Jun 2004 18:31:33 -0000 1.162 +++ FunctionTable.pm 9 Jun 2004 14:46:22 -0000 1.163 @@ -2,7 +2,7 @@ # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ! WARNING: generated by ModPerl::ParseSource/0.01 -# ! Wed Jun 2 11:27:15 2004 +# ! Wed Jun 9 06:41:48 2004 # ! do NOT edit, any changes will be lost ! # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -5189,7 +5189,7 @@ ] }, { - 'return_type' => 'SV *', + 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Brigade_flatten', 'args' => [ { @@ -5408,12 +5408,8 @@ ] }, { - 'return_type' => 'SV *', + 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Bucket_read', - 'attr' => [ - 'static', - '__inline__' - ], 'args' => [ { 'type' => 'PerlInterpreter *', @@ -5424,6 +5420,10 @@ 'name' => 'bucket' }, { + 'type' => 'SV *', + 'name' => 'buffer' + }, + { 'type' => 'apr_read_type_e', 'name' => 'block' } @@ -5524,7 +5524,7 @@ ] }, { - 'return_type' => 'SV *', + 'return_type' => 'apr_size_t', 'name' => 'mpxs_APR__Socket_recv', 'args' => [ { @@ -5534,6 +5534,10 @@ { 'type' => 'apr_socket_t *', 'name' => 'socket' + }, + { + 'type' => 'SV *', + 'name' => 'buffer' }, { 'type' => 'apr_size_t',