mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-11 14:10:34 +00:00
Fix duplicate checking
This commit is contained in:
parent
c40bbdb4af
commit
91860967e2
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=284133
@ -269,6 +269,10 @@ main(int argc, char *argv[])
|
||||
if (errstr != NULL)
|
||||
errx(EX_USAGE, "Bad id '%s': %s", optarg,
|
||||
errstr);
|
||||
break;
|
||||
case 'o':
|
||||
conf.checkduplicate = true;
|
||||
break;
|
||||
default:
|
||||
addarg(&arglist, ch, optarg);
|
||||
break;
|
||||
|
@ -45,7 +45,7 @@ static struct passwd *lookup_pwent(const char *user);
|
||||
static void delete_members(char ***members, int *grmembers, int *i,
|
||||
struct carg *arg, struct group *grp);
|
||||
static int print_group(struct group * grp);
|
||||
static gid_t gr_gidpolicy(struct userconf * cnf, struct cargs * args);
|
||||
static gid_t gr_gidpolicy(struct userconf * cnf, long id);
|
||||
|
||||
int
|
||||
pw_group(int mode, char *name, long id, struct cargs * args)
|
||||
@ -73,7 +73,7 @@ pw_group(int mode, char *name, long id, struct cargs * args)
|
||||
* next gid to stdout
|
||||
*/
|
||||
if (mode == M_NEXT) {
|
||||
gid_t next = gr_gidpolicy(cnf, args);
|
||||
gid_t next = gr_gidpolicy(cnf, id);
|
||||
if (getarg(args, 'q'))
|
||||
return next;
|
||||
printf("%u\n", next);
|
||||
@ -145,7 +145,7 @@ pw_group(int mode, char *name, long id, struct cargs * args)
|
||||
grp = &fakegroup;
|
||||
grp->gr_name = pw_checkname(name, 0);
|
||||
grp->gr_passwd = "*";
|
||||
grp->gr_gid = gr_gidpolicy(cnf, args);
|
||||
grp->gr_gid = gr_gidpolicy(cnf, id);
|
||||
grp->gr_mem = members;
|
||||
}
|
||||
|
||||
@ -336,19 +336,18 @@ delete_members(char ***members, int *grmembers, int *i, struct carg *arg,
|
||||
|
||||
|
||||
static gid_t
|
||||
gr_gidpolicy(struct userconf * cnf, struct cargs * args)
|
||||
gr_gidpolicy(struct userconf * cnf, long id)
|
||||
{
|
||||
struct group *grp;
|
||||
gid_t gid = (gid_t) - 1;
|
||||
struct carg *a_gid = getarg(args, 'g');
|
||||
|
||||
/*
|
||||
* Check the given gid, if any
|
||||
*/
|
||||
if (a_gid != NULL) {
|
||||
gid = (gid_t) atol(a_gid->val);
|
||||
if (id > 0) {
|
||||
gid = (gid_t) id;
|
||||
|
||||
if ((grp = GETGRGID(gid)) != NULL && getarg(args, 'o') == NULL)
|
||||
if ((grp = GETGRGID(gid)) != NULL && conf.checkduplicate)
|
||||
errx(EX_DATAERR, "gid `%u' has already been allocated", grp->gr_gid);
|
||||
} else {
|
||||
struct bitmap bm;
|
||||
|
@ -54,7 +54,7 @@ static char locked_str[] = "*LOCKED*";
|
||||
static int delete_user(struct userconf *cnf, struct passwd *pwd,
|
||||
char *name, int delete, int mode);
|
||||
static int print_user(struct passwd * pwd);
|
||||
static uid_t pw_uidpolicy(struct userconf * cnf, struct cargs * args);
|
||||
static uid_t pw_uidpolicy(struct userconf * cnf, long id);
|
||||
static uid_t pw_gidpolicy(struct cargs * args, char *nam, gid_t prefer);
|
||||
static time_t pw_pwdpolicy(struct userconf * cnf, struct cargs * args);
|
||||
static time_t pw_exppolicy(struct userconf * cnf, struct cargs * args);
|
||||
@ -160,7 +160,7 @@ pw_user(int mode, char *name, long id, struct cargs * args)
|
||||
*/
|
||||
if (mode == M_NEXT)
|
||||
{
|
||||
uid_t next = pw_uidpolicy(cnf, args);
|
||||
uid_t next = pw_uidpolicy(cnf, id);
|
||||
if (getarg(args, 'q'))
|
||||
return next;
|
||||
printf("%u:", next);
|
||||
@ -389,8 +389,8 @@ pw_user(int mode, char *name, long id, struct cargs * args)
|
||||
edited = 1;
|
||||
}
|
||||
|
||||
if ((arg = getarg(args, 'u')) != NULL && isdigit((unsigned char)*arg->val)) {
|
||||
pwd->pw_uid = (uid_t) atol(arg->val);
|
||||
if (id > 0 && isdigit((unsigned char)*arg->val)) {
|
||||
pwd->pw_uid = (uid_t)id;
|
||||
edited = 1;
|
||||
if (pwd->pw_uid != 0 && strcmp(pwd->pw_name, "root") == 0)
|
||||
errx(EX_DATAERR, "can't change uid of `root' account");
|
||||
@ -502,7 +502,7 @@ pw_user(int mode, char *name, long id, struct cargs * args)
|
||||
pwd = &fakeuser;
|
||||
pwd->pw_name = name;
|
||||
pwd->pw_class = cnf->default_class ? cnf->default_class : "";
|
||||
pwd->pw_uid = pw_uidpolicy(cnf, args);
|
||||
pwd->pw_uid = pw_uidpolicy(cnf, id);
|
||||
pwd->pw_gid = pw_gidpolicy(args, pwd->pw_name, (gid_t) pwd->pw_uid);
|
||||
pwd->pw_change = pw_pwdpolicy(cnf, args);
|
||||
pwd->pw_expire = pw_exppolicy(cnf, args);
|
||||
@ -741,19 +741,18 @@ pw_user(int mode, char *name, long id, struct cargs * args)
|
||||
|
||||
|
||||
static uid_t
|
||||
pw_uidpolicy(struct userconf * cnf, struct cargs * args)
|
||||
pw_uidpolicy(struct userconf * cnf, long id)
|
||||
{
|
||||
struct passwd *pwd;
|
||||
uid_t uid = (uid_t) - 1;
|
||||
struct carg *a_uid = getarg(args, 'u');
|
||||
|
||||
/*
|
||||
* Check the given uid, if any
|
||||
*/
|
||||
if (a_uid != NULL) {
|
||||
uid = (uid_t) atol(a_uid->val);
|
||||
if (id > 0) {
|
||||
uid = (uid_t) id;
|
||||
|
||||
if ((pwd = GETPWUID(uid)) != NULL && getarg(args, 'o') == NULL)
|
||||
if ((pwd = GETPWUID(uid)) != NULL && conf.checkduplicate)
|
||||
errx(EX_DATAERR, "uid `%u' has already been allocated", pwd->pw_uid);
|
||||
} else {
|
||||
struct bitmap bm;
|
||||
|
@ -87,6 +87,7 @@ struct pwconf {
|
||||
bool dryrun;
|
||||
bool pretty;
|
||||
bool v7;
|
||||
bool checkduplicate;
|
||||
struct userconf *userconf;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user