You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@perl.apache.org by Doug MacEachern <do...@covalent.net> on 2000/12/20 08:51:35 UTC

Re: syswrite/WRITE patch - Take one

On Fri, 13 Oct 2000, Soheil Seyfaie wrote:

> 
> The following patch *should* work. Suggestions welcome.

many thanks soheil, great that you included the tests too.
i have applied your patch, but a slightly different version (see below).
i left this out:

> + 
> +     if(!mod_perl_sent_header(r, 0)) {
> + 	croak("HTTP headers missing. Please send HTTP headers first!");
> + 	XSRETURN_IV(0);
> +     }

doesn't seem right for the write method to croak like this.  why did you
want todo that?

and the new version also includes tighter parameter checking.

Index: src/modules/perl/Apache.xs
===================================================================
RCS file: /home/cvs/modperl/src/modules/perl/Apache.xs,v
retrieving revision 1.116
diff -u -r1.116 Apache.xs
--- src/modules/perl/Apache.xs	2000/12/20 07:02:49	1.116
+++ src/modules/perl/Apache.xs	2000/12/20 07:51:36
@@ -1035,6 +1035,54 @@
     }
 
 int
+write(r, sv_buffer, sv_length=-1, offset=0)
+    Apache	r
+    SV *sv_buffer
+    int sv_length
+    int offset
+
+    ALIAS:
+    Apache::WRITE = 1
+
+    PREINIT:
+    STRLEN len;
+    char *buffer;
+    int sent = 0;
+
+    CODE:
+    ix = ix; /* avoid -Wall warning */
+    RETVAL = 0;
+
+    if (r->connection->aborted) {
+        XSRETURN_UNDEF;
+    }
+
+    buffer = SvPV(sv_buffer, len);
+    if (sv_length != -1) {
+        len = sv_length;
+    }
+
+    if (offset) {
+        buffer += offset;
+    }
+
+    while (len > 0) {
+        sent = rwrite(buffer,
+                      len < HUGE_STRING_LEN ? len : HUGE_STRING_LEN,
+                      r);
+        if (sent < 0) {
+            rwrite_neg_trace(r);
+	    break;
+        }
+        buffer += sent;
+        len -= sent;
+        RETVAL += sent;
+    }
+
+    OUTPUT:
+    RETVAL
+
+int
 print(r, ...)
     Apache	r