--- a/user.eclass 2018-05-04 17:00:27.539576668 -0400 +++ b/user.eclass 2018-05-04 18:04:04.008990543 -0400 @@ -130,21 +130,15 @@ if [[ -n ${euid} && ${euid} != -1 ]] ; then if [[ ${euid} -gt 0 ]] ; then if [[ -n $(egetent passwd ${euid}) ]] ; then - euid="next" + euid="next available; requested uid taken" fi else eerror "Userid given but is not greater than 0 !" die "${euid} is not a valid UID" fi else - euid="next" + euid="next available" fi - if [[ ${euid} == "next" ]] ; then - for ((euid = 101; euid <= 999; euid++)); do - [[ -z $(egetent passwd ${euid}) ]] && break - done - fi - opts+=( -u ${euid} ) einfo " - Userid: ${euid}" # handle shell @@ -217,9 +211,20 @@ einfo " - GECOS: ${comment}" fi + # Some targets need to find the next available UID manually + _enewgroup_next_uid() { + if [[ ${euid} == *[!0-9]* ]] ; then + # Non numeric + for ((euid = 101; euid <= 999; euid++)) ; do + [[ -z $(egetent passwd ${euid}) ]] && break + done + fi + } + # add the user case ${CHOST} in *-darwin*) + _enewgroup_next_uid ### Make the user dscl . create "/users/${euser}" uid ${euid} dscl . create "/users/${euser}" shell "${eshell}" @@ -240,12 +245,18 @@ ;; *-openbsd*) + _enewgroup_next_uid # all ops the same, except the -g vs -g/-G ... useradd -u ${euid} -s "${eshell}" \ -d "${ehome}" -g "${egroups}" "${euser}" || die ;; *) + if [[ ${euid} == *[!0-9]* ]] ; then + : # Non numeric; let useradd figure out a UID for us + else + opts+=( -u "${euid}" ) + fi useradd -r "${opts[@]}" "${euser}" || die ;; esac