X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=os.lisp;h=5db6be7895700eee4ae2c86f8dfc92bb709ee73e;hp=5b6fff3aa3d90aad02dd8ce57fa88f25c0560f87;hb=5eb8855a93223b34f5af030507484cbf466aea03;hpb=e55fe0dc654bb7cd01e978a7080b6087788f173f diff --git a/os.lisp b/os.lisp index 5b6fff3..5db6be7 100644 --- a/os.lisp +++ b/os.lisp @@ -15,11 +15,11 @@ (defun command-output (control-string &rest args) "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and -synchronously execute the result using a Bourne-compatible shell, +synchronously execute the result using a Bourne-compatible shell, returns (VALUES string-output error-output exit-status)" (let ((command (apply #'format nil control-string args))) #+sbcl - (let* ((process (sb-ext:run-program + (let* ((process (sb-ext:run-program "/bin/sh" (list "-c" command) :input nil :output :stream :error :stream)) @@ -30,11 +30,11 @@ returns (VALUES string-output error-output exit-status)" (values output error - (sb-impl::process-exit-code process))) + (sb-impl::process-exit-code process))) + - #+(or cmu scl) - (let* ((process (ext:run-program + (let* ((process (ext:run-program "/bin/sh" (list "-c" command) :input nil :output :stream :error :stream)) @@ -52,28 +52,29 @@ returns (VALUES string-output error-output exit-status)" (multiple-value-bind (output error status) (excl.osi:command-output command :whole t) (values output error status)) - + #+lispworks ;; BUG: Lispworks combines output and error streams (let ((output (make-string-output-stream))) (unwind-protect - (let ((status + (let ((status (system:call-system-showing-output command - :shell-type "/bin/sh" + :prefix "" + :show-cmd nil :output-stream output))) (values (get-output-stream-string output) nil status)) (close output))) - - #+clisp + + #+clisp ;; BUG: CLisp doesn't allow output to user-specified stream (values nil nil (ext:run-shell-command command :output :terminal :wait t)) - + #+openmcl - (let* ((process (ccl:run-program + (let* ((process (ccl:run-program "/bin/sh" (list "-c" command) :input nil :output :stream :error :stream @@ -85,7 +86,7 @@ returns (VALUES string-output error-output exit-status)" (values output error (nth-value 1 (ccl::external-process-status process)))) - + #-(or openmcl clisp lispworks allegro scl cmu sbcl) (error "COMMAND-OUTPUT not implemented for this Lisp") @@ -93,24 +94,24 @@ returns (VALUES string-output error-output exit-status)" (defun run-shell-command (control-string &rest args) "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and -synchronously execute the result using a Bourne-compatible shell, +synchronously execute the result using a Bourne-compatible shell, returns (VALUES output-string pid)" (let ((command (apply #'format nil control-string args))) #+sbcl (sb-impl::process-exit-code - (sb-ext:run-program + (sb-ext:run-program "/bin/sh" (list "-c" command) :input nil :output nil)) - + #+(or cmu scl) (ext:process-exit-code - (ext:run-program + (ext:run-program "/bin/sh" (list "-c" command) :input nil :output nil)) - - + + #+allegro (excl:run-shell-command command :input nil :output nil :wait t) @@ -119,18 +120,20 @@ returns (VALUES output-string pid)" (system:call-system-showing-output command :shell-type "/bin/sh" - :output-stream output) - + :show-cmd nil + :prefix "" + :output-stream nil) + #+clisp ;XXX not exactly *verbose-out*, I know (ext:run-shell-command command :output :terminal :wait t) - + #+openmcl (nth-value 1 (ccl:external-process-status (ccl:run-program "/bin/sh" (list "-c" command) :input nil :output nil :wait t))) - + #-(or openmcl clisp lispworks allegro scl cmu sbcl) (error "RUN-SHELL-PROGRAM not implemented for this Lisp") @@ -148,3 +151,29 @@ returns (VALUES output-string pid)" (command-output cmd))) ((eq if-does-not-exist :error) (error "Directory ~A does not exist [delete-directory-and-files]." dir)))) + +(defun file-size (file) + (when (probe-file file) + #+allegro (let ((stat (excl.osi:stat (namestring file)))) + (excl.osi:stat-size stat)) + #-allegro + (with-open-file (in file :direction :input) + (file-length in)))) + +(defun getpid () + "Return the PID of the lisp process." + #+allegro (excl::getpid) + #+(and lispworks win32) (win32:get-current-process-id) + #+(and lispworks (not win32)) (system::getpid) + #+sbcl (sb-posix:getpid) + #+cmu (unix:unix-getpid) + #+openmcl (ccl::getpid) + #+(and clisp unix) (system::process-id) + #+(and clisp win32) (cond ((find-package :win32) + (funcall (find-symbol "GetCurrentProcessId" + :win32))) + (t + (system::getenv "PID"))) + ) + +