Add files from parent branch HEAD:
[pkgsrc.git] / mk / pkginstall / usergroupfuncs
1 # $NetBSD: usergroupfuncs,v 1.2 2006/12/15 13:15:06 martti Exp $
2 #
3 # Default implementations of user_exists() and group_exists() shell
4 # functions for checking the existence of users and groups, and of
5 # adduser() and addgroup() shell functions for adding users and groups.
6 # Assume there are NetBSD/Solaris-compatible versions of useradd(8) and
7 # groupadd(8) available through ${USERADD} and ${GROUPADD}, respectively.
8 #
9 # Platform-specific replacements for this file should be located at:
10 #
11 #       pkgsrc/mk/pkginstall/usergroupfuncs.${OPSYS}
12 #
13
14 # group_exists group [groupid]
15 #       Returns 0 if $group exists and has gid $groupid
16 #       Returns 1 if neither $group nor $groupid exist
17 #       Returns 2 if $group or $groupid exist but don't match
18 #       Returns 3 for all errors
19 #
20 group_exists()
21 {
22         _group="$1"; _groupid="$2"
23         ${TEST} -n "$_group" || return 3
24
25         # Check using chgrp to work properly in an NSS/NIS environment.
26         _tmpdir="./.pkginstall.$$"
27         ${MKDIR} -p $_tmpdir 2>/dev/null || return 3
28         ${CHMOD} 0700 $_tmpdir
29         _testpath="$_tmpdir/group_exists"
30         ${ECHO} > $_testpath
31         if ${CHGRP} $_group $_testpath >/dev/null 2>&1; then
32                 # $_group exists
33                 _id=`${LS} -ln $_testpath 2>/dev/null | ${AWK} '{ print $4 }'`
34                 ${TEST} -n "$_groupid" || _groupid=$_id
35                 if ${TEST} "$_groupid" = "$_id"; then
36                         ${RM} -fr $_tmpdir; return 0
37                 fi
38                 ${RM} -fr $_tmpdir; return 2
39         elif ${TEST} -z "$_groupid"; then
40                 # $_group doesn't exist and $_groupid is not set
41                 ${RM} -fr $_tmpdir; return 1
42         elif ${CHGRP} $_groupid $_testpath >/dev/null 2>&1; then
43                 _name=`${LS} -l $_testpath 2>/dev/null | ${AWK} '{ print $4 }'`
44                 if ${TEST} "$_name" != "$_groupid"; then
45                         # $_group doesn't exist, but $_groupid exists
46                         ${RM} -fr $_tmpdir; return 2
47                 fi
48                 # neither $_group nor $_groupid exist
49                 ${RM} -fr $_tmpdir; return 1
50         fi
51         ${RM} -fr $_tmpdir; return 3
52 }
53
54 # user_exists user [userid]
55 #       Returns 0 if $user exists and has uid $userid
56 #       Returns 1 if neither $user nor $userid exist
57 #       Returns 2 if $user or $userid exist but don't match
58 #       Returns 3 for all errors
59 #
60 user_exists()
61 {
62         _user="$1"; _userid="$2"
63         ${TEST} -n "$_user" || return 3
64
65         # Check using chown to work properly in an NSS/NIS environment.
66         _tmpdir="./.pkginstall.$$"
67         ${MKDIR} -p $_tmpdir 2>/dev/null || return 3
68         ${CHMOD} 0700 $_tmpdir
69         _testpath="$_tmpdir/user_exists"
70         ${ECHO} > $_testpath
71         if ${CHOWN} $_user $_testpath >/dev/null 2>&1; then
72                 # $_user exists
73                 _id=`${LS} -ln $_testpath 2>/dev/null | ${AWK} '{ print $3 }'`
74                 ${TEST} -n "$_userid" || _userid=$_id
75                 if ${TEST} "$_userid" = "$_id"; then
76                         ${RM} -fr $_tmpdir; return 0
77                 fi
78                 ${RM} -fr $_tmpdir; return 2
79         elif ${TEST} -z "$_userid"; then
80                 # $_user doesn't exist and $_userid is not set
81                 ${RM} -fr $_tmpdir; return 1
82         elif ${CHOWN} $_userid $_testpath >/dev/null 2>&1; then
83                 _name=`${LS} -l $_testpath 2>/dev/null | ${AWK} '{ print $3 }'`
84                 if ${TEST} "$_name" != "$_userid"; then
85                         # $_user doesn't exist, but $_userid exists
86                         ${RM} -fr $_tmpdir; return 2
87                 fi
88                 # neither $_user nor $_userid exist
89                 ${RM} -fr $_tmpdir; return 1
90         fi
91         ${RM} -fr $_tmpdir; return 3
92 }
93
94 # adduser user group [userid] [descr] [home] [shell]
95 adduser()
96 {
97         user="$1"; group="$2"; userid="$3"
98         descr="$4"; home="$5" shell="$6"
99         ${TEST} $# -eq 6 || return 1
100         ${TEST} -n "$user" || return 2
101         ${TEST} -n "$group" || return 2
102
103         USERADD="@USERADD@"
104
105         case $user in
106         ${PKGNAME%-[0-9]*})     descr_dflt="$user user" ;;
107         *)                      descr_dflt="${PKGNAME%-[0-9]*} $user user" ;;
108         esac
109         : ${descr:="$descr_dflt"}
110         : ${home:="@PKG_USER_HOME@"}
111         : ${shell:="@PKG_USER_SHELL@"}
112
113         if ${TEST} -n "${USERADD}" -a -x "${USERADD}"; then
114                 ${ECHO} "${PKGNAME}: Creating user \`\`$user''"
115                 case $userid in
116                 "")
117                         ${USERADD}                                      \
118                                 -c "$descr" -d "$home" -s "$shell"      \
119                                 -g $group $user
120                         ;;
121                 *)
122                         ${USERADD}                                      \
123                                 -c "$descr" -d "$home" -s "$shell"      \
124                                 -g $group -u $userid $user
125                         ;;
126                 esac
127         fi
128         return 0
129 }
130
131 # adduser group [groupid]
132 addgroup()
133 {
134         group="$1"; groupid="$2"
135         ${TEST} $# -eq 2 || return 1
136         ${TEST} -n "$group" || return 2
137
138         GROUPADD="@GROUPADD@"
139
140         if ${TEST} -n "${GROUPADD}" -a -x "${GROUPADD}"; then
141                 ${ECHO} "${PKGNAME}: Creating group \`\`$group''"
142                 case $groupid in
143                 "")     ${GROUPADD} $group ;;
144                 *)      ${GROUPADD} -g $groupid $group ;;
145                 esac
146         fi
147         return 0
148 }