X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Frun-program.lisp;h=b854e3109faf78fa1f20c52f79ff4d2f2877bb26;hb=0dda5090b6c16a641000b4eb2dcd479f39b784ca;hp=4d364eda885ae326ad4263707915163da0508bd1;hpb=edd4f6337f9955c34716ff87a50e4cb20e8a8521;p=sbcl.git diff --git a/src/code/run-program.lisp b/src/code/run-program.lisp index 4d364ed..b854e31 100644 --- a/src/code/run-program.lisp +++ b/src/code/run-program.lisp @@ -455,6 +455,7 @@ status slot." (copy-descriptor-to-stream new-fd pty cookie external-format))) (values name (sb-sys:make-fd-stream master :input t :output t + :external-format external-format :element-type :default :dual-channel-p t))))) @@ -495,7 +496,7 @@ status slot." ;; Copy string. (sb-kernel:copy-ub8-to-system-area octets 0 string-sap 0 size) ;; NULL-terminate it - (setf (sap-ref-32 string-sap size) 0) + (sb-kernel:system-area-ub8-fill 0 string-sap size 4) ;; Put the pointer in the vector. (setf (sap-ref-sap vec-sap vec-index-offset) string-sap) ;; Advance string-sap for the next string. @@ -734,7 +735,7 @@ Users Manual for details about the PROCESS structure."#-win32" #+win32 `(declare (ignore ,pty ,cookie)) #+win32 `(let (,pty-name ,pty-stream) ,@body) #-win32 `(multiple-value-bind (,pty-name ,pty-stream) - (open-pty ,pty ,cookie) + (open-pty ,pty ,cookie :external-format external-format) ,@body)) (with-args-vec ((vec args) &body body) `(with-c-strvec (,vec ,args) @@ -772,7 +773,7 @@ Users Manual for details about the PROCESS structure."#-win32" (if search 1 0) environment-vec pty-name (if wait 1 0)))) - (unless (= child -1) + (unless (minusp child) (setf proc (apply #'make-process @@ -790,21 +791,29 @@ Users Manual for details about the PROCESS structure."#-win32" (list :%status :running)))) (push proc *active-processes*))))) ;; Report the error outside the lock. - (when (= child -1) - (error "couldn't fork child process: ~A" - (strerror))))))))) + #+win32 + (when (minusp child) + (error "Couldn't execute ~S: ~A" progname (strerror))) + #-win32 + (case child + (-2 + (error "Couldn't execute ~S: ~A" progname (strerror))) + (-1 + (error "Couldn't fork child process: ~A" (strerror)))))))))) (dolist (fd *close-in-parent*) (sb-unix:unix-close fd)) (unless proc (dolist (fd *close-on-error*) (sb-unix:unix-close fd)) - ;; FIXME: nothing seems to set this. #-win32 (dolist (handler *handlers-installed*) - (sb-sys:remove-fd-handler handler)))) - #-win32 - (when (and wait proc) - (process-wait proc)) + (sb-sys:remove-fd-handler handler))) + #-win32 + (when (and wait proc) + (unwind-protect + (process-wait proc) + (dolist (handler *handlers-installed*) + (sb-sys:remove-fd-handler handler))))) proc))) ;;; Install a handler for any input that shows up on the file @@ -895,7 +904,9 @@ Users Manual for details about the PROCESS structure."#-win32" (strerror errno))) (t (incf read-end count) - (funcall copy-fun)))))))))) + (funcall copy-fun)))))))) + #-win32 + (push handler *handlers-installed*))) ;;; FIXME: something very like this is done in SB-POSIX to treat ;;; streams as file descriptor designators; maybe we can combine these