From acdde8a5fd9f78f37032cd8801a0731e96c5a119 Mon Sep 17 00:00:00 2001 From: Baptiste Daroussin Date: Sun, 7 Jun 2015 19:59:01 +0000 Subject: Fix duplicate checking --- pw/pw.c | 4 ++++ pw/pw_group.c | 15 +++++++-------- pw/pw_user.c | 19 +++++++++---------- pw/pwupd.h | 1 + 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/pw/pw.c b/pw/pw.c index ae030ec..a311572 100644 --- a/pw/pw.c +++ b/pw/pw.c @@ -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; diff --git a/pw/pw_group.c b/pw/pw_group.c index f95d263..b9cce0d 100644 --- a/pw/pw_group.c +++ b/pw/pw_group.c @@ -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; diff --git a/pw/pw_user.c b/pw/pw_user.c index 99d8129..c567e68 100644 --- a/pw/pw_user.c +++ b/pw/pw_user.c @@ -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; diff --git a/pw/pwupd.h b/pw/pwupd.h index ebf78dc..a67e6db 100644 --- a/pw/pwupd.h +++ b/pw/pwupd.h @@ -87,6 +87,7 @@ struct pwconf { bool dryrun; bool pretty; bool v7; + bool checkduplicate; struct userconf *userconf; }; -- cgit v1.2.3-56-ge451