sys-user.eclass: add and utilize a sys-user_getname() function.
authorMichael Orlitzky <michael@orlitzky.com>
Mon, 7 Aug 2017 21:50:35 +0000 (17:50 -0400)
committerMichael Orlitzky <michael@orlitzky.com>
Mon, 7 Aug 2017 21:50:35 +0000 (17:50 -0400)
eclass/sys-user.eclass

index 9042f0699593f81c1478aea8d878adb0efeae5bf..090a5ad50b5bb7c47ee709cfb140c12df146223e 100644 (file)
@@ -77,13 +77,19 @@ sys-user_src_compile() { :; }
 sys-user_src_test() { :; }
 
 sys-user_getuid() {
-       [[ $# -eq 1 ]] || die "usage: sys-user_getuid <username>"
-
        # Output the real UID of the given user, or the empty string if the
        # user does not exist on the system.
+       [[ $# -eq 1 ]] || die "usage: sys-user_getuid <username>"
        echo $(id --real --user "${1}")
 }
 
+sys-user_getname() {
+       # Output the username associated with the given UID, or the empty string
+       # if the given UID is still available.
+       [[ $# -eq 1 ]] || die "usage: sys-user_getname <uid>"
+       echo $(egetent passwd "${1}" | cut -f1 -d':')
+}
+
 sys-user_create() {
        # Create the user whose information is contained in the following
        # variables:
@@ -136,7 +142,7 @@ sys-user_pkg_pretend() {
        if [[ "${SYS_USER_UID_IMPORTANT}" == "true" ]]; then
                # Ok, the UID is important. Make sure nobody else has it. Or
                # rather, nobody else *with a different username* has it.
-               local oldname=$(egetent passwd "${SYS_USER_UID}" | cut -f1 -d':')
+               local oldname=$(sys-user_getname "${SYS_USER_UID}")
                if [[ "${SYS_USER_NAME}" != "${oldname}" ]]; then
                        die "important UID ${SYS_USER_UID} already belongs to ${oldname}"
                fi
@@ -178,8 +184,16 @@ sys-user_src_configure() {
                fi
        fi
 
-       # TODO: if the requested (unimportant) UID is not available, we
-       # should set SYS_USER_UID to the empty string.
+       if [[ -n "${SYS_USER_UID}" ]]; then
+               # A specific UID was requested.
+               local current_name=$(sys-user_getname "${SYS_USER_UID}")
+               if [[ "${current_name}" != "${SYS_USER_NAME}" ]]; then
+                       # This UID is already taken by another user, but this
+                       # specific UID was not important (we checked in
+                       # pkg_pretend), so fall back to an arbitrary one.
+                       SYS_USER_UID=""
+               fi
+       fi
 
        # The "useradd" and "usermod" tools expect a comma-separated list,
        # so change our spaces to commas. Having duplicates in the list is