]> git.cameronkatri.com Git - pw-darwin.git/commitdiff
Fix duplicate checking
authorBaptiste Daroussin <bapt@FreeBSD.org>
Sun, 7 Jun 2015 19:59:01 +0000 (19:59 +0000)
committerBaptiste Daroussin <bapt@FreeBSD.org>
Sun, 7 Jun 2015 19:59:01 +0000 (19:59 +0000)
pw/pw.c
pw/pw_group.c
pw/pw_user.c
pw/pwupd.h

diff --git a/pw/pw.c b/pw/pw.c
index ae030ec164840deb3e06c58ae80c47aec2479e02..a311572547feda6e14c985d34e25a468af7e0a18 100644 (file)
--- 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;
index f95d26336a4102ea9db3050dcee5e4badb671db2..b9cce0dcafbc6a81a3fafa5b63823d6df0c73e6a 100644 (file)
@@ -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;
index 99d81295d4121a3e8e2b8d5930dd300330f709be..c567e68c800da356e3f00eca4964d6647836042c 100644 (file)
@@ -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;
index ebf78dc43cccbb0a346fb150debd6d053cdcd8a5..a67e6db2bd7c9a5de1d6e2e144ecf4ce15019df3 100644 (file)
@@ -87,6 +87,7 @@ struct pwconf {
        bool             dryrun;
        bool             pretty;
        bool             v7;
+       bool             checkduplicate;
        struct userconf *userconf;
 };