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))) |