More robust homedir detection on Windows.
authorStas Boukarev <stassats@gmail.com>
Sun, 10 Nov 2013 18:26:17 +0000 (22:26 +0400)
committerStas Boukarev <stassats@gmail.com>
Sun, 10 Nov 2013 18:26:17 +0000 (22:26 +0400)
After consulting HOME, try USERPROFILE, then HOMEDRIVE+HOMEPATH.

Fixes lp#922117.

NEWS
src/code/filesys.lisp

diff --git a/NEWS b/NEWS
index 898f465..30f7f79 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -12,7 +12,7 @@ changes relative to sbcl-1.1.13:
   * bug fix: EQUALP now compares correctly structures with raw slots larger
     than a single word.
   * bug fix: contribs couldn't be built on Windows with MinGW.
-  * bug fix: Better pathname handling on Windows.
+  * bug fix: Better pathname handling on Windows. (lp#922117)
 
 changes in sbcl-1.1.13 relative to sbcl-1.1.12:
   * optimization: better distribution of SXHASH over small conses of related
index 960cf4e..c10aabc 100644 (file)
@@ -584,13 +584,21 @@ exist or if is a file or a symbolic link."
                                :as-directory t))))
 
 (defun user-homedir-namestring (&optional username)
-  (if username
-      (sb!unix:user-homedir username)
-      (let ((env-home (posix-getenv "HOME")))
-        (if (and env-home (not (string= env-home "")))
-            env-home
+  (flet ((not-empty (x)
+           (and (not (equal x "")) x)))
+    (if username
+        (sb!unix:user-homedir username)
+        (or (not-empty (posix-getenv "HOME"))
+            #!+win32
+            (not-empty (posix-getenv "USERPROFILE"))
+            #!+win32
+            (let ((drive (not-empty (posix-getenv "HOMEDRIVE")))
+                  (path (not-empty (posix-getenv "HOMEPATH"))))
+              (and drive path
+                   (concatenate 'string drive path)))
             #!-win32
-            (sb!unix:uid-homedir (sb!unix:unix-getuid))))))
+            (not-empty (sb!unix:uid-homedir (sb!unix:unix-getuid)))
+            (error "Couldn't find home directory.")))))
 
 ;;; (This is an ANSI Common Lisp function.)
 (defun user-homedir-pathname (&optional host)