Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 477804 | Differences between
and this patch

Collapse All | Expand All

(-)user.eclass (-50 / +47 lines)
Lines 99-104 Link Here
99
	esac
99
	esac
100
}
100
}
101
101
102
# @FUNCTION: _get_next_id
103
# @INTERNAL
104
# @USAGE: <database> [id]
105
# @DESCRIPTION:
106
# Get the next available ID for a new entity.  Pass a value for id
107
# to suggest an ID to try first.  Omit or pass -1 to just get the next
108
# available ID.
109
#
110
# Supported databases: group passwd
111
_get_next_id() {
112
	local db=$1; shift
113
	if [[ -z ${db} ]] ; then
114
		eerror "No database specified !"
115
		die "Cannot call _get_next_id without a database"
116
	fi
117
118
	case ${db} in
119
	passwd|group) ;;
120
	*) die "sorry, database '${db}' not yet supported; file a bug" ;;
121
	esac
122
123
	local eid=$2
124
	if [[ -z ${eid} || ${eid} -eq -1 ]] ; then
125
		eid="next available"
126
	elif [[ ${eid} -gt 0 ]] ; then
127
		if [[ -n $(egetent ${db} ${eid}) ]] ; then
128
			eid="next available"
129
		fi
130
	else
131
		eerror "ID given but is not greater than 0 !"
132
		die "${eid} is not a valid ID"
133
	fi
134
	# not necessary on linux #477804
135
	if [[ ${CHOST} != *-linux* && ${eid} == "next available" ]]; then
136
		for ((eid = 101; eid <= 999; eid++)); do
137
			[[ -z $(egetent passwd ${eid}) ]] && break
138
		done
139
	fi
140
	echo ${eid}
141
}
142
102
# @FUNCTION: enewuser
143
# @FUNCTION: enewuser
103
# @USAGE: <user> [uid] [shell] [homedir] [groups]
144
# @USAGE: <user> [uid] [shell] [homedir] [groups]
104
# @DESCRIPTION:
145
# @DESCRIPTION:
Lines 127-150 Link Here
127
168
128
	# handle uid
169
	# handle uid
129
	local euid=$1; shift
170
	local euid=$1; shift
130
	if [[ -n ${euid} && ${euid} != -1 ]] ; then
171
	euid=$(_get_next_id passwd ${euid})
131
		if [[ ${euid} -gt 0 ]] ; then
172
	if [[ ${euid} != "next available" ]] ; then
132
			if [[ -n $(egetent passwd ${euid}) ]] ; then
173
		opts+=( -u ${euid} )
133
				euid="next"
134
			fi
135
		else
136
			eerror "Userid given but is not greater than 0 !"
137
			die "${euid} is not a valid UID"
138
		fi
139
	else
140
		euid="next"
141
	fi
142
	if [[ ${euid} == "next" ]] ; then
143
		for ((euid = 101; euid <= 999; euid++)); do
144
			[[ -z $(egetent passwd ${euid}) ]] && break
145
		done
146
	fi
174
	fi
147
	opts+=( -u ${euid} )
148
	einfo " - Userid: ${euid}"
175
	einfo " - Userid: ${euid}"
149
176
150
	# handle shell
177
	# handle shell
Lines 284-301 Link Here
284
311
285
	# handle gid
312
	# handle gid
286
	local egid=$1; shift
313
	local egid=$1; shift
287
	if [[ ! -z ${egid} ]] ; then
314
	egid=$(_get_next_id group ${egid})
288
		if [[ ${egid} -gt 0 ]] ; then
289
			if [[ -n $(egetent group ${egid}) ]] ; then
290
				egid="next available; requested gid taken"
291
			fi
292
		else
293
			eerror "Groupid given but is not greater than 0 !"
294
			die "${egid} is not a valid GID"
295
		fi
296
	else
297
		egid="next available"
298
	fi
299
	einfo " - Groupid: ${egid}"
315
	einfo " - Groupid: ${egid}"
300
316
301
	# handle extra
317
	# handle extra
Lines 303-344 Link Here
303
		die "extra arguments no longer supported; please file a bug"
319
		die "extra arguments no longer supported; please file a bug"
304
	fi
320
	fi
305
321
306
	# Some targets need to find the next available GID manually
307
	_enewgroup_next_gid() {
308
		if [[ ${egid} == *[!0-9]* ]] ; then
309
			# Non numeric
310
			for ((egid = 101; egid <= 999; egid++)) ; do
311
				[[ -z $(egetent group ${egid}) ]] && break
312
			done
313
		fi
314
	}
315
316
	# add the group
322
	# add the group
317
	case ${CHOST} in
323
	case ${CHOST} in
318
	*-darwin*)
324
	*-darwin*)
319
		_enewgroup_next_gid
320
		dscl . create "/groups/${egroup}" gid ${egid}
325
		dscl . create "/groups/${egroup}" gid ${egid}
321
		dscl . create "/groups/${egroup}" passwd '*'
326
		dscl . create "/groups/${egroup}" passwd '*'
322
		;;
327
		;;
323
328
324
	*-freebsd*|*-dragonfly*)
329
	*-freebsd*|*-dragonfly*)
325
		_enewgroup_next_gid
326
		pw groupadd "${egroup}" -g ${egid} || die
330
		pw groupadd "${egroup}" -g ${egid} || die
327
		;;
331
		;;
328
332
329
	*-netbsd*)
333
	# OpenBSD doesn't support -r, so avoid using undefined flags
330
		_enewgroup_next_gid
334
	*-netbsd*|*-openbsd*)
331
		groupadd -g ${egid} "${egroup}" || die
335
		groupadd -g ${egid} "${egroup}" || die
332
		;;
336
		;;
333
337
334
	*)
338
	*)
335
		local opts
336
		if [[ ${egid} == *[!0-9]* ]] ; then
337
			# Non numeric; let groupadd figure out a GID for us
338
			opts=""
339
		else
340
			opts="-g ${egid}"
341
		fi
342
		# We specify -r so that we get a GID in the system range from login.defs
339
		# We specify -r so that we get a GID in the system range from login.defs
343
		groupadd -r ${opts} "${egroup}" || die
340
		groupadd -r ${opts} "${egroup}" || die
344
		;;
341
		;;

Return to bug 477804