Raymond Toy pushed to branch issue-269-unix-get-user-homedir at cmucl / cmucl
Commits:
-
bed9958f
by Raymond Toy at 2023-11-29T07:54:12-08:00
-
2b3512cd
by Raymond Toy at 2023-11-29T07:56:17-08:00
-
03965083
by Raymond Toy at 2023-11-29T07:56:38-08:00
7 changed files:
- src/code/exports.lisp
- src/code/filesys.lisp
- src/code/os.lisp
- src/i18n/locale/cmucl-os.pot
- src/i18n/locale/cmucl.pot
- tests/filesys.lisp
- + tests/os.lisp
Changes:
| ... | ... | @@ -1712,9 +1712,7 @@ |
| 1712 | 1712 | "DESCRIBE-EXTERNAL-FORMAT"
|
| 1713 | 1713 | "LIST-ALL-EXTERNAL-FORMATS"
|
| 1714 | 1714 | "STRING-ENCODE" "STRING-DECODE"
|
| 1715 | - "SET-SYSTEM-EXTERNAL-FORMAT")
|
|
| 1716 | - ;; File sys items
|
|
| 1717 | - (:export "GET-USER-HOMEDIR-PATHNAME"))
|
|
| 1715 | + "SET-SYSTEM-EXTERNAL-FORMAT"))
|
|
| 1718 | 1716 | |
| 1719 | 1717 | (defpackage "STREAM"
|
| 1720 | 1718 | (:import-from "SYSTEM" "LISP-STREAM")
|
| ... | ... | @@ -2073,6 +2071,7 @@ |
| 2073 | 2071 | "FD-STREAM-P" "FIND-IF-IN-CLOSURE" "FOREIGN-SYMBOL-ADDRESS"
|
| 2074 | 2072 | "FOREIGN-SYMBOL-CODE-ADDRESS" "FOREIGN-SYMBOL-DATA-ADDRESS"
|
| 2075 | 2073 | "GET-PAGE-SIZE" "GET-SYSTEM-INFO"
|
| 2074 | + "GET-USER-HOMEDIR-PATHNAME"
|
|
| 2076 | 2075 | "IGNORE-INTERRUPT"
|
| 2077 | 2076 | "INT-SAP" "INVALIDATE-DESCRIPTOR" "IO-TIMEOUT"
|
| 2078 | 2077 | "LISP-STREAM" "LONG-FLOAT-RADIX" "LONG-WORDS"
|
| ... | ... | @@ -1484,28 +1484,3 @@ optionally keeping some of the most recent old versions." |
| 1484 | 1484 | (go retry))))))
|
| 1485 | 1485 | ;; Only the first path in a search-list is considered.
|
| 1486 | 1486 | (return (values pathspec created-p)))))) |
| 1487 | - |
|
| 1488 | -;;; GET-USER-HOMEDIR-PATHNAME -- Public
|
|
| 1489 | -;;;
|
|
| 1490 | -(defun get-user-homedir-pathname (name)
|
|
| 1491 | - _N"Get the user home directory for user named NAME. Two values are
|
|
| 1492 | - returned: the pathname of the home directory and a status code. If
|
|
| 1493 | - the home directory does not exist NIL is returned. The status is 0
|
|
| 1494 | - if no errors occurred. Otherwise a non-zero value is returned.
|
|
| 1495 | - Examining errno may give information about what failed."
|
|
| 1496 | - (alien:with-alien ((status c-call:int))
|
|
| 1497 | - (let ((result
|
|
| 1498 | - (alien:alien-funcall
|
|
| 1499 | - (alien:extern-alien "os_get_user_homedir"
|
|
| 1500 | - (function c-call:c-string
|
|
| 1501 | - c-call:c-string
|
|
| 1502 | - (* c-call:int)))
|
|
| 1503 | - name
|
|
| 1504 | - (alien:addr status))))
|
|
| 1505 | - (if (and (zerop status) result)
|
|
| 1506 | - (values (pathname
|
|
| 1507 | - (concatenate 'string
|
|
| 1508 | - result
|
|
| 1509 | - "/"))
|
|
| 1510 | - status)
|
|
| 1511 | - (values result status))))) |
| ... | ... | @@ -57,3 +57,28 @@ |
| 57 | 57 | (error (intl:gettext "Unix system call getrusage failed: ~A.")
|
| 58 | 58 | (unix:get-unix-error-msg utime)))
|
| 59 | 59 | (values utime stime major-fault))))
|
| 60 | + |
|
| 61 | +;;; GET-USER-HOMEDIR-PATHNAME -- Public
|
|
| 62 | +;;;
|
|
| 63 | +(defun get-user-homedir-pathname (name)
|
|
| 64 | + _N"Get the user home directory for user named NAME. Two values are
|
|
| 65 | + returned: the pathname of the home directory and a status code. If
|
|
| 66 | + the home directory does not exist NIL is returned. The status is 0
|
|
| 67 | + if no errors occurred. Otherwise a non-zero value is returned.
|
|
| 68 | + Examining errno may give information about what failed."
|
|
| 69 | + (alien:with-alien ((status c-call:int))
|
|
| 70 | + (let ((result
|
|
| 71 | + (alien:alien-funcall
|
|
| 72 | + (alien:extern-alien "os_get_user_homedir"
|
|
| 73 | + (function c-call:c-string
|
|
| 74 | + c-call:c-string
|
|
| 75 | + (* c-call:int)))
|
|
| 76 | + name
|
|
| 77 | + (alien:addr status))))
|
|
| 78 | + (if (and (zerop status) result)
|
|
| 79 | + (values (pathname
|
|
| 80 | + (concatenate 'string
|
|
| 81 | + result
|
|
| 82 | + "/"))
|
|
| 83 | + status)
|
|
| 84 | + (values result status))))) |
| ... | ... | @@ -33,3 +33,12 @@ msgstr "" |
| 33 | 33 | msgid "Unix system call getrusage failed: ~A."
|
| 34 | 34 | msgstr ""
|
| 35 | 35 | |
| 36 | +#: src/code/os.lisp
|
|
| 37 | +msgid ""
|
|
| 38 | +"Get the user home directory for user named NAME. Two values are\n"
|
|
| 39 | +" returned: the pathname of the home directory and a status code. If\n"
|
|
| 40 | +" the home directory does not exist NIL is returned. The status is 0\n"
|
|
| 41 | +" if no errors occurred. Otherwise a non-zero value is returned.\n"
|
|
| 42 | +" Examining errno may give information about what failed."
|
|
| 43 | +msgstr ""
|
|
| 44 | + |
| ... | ... | @@ -10207,15 +10207,6 @@ msgstr "" |
| 10207 | 10207 | msgid "Can't create directory ~A."
|
| 10208 | 10208 | msgstr ""
|
| 10209 | 10209 | |
| 10210 | -#: src/code/filesys.lisp
|
|
| 10211 | -msgid ""
|
|
| 10212 | -"Get the user home directory for user named NAME. Two values are\n"
|
|
| 10213 | -" returned: the pathname of the home directory and a status code. If\n"
|
|
| 10214 | -" the home directory does not exist NIL is returned. The status is 0\n"
|
|
| 10215 | -" if no errors occurred. Otherwise a non-zero value is returned.\n"
|
|
| 10216 | -" Examining errno may give information about what failed."
|
|
| 10217 | -msgstr ""
|
|
| 10218 | - |
|
| 10219 | 10210 | #: src/code/load.lisp
|
| 10220 | 10211 | msgid "The default for the :IF-SOURCE-NEWER argument to load."
|
| 10221 | 10212 | msgstr ""
|
| ... | ... | @@ -54,37 +54,3 @@ |
| 54 | 54 | (assert-equal "/tmp/foo/bar/symlink"
|
| 55 | 55 | (ext:unix-namestring "/tmp/foo/bar/symlink" nil)))
|
| 56 | 56 | (unix:unix-unlink "/tmp/foo/bar/symlink"))) |
| 57 | - |
|
| 58 | -(define-test user-homedir.1
|
|
| 59 | - "Test user-homedir"
|
|
| 60 | - (:tag :issues)
|
|
| 61 | - ;; Simple test to see if get-user-homedir-pathname returns the
|
|
| 62 | - ;; expected value. Use getuid and getpwuid to figure out what the
|
|
| 63 | - ;; name and home directory should be.
|
|
| 64 | - (let* ((uid (unix:unix-getuid))
|
|
| 65 | - (user-info (unix:unix-getpwuid uid)))
|
|
| 66 | - (assert-true uid)
|
|
| 67 | - (assert-true user-info)
|
|
| 68 | - (let* ((info-dir (unix:user-info-dir user-info))
|
|
| 69 | - (info-name (unix:user-info-name user-info))
|
|
| 70 | - (expected-home-pathname (pathname
|
|
| 71 | - (concatenate 'string info-dir "/"))))
|
|
| 72 | - (multiple-value-bind (home-pathname status)
|
|
| 73 | - (ext:get-user-homedir-pathname info-name)
|
|
| 74 | - (assert-true info-dir)
|
|
| 75 | - (assert-true info-name)
|
|
| 76 | - |
|
| 77 | - (assert-equal home-pathname expected-home-pathname)
|
|
| 78 | - (assert-eql status 0)))))
|
|
| 79 | - |
|
| 80 | -(define-test user-homedir.2
|
|
| 81 | - "Test user-homedir"
|
|
| 82 | - (:tag :issues)
|
|
| 83 | - ;; Simple test to see if get-user-homedir-pathname returns the expected
|
|
| 84 | - ;; value for a user that does not exist. Well, we assume such a
|
|
| 85 | - ;; user doesn't exist.
|
|
| 86 | - (multiple-value-bind (home-pathname status)
|
|
| 87 | - (ext:get-user-homedir-pathname "zotuserunknown")
|
|
| 88 | - (assert-eql home-pathname nil)
|
|
| 89 | - (assert-eql status 0)))
|
|
| 90 | - |
| 1 | +(defpackage :os-tests
|
|
| 2 | + (:use :cl :lisp-unit))
|
|
| 3 | + |
|
| 4 | +(in-package "OS-TESTS")
|
|
| 5 | + |
|
| 6 | + |
|
| 7 | +(define-test user-homedir.1
|
|
| 8 | + "Test user-homedir"
|
|
| 9 | + (:tag :issues)
|
|
| 10 | + ;; Simple test to see if get-user-homedir-pathname returns the
|
|
| 11 | + ;; expected value. Use getuid and getpwuid to figure out what the
|
|
| 12 | + ;; name and home directory should be.
|
|
| 13 | + (let* ((uid (unix:unix-getuid))
|
|
| 14 | + (user-info (unix:unix-getpwuid uid)))
|
|
| 15 | + (assert-true uid)
|
|
| 16 | + (assert-true user-info)
|
|
| 17 | + (let* ((info-dir (unix:user-info-dir user-info))
|
|
| 18 | + (info-name (unix:user-info-name user-info))
|
|
| 19 | + (expected-home-pathname (pathname
|
|
| 20 | + (concatenate 'string info-dir "/"))))
|
|
| 21 | + (multiple-value-bind (home-pathname status)
|
|
| 22 | + (system:get-user-homedir-pathname info-name)
|
|
| 23 | + (assert-true info-dir)
|
|
| 24 | + (assert-true info-name)
|
|
| 25 | + |
|
| 26 | + (assert-equal home-pathname expected-home-pathname)
|
|
| 27 | + (assert-eql status 0)))))
|
|
| 28 | + |
|
| 29 | +(define-test user-homedir.2
|
|
| 30 | + "Test user-homedir"
|
|
| 31 | + (:tag :issues)
|
|
| 32 | + ;; Simple test to see if get-user-homedir-pathname returns the expected
|
|
| 33 | + ;; value for a user that does not exist. Well, we assume such a
|
|
| 34 | + ;; user doesn't exist.
|
|
| 35 | + (multiple-value-bind (home-pathname status)
|
|
| 36 | + (system:get-user-homedir-pathname "zotuserunknown")
|
|
| 37 | + (assert-eql home-pathname nil)
|
|
| 38 | + (assert-eql status 0))) |