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