Hi,

... and now version (4) with the dynamic-wind in the correct place:

-----
$ diff -upr  v1.6.4-andyjpb-fix-3 v1.6.4-andyjpb-fix-4
Binary files v1.6.4-andyjpb-fix-3/openssl.import.so and
v1.6.4-andyjpb-fix-4/openssl.import.so differ
diff -upr v1.6.4-andyjpb-fix-3/openssl.scm v1.6.4-andyjpb-fix-4/openssl.scm
--- v1.6.4-andyjpb-fix-3/openssl.scm    2014-11-25 15:53:35.035152667 +0000
+++ v1.6.4-andyjpb-fix-4/openssl.scm    2014-11-25 16:21:59.105377994 +0000
@@ -481,17 +481,16 @@ EOF
             (unbuffered-write buffer)))
         ;; close
         (lambda ()
-          (dynamic-wind
-            void
-            (lambda ()
-              (when (startup #t)
-                (if outbuf
-                  (begin
-                    (unbuffered-write outbuf 0 outbufsize)
-                    (set! outbufsize 0)))))
-            (lambda ()
-              (set! out-open? #f)
-              (shutdown))))
+          (when (startup #t)
+            (dynamic-wind
+              void
+              (lambda ()
+                (when outbuf
+                  (unbuffered-write outbuf 0 outbufsize)
+                  (set! outbufsize 0)))
+              (lambda ()
+                (set! out-open? #f)
+                (shutdown)))))
         ;; flush
         (lambda ()
           (when outbuf
-----




Regards,
@ndy

-- 
[email protected]
http://www.ashurst.eu.org/
0x7EBA75FF

diff -upr v1.6.4/openssl.import.scm v1.6.4-andyjpb-fix-4/openssl.import.scm
--- v1.6.4/openssl.import.scm	2014-11-23 02:37:31.235897645 +0000
+++ v1.6.4-andyjpb-fix-4/openssl.import.scm	2014-11-23 02:13:16.085352751 +0000
@@ -1,6 +1,6 @@
 ;;;; openssl.import.scm - GENERATED BY CHICKEN 4.9.0rc1 -*- Scheme -*-
 
-(eval '(import scheme chicken foreign ports srfi-18 tcp))
+(eval '(import scheme chicken foreign ports srfi-13 srfi-18 tcp))
 (##sys#register-compiled-module
   'openssl
   (list)
Binary files v1.6.4/openssl.import.so and v1.6.4-andyjpb-fix-4/openssl.import.so differ
diff -upr v1.6.4/openssl.scm v1.6.4-andyjpb-fix-4/openssl.scm
--- v1.6.4/openssl.scm	2014-11-23 00:07:52.324097414 +0000
+++ v1.6.4-andyjpb-fix-4/openssl.scm	2014-11-25 16:21:59.105377994 +0000
@@ -45,7 +45,7 @@
    ##sys#check-string
    ##sys#expand-home-path))
 
-(use srfi-18 tcp)
+(use srfi-13 srfi-18 tcp)
 
 #>
 #include <errno.h>
@@ -442,43 +442,61 @@ EOF
                                                  "SSL read timed out")))
 		buffer))))
     (out
-      (let* ((outbufsize (tcp-buffer-size))
-	     (outbuf (and outbufsize (fx> outbufsize 0) ""))
-	     (output
-              (lambda (buffer)
-		(startup)
-		(when (> (##sys#size buffer) 0) ; Undefined behaviour for 0 bytes!
-		  (let loop ((offset 0) (size (##sys#size buffer)))
+      (let* ((outbufmax  (tcp-buffer-size))
+	     (outbuf     (and outbufmax (fx> outbufmax 0) (make-string outbufmax)))
+	     (outbufsize 0)
+	     (unbuffered-write
+              (lambda (buffer #!optional (offset 0) (size (##sys#size buffer)))
+		(when (> size 0) ; Undefined behaviour for 0 bytes!
+		  (let loop ((offset offset) (size size))
 		    (let ((ret (ssl-call/timeout
 				'ssl-write
 				(lambda () (ssl-write ssl buffer offset size))
 				fd (tcp-write-timeout) "SSL write timed out")))
 		      (when (fx< ret size) ; Partial write
 			(loop (fx+ offset ret) (fx- size ret)))))))))
+
+	(define (buffered-write data #!optional (start 0))
+	  (let* ((size      (- (##sys#size data) start))
+		 (to-copy   (min (- outbufmax outbufsize) size))
+		 (left-over (- size to-copy)))
+
+	    (string-copy! outbuf outbufsize data start (+ start to-copy))
+	    (set! outbufsize (+ outbufsize to-copy))
+
+	    (if (= outbufsize outbufmax)
+	      (begin
+		(unbuffered-write outbuf)
+		(set! outbufsize 0)))
+
+	    (if (> left-over 0)
+	      (buffered-write data (+ start to-copy)))))
+
         (make-output-port
 	 ;; write
 	 (lambda (buffer)
+	   (startup)
 	   (if outbuf
-	     (begin
-	       (set! outbuf (string-append outbuf buffer))
-	       (when (fx>= (string-length outbuf) outbufsize)
-		 (output outbuf)
-		 (set! outbuf "")))
-	     (output buffer)))
+	     (buffered-write buffer)
+	     (unbuffered-write buffer)))
 	 ;; close
 	 (lambda ()
 	   (when (startup #t)
-	     (if outbuf
-		 (begin
-		   (output outbuf)
-		   (set! outbuf "")))
-	     (set! out-open? #f)
-	     (shutdown)))
+	     (dynamic-wind
+	       void
+	       (lambda ()
+		 (when outbuf
+		   (unbuffered-write outbuf 0 outbufsize)
+		   (set! outbufsize 0)))
+	       (lambda ()
+		 (set! out-open? #f)
+		 (shutdown)))))
 	 ;; flush
 	 (lambda ()
 	   (when outbuf
-	     (output outbuf)
-	     (set! outbuf "")))))))
+	     (startup)
+	     (unbuffered-write outbuf 0 outbufsize)
+	     (set! outbufsize 0)))))))
       (##sys#setslot in 3 "(ssl)")
       (##sys#setslot out 3 "(ssl)")
       ;; first "reserved" slot
Only in v1.6.4-andyjpb-fix-4: openssl.scm~
Only in v1.6.4-andyjpb-fix-4: .openssl.scm.swp
Binary files v1.6.4/openssl.so and v1.6.4-andyjpb-fix-4/openssl.so differ
Binary files v1.6.4/openssl-static.o and v1.6.4-andyjpb-fix-4/openssl-static.o differ
_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to