clisp patch by Pixel // pinterface
parent
9dacb12767
commit
78eea24562
1
LICENSE
1
LICENSE
|
@ -1,6 +1,7 @@
|
||||||
Copyright (C) 2001, 2003 Eric Marsden
|
Copyright (C) 2001, 2003 Eric Marsden
|
||||||
Copyright (C) ???? Jochen Schmidt
|
Copyright (C) ???? Jochen Schmidt
|
||||||
Copyright (C) 2005 David Lichteblau
|
Copyright (C) 2005 David Lichteblau
|
||||||
|
Copyright (C) 2007 Pixel // pinterface
|
||||||
|
|
||||||
* License first changed by Eric Marsden, Jochen Schmidt, and David Lichteblau
|
* License first changed by Eric Marsden, Jochen Schmidt, and David Lichteblau
|
||||||
from plain LGPL to Lisp-LGPL in December 2005.
|
from plain LGPL to Lisp-LGPL in December 2005.
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
;;;
|
;;;
|
||||||
;;; Copyright (C) 2001, 2003 Eric Marsden
|
;;; Copyright (C) 2001, 2003 Eric Marsden
|
||||||
;;; Copyright (C) 2005 David Lichteblau
|
;;; Copyright (C) 2005 David Lichteblau
|
||||||
|
;;; Copyright (C) 2007 Pixel // pinterface
|
||||||
;;; "the conditions and ENSURE-SSL-FUNCALL are by Jochen Schmidt."
|
;;; "the conditions and ENSURE-SSL-FUNCALL are by Jochen Schmidt."
|
||||||
;;;
|
;;;
|
||||||
;;; See LICENSE for details.
|
;;; See LICENSE for details.
|
||||||
|
@ -19,5 +20,8 @@
|
||||||
(:file "reload")
|
(:file "reload")
|
||||||
(:file "conditions")
|
(:file "conditions")
|
||||||
(:file "ffi")
|
(:file "ffi")
|
||||||
|
(:file "ffi-buffer-all")
|
||||||
|
#-clisp (:file "ffi-buffer")
|
||||||
|
#+clisp (:file "ffi-buffer-clisp")
|
||||||
(:file "streams")
|
(:file "streams")
|
||||||
(:file "bio")))
|
(:file "bio")))
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
(in-package :cl+ssl)
|
||||||
|
|
||||||
|
(defconstant +initial-buffer-size+ 2048)
|
||||||
|
|
||||||
|
(declaim
|
||||||
|
(inline
|
||||||
|
make-buffer
|
||||||
|
buffer-length
|
||||||
|
buffer-elt
|
||||||
|
set-buffer-elt
|
||||||
|
v/b-replace
|
||||||
|
b/v-replace))
|
|
@ -0,0 +1,29 @@
|
||||||
|
(in-package :cl+ssl)
|
||||||
|
|
||||||
|
(defun make-buffer (size)
|
||||||
|
(cffi-sys:%foreign-alloc size))
|
||||||
|
|
||||||
|
(defun buffer-length (buf)
|
||||||
|
(declare (ignore buf))
|
||||||
|
+initial-buffer-size+)
|
||||||
|
|
||||||
|
(defun buffer-elt (buf index)
|
||||||
|
(ffi:memory-as buf 'ffi:uint8 index))
|
||||||
|
(defun set-buffer-elt (buf index val)
|
||||||
|
(setf (ffi:memory-as buf 'ffi:uint8 index) val))
|
||||||
|
(defsetf buffer-elt set-buffer-elt)
|
||||||
|
|
||||||
|
(defun v/b-replace (vec buf &key (start1 0) end1 (start2 0) (end2 +initial-buffer-size+))
|
||||||
|
(replace
|
||||||
|
vec
|
||||||
|
(ffi:memory-as buf (ffi:parse-c-type `(ffi:c-array ffi:uint8 ,(- end2 start2))) start2)
|
||||||
|
:start1 start1
|
||||||
|
:end1 end1))
|
||||||
|
(defun b/v-replace (buf vec &key (start1 0) (end1 +initial-buffer-size+) (start2 0) end2)
|
||||||
|
(setf
|
||||||
|
(ffi:memory-as buf (ffi:parse-c-type `(ffi:c-array ffi:uint8 ,(- end1 start1))) start1)
|
||||||
|
(subseq vec start2 end2)))
|
||||||
|
|
||||||
|
(defmacro with-pointer-to-vector-data ((ptr buf) &body body)
|
||||||
|
`(let ((,ptr ,buf))
|
||||||
|
,@body))
|
|
@ -0,0 +1,22 @@
|
||||||
|
(in-package :cl+ssl)
|
||||||
|
|
||||||
|
(defun make-buffer (size)
|
||||||
|
(cffi-sys::make-shareable-byte-vector size))
|
||||||
|
|
||||||
|
(defun buffer-length (buf)
|
||||||
|
(length buf))
|
||||||
|
|
||||||
|
(defun buffer-elt (buf index)
|
||||||
|
(elt buf index))
|
||||||
|
(defun set-buffer-elt (buf index val)
|
||||||
|
(setf (elt buf index) val))
|
||||||
|
(defsetf buffer-elt set-buffer-elt)
|
||||||
|
|
||||||
|
(defun v/b-replace (vec buf &key (start1 0) end1 (start2 0) end2)
|
||||||
|
(replace vec buf :start1 start1 :end1 end1 :start2 start2 :end2 end2))
|
||||||
|
(defun b/v-replace (buf vec &key (start1 0) end1 (start2 0) end2)
|
||||||
|
(replace buf vec :start1 start1 :end1 end1 :start2 start2 :end2 end2))
|
||||||
|
|
||||||
|
(defmacro with-pointer-to-vector-data ((ptr buf) &body body)
|
||||||
|
`(cffi-sys::with-pointer-to-vector-data (,ptr ,buf)
|
||||||
|
,@body))
|
|
@ -16,6 +16,12 @@
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h3>News</h3>
|
<h3>News</h3>
|
||||||
|
<p>
|
||||||
|
2007-07-07: Improved clisp support, thanks
|
||||||
|
to <a
|
||||||
|
href="http://web.kepibu.org/code/lisp/cl+ssl/#faster-clisp">Pixel
|
||||||
|
// pinterface</a>.
|
||||||
|
</p>
|
||||||
<p>
|
<p>
|
||||||
2007-01-16: CL+SSL is now available under an MIT-style license.
|
2007-01-16: CL+SSL is now available under an MIT-style license.
|
||||||
</p>
|
</p>
|
||||||
|
|
41
streams.lisp
41
streams.lisp
|
@ -1,5 +1,6 @@
|
||||||
;;; Copyright (C) 2001, 2003 Eric Marsden
|
;;; Copyright (C) 2001, 2003 Eric Marsden
|
||||||
;;; Copyright (C) 2005 David Lichteblau
|
;;; Copyright (C) 2005 David Lichteblau
|
||||||
|
;;; Copyright (C) 2007 Pixel // pinterface
|
||||||
;;; "the conditions and ENSURE-SSL-FUNCALL are by Jochen Schmidt."
|
;;; "the conditions and ENSURE-SSL-FUNCALL are by Jochen Schmidt."
|
||||||
;;;
|
;;;
|
||||||
;;; See LICENSE for details.
|
;;; See LICENSE for details.
|
||||||
|
@ -9,8 +10,6 @@
|
||||||
|
|
||||||
(in-package :cl+ssl)
|
(in-package :cl+ssl)
|
||||||
|
|
||||||
(defconstant +initial-buffer-size+ 2048)
|
|
||||||
|
|
||||||
(defclass ssl-stream
|
(defclass ssl-stream
|
||||||
(fundamental-binary-input-stream
|
(fundamental-binary-input-stream
|
||||||
fundamental-binary-output-stream
|
fundamental-binary-output-stream
|
||||||
|
@ -22,13 +21,13 @@
|
||||||
:initform nil
|
:initform nil
|
||||||
:accessor ssl-stream-handle)
|
:accessor ssl-stream-handle)
|
||||||
(output-buffer
|
(output-buffer
|
||||||
:initform (cffi-sys::make-shareable-byte-vector +initial-buffer-size+)
|
:initform (make-buffer +initial-buffer-size+)
|
||||||
:accessor ssl-stream-output-buffer)
|
:accessor ssl-stream-output-buffer)
|
||||||
(output-pointer
|
(output-pointer
|
||||||
:initform 0
|
:initform 0
|
||||||
:accessor ssl-stream-output-pointer)
|
:accessor ssl-stream-output-pointer)
|
||||||
(input-buffer
|
(input-buffer
|
||||||
:initform (cffi-sys::make-shareable-byte-vector +initial-buffer-size+)
|
:initform (make-buffer +initial-buffer-size+)
|
||||||
:accessor ssl-stream-input-buffer)
|
:accessor ssl-stream-input-buffer)
|
||||||
(peeked-byte
|
(peeked-byte
|
||||||
:initform nil
|
:initform nil
|
||||||
|
@ -70,7 +69,7 @@
|
||||||
(or (ssl-stream-peeked-byte stream)
|
(or (ssl-stream-peeked-byte stream)
|
||||||
(let ((buf (ssl-stream-input-buffer stream)))
|
(let ((buf (ssl-stream-input-buffer stream)))
|
||||||
(handler-case
|
(handler-case
|
||||||
(cffi-sys::with-pointer-to-vector-data (ptr buf)
|
(with-pointer-to-vector-data (ptr buf)
|
||||||
(ensure-ssl-funcall (ssl-stream-socket stream)
|
(ensure-ssl-funcall (ssl-stream-socket stream)
|
||||||
(ssl-stream-handle stream)
|
(ssl-stream-handle stream)
|
||||||
#'ssl-read
|
#'ssl-read
|
||||||
|
@ -78,7 +77,7 @@
|
||||||
(ssl-stream-handle stream)
|
(ssl-stream-handle stream)
|
||||||
ptr
|
ptr
|
||||||
1)
|
1)
|
||||||
(elt buf 0))
|
(buffer-elt buf 0))
|
||||||
(ssl-error-zero-return () ;SSL_read returns 0 on end-of-file
|
(ssl-error-zero-return () ;SSL_read returns 0 on end-of-file
|
||||||
:eof)))))
|
:eof)))))
|
||||||
|
|
||||||
|
@ -90,11 +89,11 @@
|
||||||
(incf start))
|
(incf start))
|
||||||
(let ((buf (ssl-stream-input-buffer stream)))
|
(let ((buf (ssl-stream-input-buffer stream)))
|
||||||
(loop
|
(loop
|
||||||
for length = (min (- end start) (length buf))
|
for length = (min (- end start) (buffer-length buf))
|
||||||
while (plusp length)
|
while (plusp length)
|
||||||
do
|
do
|
||||||
(handler-case
|
(handler-case
|
||||||
(cffi-sys::with-pointer-to-vector-data (ptr buf)
|
(with-pointer-to-vector-data (ptr buf)
|
||||||
(ensure-ssl-funcall (ssl-stream-socket stream)
|
(ensure-ssl-funcall (ssl-stream-socket stream)
|
||||||
(ssl-stream-handle stream)
|
(ssl-stream-handle stream)
|
||||||
#'ssl-read
|
#'ssl-read
|
||||||
|
@ -102,7 +101,7 @@
|
||||||
(ssl-stream-handle stream)
|
(ssl-stream-handle stream)
|
||||||
ptr
|
ptr
|
||||||
length)
|
length)
|
||||||
(replace thing buf :start1 start :end1 (+ start length))
|
(v/b-replace thing buf :start1 start :end1 (+ start length))
|
||||||
(incf start length))
|
(incf start length))
|
||||||
(ssl-error-zero-return () ;SSL_read returns 0 on end-of-file
|
(ssl-error-zero-return () ;SSL_read returns 0 on end-of-file
|
||||||
(return))))
|
(return))))
|
||||||
|
@ -110,28 +109,28 @@
|
||||||
|
|
||||||
(defmethod stream-write-byte ((stream ssl-stream) b)
|
(defmethod stream-write-byte ((stream ssl-stream) b)
|
||||||
(let ((buf (ssl-stream-output-buffer stream)))
|
(let ((buf (ssl-stream-output-buffer stream)))
|
||||||
(when (eql (length buf) (ssl-stream-output-pointer stream))
|
(when (eql (buffer-length buf) (ssl-stream-output-pointer stream))
|
||||||
(force-output stream))
|
(force-output stream))
|
||||||
(setf (elt buf (ssl-stream-output-pointer stream)) b)
|
(setf (buffer-elt buf (ssl-stream-output-pointer stream)) b)
|
||||||
(incf (ssl-stream-output-pointer stream)))
|
(incf (ssl-stream-output-pointer stream)))
|
||||||
b)
|
b)
|
||||||
|
|
||||||
(defmethod stream-write-sequence ((stream ssl-stream) thing start end &key)
|
(defmethod stream-write-sequence ((stream ssl-stream) thing start end &key)
|
||||||
(check-type thing (simple-array (unsigned-byte 8) (*)))
|
(check-type thing (simple-array (unsigned-byte 8) (*)))
|
||||||
(let ((buf (ssl-stream-output-buffer stream)))
|
(let ((buf (ssl-stream-output-buffer stream)))
|
||||||
(when (> (+ (- end start) (ssl-stream-output-pointer stream)) (length buf))
|
(when (> (+ (- end start) (ssl-stream-output-pointer stream)) (buffer-length buf))
|
||||||
;; not enough space left? flush buffer.
|
;; not enough space left? flush buffer.
|
||||||
(force-output stream)
|
(force-output stream)
|
||||||
;; still doesn't fit?
|
;; still doesn't fit?
|
||||||
(while (> (- end start) (length buf))
|
(while (> (- end start) (buffer-length buf))
|
||||||
(replace buf thing :start2 start)
|
(b/v-replace buf thing :start2 start)
|
||||||
(incf start (length buf))
|
(incf start (buffer-length buf))
|
||||||
(setf (ssl-stream-output-pointer stream) (length buf))
|
(setf (ssl-stream-output-pointer stream) (buffer-length buf))
|
||||||
(force-output stream)))
|
(force-output stream)))
|
||||||
(replace buf thing
|
(b/v-replace buf thing
|
||||||
:start1 (ssl-stream-output-pointer stream)
|
:start1 (ssl-stream-output-pointer stream)
|
||||||
:start2 start
|
:start2 start
|
||||||
:end2 end)
|
:end2 end)
|
||||||
(incf (ssl-stream-output-pointer stream) (- end start)))
|
(incf (ssl-stream-output-pointer stream) (- end start)))
|
||||||
thing)
|
thing)
|
||||||
|
|
||||||
|
@ -144,7 +143,7 @@
|
||||||
(handle (ssl-stream-handle stream))
|
(handle (ssl-stream-handle stream))
|
||||||
(socket (ssl-stream-socket stream)))
|
(socket (ssl-stream-socket stream)))
|
||||||
(when (plusp fill-ptr)
|
(when (plusp fill-ptr)
|
||||||
(cffi-sys::with-pointer-to-vector-data (ptr buf)
|
(with-pointer-to-vector-data (ptr buf)
|
||||||
(ensure-ssl-funcall socket handle #'ssl-write 0.5 handle ptr fill-ptr))
|
(ensure-ssl-funcall socket handle #'ssl-write 0.5 handle ptr fill-ptr))
|
||||||
(setf (ssl-stream-output-pointer stream) 0))))
|
(setf (ssl-stream-output-pointer stream) 0))))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue