diff options
author | Andy Stormont <astormont@racktopsystems.com> | 2013-09-09 17:14:48 +0100 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2013-09-13 17:04:07 -0700 |
commit | a7fe1d5bb55904d4c79638b8778bc9dd8ed7fd7b (patch) | |
tree | 81fa5ca69f00db5d053c62e908b2c6edbf50d58e /usr/src/lib/libcmdutils/common/uid.c | |
parent | 41599e9fdccb44cc5f17828ab04b3147cefcc4e0 (diff) | |
download | illumos-joyent-a7fe1d5bb55904d4c79638b8778bc9dd8ed7fd7b.tar.gz |
4078 groupadd execs getent unnecessarily
4127 dmake setup could create /etc/skel
Reviewed by: Rich Lowe <richlowe@richlowe.net>
Reviewed by: Gary Mills <gary_mills@fastmail.fm>
Reviewed by: Milan Jurik <milan.jurik@xylab.cz>
Reviewed by: Gordon Ross <gwr@nexenta.com>
Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src/lib/libcmdutils/common/uid.c')
-rw-r--r-- | usr/src/lib/libcmdutils/common/uid.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/usr/src/lib/libcmdutils/common/uid.c b/usr/src/lib/libcmdutils/common/uid.c new file mode 100644 index 0000000000..a5ca6c45bd --- /dev/null +++ b/usr/src/lib/libcmdutils/common/uid.c @@ -0,0 +1,112 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright (c) 1997-2001 by Sun Microsystems, Inc. + * All rights reserved. + */ + +/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ +/* All Rights Reserved */ + +/* + * Copyright (c) 2013 RackTop Systems. + */ + +#include <errno.h> +#include <sys/types.h> +#include <stdio.h> +#include <userdefs.h> +#include <pwd.h> +#include <libcmdutils.h> + +static int findunuseduid(uid_t start, uid_t stop, uid_t *ret); +static boolean_t isreserveduid(uid_t uid); + +/* + * Find the highest unused uid. If the highest unused uid is "stop", + * then attempt to find a hole in the range. Returns 0 on success. + */ +int +findnextuid(uid_t start, uid_t stop, uid_t *ret) +{ + uid_t uid = start; + struct passwd *pwd; + boolean_t overflow = B_FALSE; + + setpwent(); + for (pwd = getpwent(); pwd != NULL; pwd = getpwent()) { + if (isreserveduid(pwd->pw_uid)) /* Skip reserved IDs */ + continue; + if (pwd->pw_uid >= uid) { + if (pwd->pw_uid == stop) { /* Overflow check */ + overflow = B_TRUE; + break; + } + uid = pwd->pw_uid + 1; + } + } + if (pwd == NULL && errno != 0) { + endpwent(); + return (-1); + } + endpwent(); + if (overflow == B_TRUE) /* Find a hole */ + return (findunuseduid(start, stop, ret)); + while (isreserveduid(uid) && uid < stop) /* Skip reserved IDs */ + uid++; + *ret = uid; + return (0); +} + +/* + * Check to see whether the uid is a reserved uid + * -- nobody, noaccess or nobody4 + */ +static boolean_t +isreserveduid(uid_t uid) +{ + return (uid == 60001 || uid == 60002 || uid == 65534); +} + +/* + * findunuseduid() attempts to return the next valid usable id between the + * supplied upper and lower limits. Returns 0 on success. + */ +static int +findunuseduid(uid_t start, uid_t stop, uid_t *ret) +{ + uid_t uid; + + for (uid = start; uid <= stop; uid++) { + if (isreserveduid(uid)) + continue; + if (getpwuid(uid) == NULL) { + if (errno != 0) + return (-1); + break; + } + } + if (uid > stop) + return (-1); + *ret = uid; + return (0); +} |