Make the PRINT method return the number of bytes written.
Tomas Doran [Sun, 10 Jan 2010 01:12:50 +0000 (01:12 +0000)]
This complies with the IO:: interface, and fixes (and takes the patch from)
RT#24347

perl/ChangeLog
perl/FCGI.PL
perl/FCGI.XL

index 5c04eed..4153fc3 100644 (file)
@@ -1,3 +1,6 @@
+    o Make the PRINT method return the number of bytes written rather than
+      undef to be consistent with the IO:: interface. Fixes RT#24347
+      <David Dick>
     o Fix UTF-8 double encoding when FCGI is passed octets by downgrading
       them into bytes correctly. Fixes RT#52400 <chansen@cpan.org>
 
index 87f2540..4781e86 100644 (file)
@@ -261,9 +261,13 @@ sub READ {
 
 sub PRINT {
     my ($stream) = shift;
+    my $bytes = 0;
     for (@_) {
-       $stream->{src}->write($stream->{type}, $_, length($_));
+        my $len = length($_);
+        $stream->{src}->write($stream->{type}, $_, $len);
+        $bytes += $len;
     }
+    return $bytes;
 }
 
 sub CLOSE {
index 524c604..65a2767 100644 (file)
@@ -533,15 +533,19 @@ MODULE = FCGI             PACKAGE = FCGI::Stream
 
 #ifndef USE_SFIO
 
-void
+int
 PRINT(stream, ...)
        FCGI::Stream    stream;
 
        PREINIT:
        int     n;
+    int retval;
+    int bytes_written;
 
        CODE:
-       for (n = 1; n < items; ++n) {
+    retval = 0;
+    bytes_written = 0;
+    for (n = 1; n < items && bytes_written >= 0; ++n) {
             STRLEN len;
             register char *tmps; 
 #ifdef DO_UTF8
@@ -549,10 +553,17 @@ PRINT(stream, ...)
                 croak("Wide character in FCGI::Stream::PRINT");
 #endif
             tmps = (char *)SvPV(ST(n),len);
-            FCGX_PutStr(tmps, len, stream);
-       }
+               bytes_written = FCGX_PutStr(tmps, len, stream);
+            if (bytes_written > 0) {
+                retval += bytes_written;
+            }
+    }
        if (SvTRUEx(perl_get_sv("|", FALSE))) 
            FCGX_FFlush(stream);
+    RETVAL = retval;
+
+    OUTPUT:
+    RETVAL
 
 int
 WRITE(stream, bufsv, len, ...)