0.pre7.14.flaky4.3:
[sbcl.git] / src / code / run-program.lisp
index a4d7b7b..1dad7f9 100644 (file)
@@ -10,7 +10,7 @@
 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
 ;;;; files for more information.
 
-(in-package "SB-IMPL")
+(in-package "SB-IMPL") ;(SB-IMPL, not SB!IMPL, since we're built in warm load.)
 \f
 ;;;; hacking the Unix environment
 ;;;;
 ;;;; visible at GENESIS time.
 
 (def-alien-variable "environ" (* c-string))
+(push (lambda ()
+       ;; We redo this here to protect ourselves from this scenario:
+       ;;   * Build under one version of shared lib, save a core.
+       ;;   * Load core under another version of shared lib. ("Now
+       ;;     where was environ again?" SIGSEGV, etc.)
+       ;; Obviously it's a KLUDGE to do this hack for every alien
+       ;; variable, but as it happens, as of sbcl-0.7.0 this is the
+       ;; only alien variable used to implement SBCL, so it's not
+       ;; worth coming up with a general solution. (A general
+       ;; solution would be nice for users who want to have their
+       ;; alien code be preserved across a save/load cycle, but this
+       ;; problem with alien variables is only one of several
+       ;; problems which'd need to be solved before that can happen.)
+        (def-alien-variable "environ" (* c-string)))
+      *after-save-initializations*)
 
 (defun posix-environ ()
   "Return the Unix environment (\"man environ\") as a list of SIMPLE-STRINGs."
   (stdout sb-c-call:int)
   (stderr sb-c-call:int))
 
+;;; Is UNIX-FILENAME the name of a file that we can execute?
+(defun unix-filename-is-executable-p (unix-filename)
+  (declare (type simple-string unix-filename))
+  (values (and (eq (sb-unix:unix-file-kind unix-filename) :file)
+              (sb-unix:unix-access unix-filename sb-unix:x_ok))))
+
 ;;; FIXME: There shouldn't be two semiredundant versions of the
 ;;; documentation. Since this is a public extension function, the
 ;;; documentation should be in the doc string. So all information from
               ;; (I don't want to do it with search lists the way
               ;; that CMU CL did, because those are a non-ANSI
               ;; extension which I'd like to get rid of. -- WHN)
-              (pfile (unix-namestring program t t))
+              (pfile (unix-namestring program t))
               (cookie (list 0)))
           (unless pfile
             (error "no such program: ~S" program))
+          (unless (unix-filename-is-executable-p pfile)
+            (error "not executable: ~S" program))
           (multiple-value-bind (stdin input-stream)
               (get-descriptor-for input cookie
                                   :direction :input