diff options
author | ben <ben@pkgsrc.org> | 2006-10-12 23:10:55 +0000 |
---|---|---|
committer | ben <ben@pkgsrc.org> | 2006-10-12 23:10:55 +0000 |
commit | 4c1456124ab49a22e07f34b2dfb6d5c4a5f40d01 (patch) | |
tree | 18bea809afabafa29d5fd523a6739571a662fd72 /mk/pkginstall | |
parent | 6077cb9a7a934e979c320819331d7e754ad3ba3d (diff) | |
download | pkgsrc-4c1456124ab49a22e07f34b2dfb6d5c4a5f40d01.tar.gz |
Linux shadow-utils provides a useradd that fails when creating a home
directory under a base directory hat does not exist. Add workaround
to ensure that the base directory does exist. This addresses PR#34779
Diffstat (limited to 'mk/pkginstall')
-rw-r--r-- | mk/pkginstall/usergroupfuncs.Linux | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/mk/pkginstall/usergroupfuncs.Linux b/mk/pkginstall/usergroupfuncs.Linux new file mode 100644 index 00000000000..3c86e4f2f46 --- /dev/null +++ b/mk/pkginstall/usergroupfuncs.Linux @@ -0,0 +1,146 @@ +# $NetBSD: usergroupfuncs.Linux,v 1.1 2006/10/12 23:10:55 ben Exp $ +# +# Platform-specific adduser and addgroup functionality +# on top of shadow-utils. (Not libuser) + +# group_exists group [groupid] +# Returns 0 if $group exists and has gid $groupid +# Returns 1 if neither $group nor $groupid exist +# Returns 2 if $group or $groupid exist but don't match +# Returns 3 for all errors +# +group_exists() +{ + _group="$1"; _groupid="$2" + ${TEST} -n "$_group" || return 3 + + # Check using chgrp to work properly in an NSS/NIS environment. + _tmpdir="./.pkginstall.$$" + ${MKDIR} -p $_tmpdir 2>/dev/null || return 3 + ${CHMOD} 0700 $_tmpdir + _testpath="$_tmpdir/group_exists" + ${ECHO} > $_testpath + if ${CHGRP} $_group $_testpath >/dev/null 2>&1; then + # $_group exists + _id=`${LS} -ln $_testpath 2>/dev/null | ${AWK} '{ print $4 }'` + ${TEST} -n "$_groupid" || _groupid=$_id + if ${TEST} "$_groupid" = "$_id"; then + ${RM} -fr $_tmpdir; return 0 + fi + ${RM} -fr $_tmpdir; return 2 + elif ${TEST} -z "$_groupid"; then + # $_group doesn't exist and $_groupid is not set + ${RM} -fr $_tmpdir; return 1 + elif ${CHGRP} $_groupid $_testpath >/dev/null 2>&1; then + _name=`${LS} -l $_testpath 2>/dev/null | ${AWK} '{ print $4 }'` + if ${TEST} "$_name" != "$_groupid"; then + # $_group doesn't exist, but $_groupid exists + ${RM} -fr $_tmpdir; return 2 + fi + # neither $_group nor $_groupid exist + ${RM} -fr $_tmpdir; return 1 + fi + ${RM} -fr $_tmpdir; return 3 +} + +# user_exists user [userid] +# Returns 0 if $user exists and has uid $userid +# Returns 1 if neither $user nor $userid exist +# Returns 2 if $user or $userid exist but don't match +# Returns 3 for all errors +# +user_exists() +{ + _user="$1"; _userid="$2" + ${TEST} -n "$_user" || return 3 + + # Check using chown to work properly in an NSS/NIS environment. + _tmpdir="./.pkginstall.$$" + ${MKDIR} -p $_tmpdir 2>/dev/null || return 3 + ${CHMOD} 0700 $_tmpdir + _testpath="$_tmpdir/user_exists" + ${ECHO} > $_testpath + if ${CHOWN} $_user $_testpath >/dev/null 2>&1; then + # $_user exists + _id=`${LS} -ln $_testpath 2>/dev/null | ${AWK} '{ print $3 }'` + ${TEST} -n "$_userid" || _userid=$_id + if ${TEST} "$_userid" = "$_id"; then + ${RM} -fr $_tmpdir; return 0 + fi + ${RM} -fr $_tmpdir; return 2 + elif ${TEST} -z "$_userid"; then + # $_user doesn't exist and $_userid is not set + ${RM} -fr $_tmpdir; return 1 + elif ${CHOWN} $_userid $_testpath >/dev/null 2>&1; then + _name=`${LS} -l $_testpath 2>/dev/null | ${AWK} '{ print $3 }'` + if ${TEST} "$_name" != "$_userid"; then + # $_user doesn't exist, but $_userid exists + ${RM} -fr $_tmpdir; return 2 + fi + # neither $_user nor $_userid exist + ${RM} -fr $_tmpdir; return 1 + fi + ${RM} -fr $_tmpdir; return 3 +} + +# adduser user group [userid] [descr] [home] [shell] +adduser() +{ + user="$1"; group="$2"; userid="$3" + descr="$4"; home="$5" shell="$6" + ${TEST} $# -eq 6 || return 1 + ${TEST} -n "$user" || return 2 + ${TEST} -n "$group" || return 2 + + USERADD="@USERADD@" + + case $user in + ${PKGNAME%-[0-9]*}) descr_dflt="$user user" ;; + *) descr_dflt="${PKGNAME%-[0-9]*} $user user" ;; + esac + : ${descr:="$descr_dflt"} + : ${home:="@PKG_USER_HOME@"} + : ${shell:="@PKG_USER_SHELL@"} + + if ${TEST} -n "${USERADD}" -a -x "${USERADD}"; then + ${ECHO} "Creating user: $user" + # if home directory is missing, make and remove it + # ensures that the base directory exists, for shadow-utils + if ! ${TEST} -d "$home"; then + ${MKDIR} -p "$home" + ${RMDIR} "$home" 2>/dev/null + fi + case $userid in + "") + ${USERADD} \ + -c "$descr" -d "$home" -s "$shell" \ + -g $group $user + ;; + *) + ${USERADD} \ + -c "$descr" -d "$home" -s "$shell" \ + -g $group -u $userid $user + ;; + esac + fi + return 0 +} + +# adduser group [groupid] +addgroup() +{ + group="$1"; groupid="$2" + ${TEST} $# -eq 2 || return 1 + ${TEST} -n "$group" || return 2 + + GROUPADD="@GROUPADD@" + + if ${TEST} -n "${GROUPADD}" -a -x "${GROUPADD}"; then + ${ECHO} "Creating group: $group"; + case $groupid in + "") ${GROUPADD} $group ;; + *) ${GROUPADD} -g $groupid $group ;; + esac + fi + return 0 +} |