Raymond Toy pushed to branch issue-266-b-tilde-pathname-support at cmucl / cmucl
Commits:
-
31ebd79e
by Raymond Toy at 2023-12-06T13:29:10-08:00
-
fa8607b1
by Raymond Toy at 2023-12-06T13:38:59-08:00
3 changed files:
Changes:
... | ... | @@ -2074,7 +2074,7 @@ |
2074 | 2074 | "FD-STREAM-P" "FIND-IF-IN-CLOSURE" "FOREIGN-SYMBOL-ADDRESS"
|
2075 | 2075 | "FOREIGN-SYMBOL-CODE-ADDRESS" "FOREIGN-SYMBOL-DATA-ADDRESS"
|
2076 | 2076 | "GET-PAGE-SIZE" "GET-SYSTEM-INFO"
|
2077 | - "GET-USER-HOMEDIR-PATHNAME"
|
|
2077 | + "GET-USER-HOMEDIR-NAMESTRING"
|
|
2078 | 2078 | "IGNORE-INTERRUPT"
|
2079 | 2079 | "INT-SAP" "INVALIDATE-DESCRIPTOR" "IO-TIMEOUT"
|
2080 | 2080 | "LISP-STREAM" "LONG-FLOAT-RADIX" "LONG-WORDS"
|
... | ... | @@ -305,10 +305,9 @@ |
305 | 305 | (cond ((zerop (length name))
|
306 | 306 | (let ((user (unix:unix-getpwuid (unix:unix-getuid))))
|
307 | 307 | (concatenate 'simple-base-string
|
308 | - (unix:user-info-dir user)
|
|
309 | - "/")))
|
|
308 | + (unix:user-info-dir user))))
|
|
310 | 309 | (t
|
311 | - (let ((path (system:get-user-homedir-pathname name)))
|
|
310 | + (let ((path (system:get-user-homedir-namestring name)))
|
|
312 | 311 | (unless path
|
313 | 312 | (error "Unknown user: ~S" name))
|
314 | 313 | path))))
|
... | ... | @@ -326,22 +325,24 @@ |
326 | 325 | (let ((end-user (position #\/ str :start start :end end)))
|
327 | 326 | #+nil
|
328 | 327 | (format t "user ~D:~D: ~A~%" (1+ start) end-user (subseq str (1+ start) end-user))
|
329 | - (cond (end-user
|
|
330 | - (let* ((user-name (subseq str (1+ start) end-user))
|
|
331 | - (homedir (user-homedir-namestring user-name)))
|
|
332 | - #+nil
|
|
333 | - (format t "user-name: ~S; homedir: ~S~%"
|
|
334 | - user-name homedir)
|
|
335 | - (values (concatenate 'simple-base-string
|
|
336 | - (subseq str 0 start)
|
|
337 | - homedir
|
|
338 | - (subseq str (1+ end-user)))
|
|
339 | - start
|
|
340 | - (+ end (- (length homedir)
|
|
341 | - (length user-name)
|
|
342 | - 2)))))
|
|
343 | - (t
|
|
344 | - (values str start end)))))
|
|
328 | + ;; Quick exit if we can't find a "/" to terminate the user name.
|
|
329 | + (unless end-user
|
|
330 | + (return-from replace-tilde-user
|
|
331 | + (values str start end)))
|
|
332 | + (let* ((user-name (subseq str (1+ start) end-user))
|
|
333 | + (homedir (user-homedir-namestring user-name)))
|
|
334 | + #+nil
|
|
335 | + (format t "user-name: ~S; homedir: ~S~%"
|
|
336 | + user-name homedir)
|
|
337 | + ;; Replace the ~user part with the home directory, adjusting END because of the replacement.
|
|
338 | + (values (concatenate 'simple-base-string
|
|
339 | + (subseq str 0 start)
|
|
340 | + homedir
|
|
341 | + (subseq str end-user))
|
|
342 | + start
|
|
343 | + (+ end (- (length homedir)
|
|
344 | + (length user-name)
|
|
345 | + 1))))))
|
|
345 | 346 |
|
346 | 347 | (defun parse-unix-namestring (namestr start end)
|
347 | 348 | (declare (type simple-base-string namestr)
|
... | ... | @@ -58,9 +58,9 @@ |
58 | 58 | (unix:get-unix-error-msg utime)))
|
59 | 59 | (values utime stime major-fault))))
|
60 | 60 | |
61 | -;;; GET-USER-HOMEDIR-PATHNAME -- Public
|
|
61 | +;;; GET-USER-HOMEDIR-NAMESTRING -- Public
|
|
62 | 62 | ;;;
|
63 | -(defun get-user-homedir-pathname (name)
|
|
63 | +(defun get-user-homedir-namestring (name)
|
|
64 | 64 | _N"Get the user home directory for user named NAME. Two values are
|
65 | 65 | returned: the pathname of the home directory and a status code. If
|
66 | 66 | the home directory does not exist NIL is returned. The status is 0
|
... | ... | @@ -80,9 +80,7 @@ |
80 | 80 | (alien:addr status)))
|
81 | 81 | (if (and (zerop status)
|
82 | 82 | (not (alien:null-alien result)))
|
83 | - (values (concatenate 'string
|
|
84 | - (alien:cast result c-call:c-string)
|
|
85 | - "/")
|
|
83 | + (values (alien:cast result c-call:c-string)
|
|
86 | 84 | status)
|
87 | 85 | (values nil status)))
|
88 | 86 | (alien:free-alien result))))) |