(setf handler nil)
(decf (car cookie))
(sb-unix:unix-close descriptor)
+ (unless (zerop read-end)
+ ;; Should this be an END-OF-FILE?
+ (error "~@<non-empty buffer when EOF reached ~
+ while reading from child: ~S~:>" buf))
(return))
((null count)
(sb-sys:remove-fd-handler handler)
(strerror errno)))
(t
(incf read-end count)
- (let* ((decode-end (length buf))
+ (let* ((decode-end read-end)
(string (handler-case
(octets-to-string
buf :end read-end
:input i :output stream)))))
(assert (= (length string) 6))
(assert (string= string "abcdef")))
+
+ ;;; Test the bookkeeping involved in decoding the child's output:
+
+ ;; repeated short, properly-encoded reads exposed one bug. (But
+ ;; note: this test will be inconclusive if the child's stderr is
+ ;; fully buffered.)
+ (let ((str (with-output-to-string (s)
+ (run-program "/bin/sh"
+ '("-c" "(echo Foo; sleep 2s; echo Bar)>&2")
+ :output s :search t :error :output :wait t))))
+ (assert (string= str (format nil "Foo~%Bar~%"))))
+
+ ;; end of file in the middle of a UTF-8 character
+ (typep (nth-value 1 (ignore-errors
+ (let ((sb-impl::*default-external-format* :utf-8))
+ (with-output-to-string (s)
+ (run-program "printf" '("\\316")
+ :output s :search t :wait t)))))
+ 'error)
+
;; success convention for this Lisp program run as part of a larger script
(sb-ext:quit :unix-status 52)))
EOF
;;; checkins which aren't released. (And occasionally for internal
;;; versions, especially for internal versions off the main CVS
;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"1.0.12.33"
+"1.0.12.34"