]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - pw/pw_group.c
Merge sync of head
[pw-darwin.git] / pw / pw_group.c
index f4f21165c370335f8c34635e94723c109a2da5ab..b20ce88fb3014c6f9cbaddfe6e650569ecbb8cb4 100644 (file)
@@ -51,6 +51,7 @@ int
 pw_group(struct userconf * cnf, int mode, struct cargs * args)
 {
        int             rc;
+       struct carg    *a_newname = getarg(args, 'l');
        struct carg    *a_name = getarg(args, 'n');
        struct carg    *a_gid = getarg(args, 'g');
        struct carg    *arg;
@@ -66,6 +67,11 @@ pw_group(struct userconf * cnf, int mode, struct cargs * args)
                NULL
        };
 
+       if (a_gid != NULL) {
+               if (strspn(a_gid->val, "0123456789") != strlen(a_gid->val))
+                       errx(EX_USAGE, "-g expects a number");
+       }
+
        if (mode == M_LOCK || mode == M_UNLOCK)
                errx(EX_USAGE, "'lock' command is not available for groups");
 
@@ -140,8 +146,8 @@ pw_group(struct userconf * cnf, int mode, struct cargs * args)
                if (a_gid)
                        grp->gr_gid = (gid_t) atoi(a_gid->val);
 
-               if ((arg = getarg(args, 'l')) != NULL)
-                       grp->gr_name = pw_checkname((u_char *)arg->val, 0);
+               if (a_newname != NULL)
+                       grp->gr_name = pw_checkname((u_char *)a_newname->val, 0);
        } else {
                if (a_name == NULL)     /* Required */
                        errx(EX_DATAERR, "group name required");
@@ -227,10 +233,12 @@ pw_group(struct userconf * cnf, int mode, struct cargs * args)
                else if (arg->ch == 'm') {
                        int     k = 0;
 
-                       while (grp->gr_mem[k] != NULL) {
-                               if (extendarray(&members, &grmembers, i + 2) != -1)
-                                       members[i++] = grp->gr_mem[k];
-                               k++;
+                       if (grp->gr_mem != NULL) {
+                               while (grp->gr_mem[k] != NULL) {
+                                       if (extendarray(&members, &grmembers, i + 2) != -1)
+                                               members[i++] = grp->gr_mem[k];
+                                       k++;
+                               }
                        }
                }
 
@@ -268,14 +276,15 @@ pw_group(struct userconf * cnf, int mode, struct cargs * args)
                        warn("group update");
                return EX_IOERR;
        }
+
+       arg = a_newname != NULL ? a_newname : a_name;
        /* grp may have been invalidated */
-       if ((grp = GETGRNAM(a_name->val)) == NULL)
+       if ((grp = GETGRNAM(arg->val)) == NULL)
                errx(EX_SOFTWARE, "group disappeared during update");
 
        pw_log(cnf, mode, W_GROUP, "%s(%ld)", grp->gr_name, (long) grp->gr_gid);
 
-       if (members)
-               free(members);
+       free(members);
 
        return EXIT_SUCCESS;
 }
@@ -312,6 +321,9 @@ delete_members(char ***members, int *grmembers, int *i, struct carg *arg,
        int k;
        struct passwd *pwd;
 
+       if (grp->gr_mem == NULL)
+               return;
+
        k = 0;
        while (grp->gr_mem[k] != NULL) {
                matchFound = false;
@@ -408,7 +420,7 @@ print_group(struct group * grp, int pretty)
                char           *buf = NULL;
 
                buf = gr_make(grp);
-               fputs(buf, stdout);
+               printf("%s\n", buf);
                free(buf);
        } else {
                int             i;
@@ -416,8 +428,10 @@ print_group(struct group * grp, int pretty)
                printf("Group Name: %-15s   #%lu\n"
                       "   Members: ",
                       grp->gr_name, (long) grp->gr_gid);
-               for (i = 0; grp->gr_mem[i]; i++)
-                       printf("%s%s", i ? "," : "", grp->gr_mem[i]);
+               if (grp->gr_mem != NULL) {
+                       for (i = 0; grp->gr_mem[i]; i++)
+                               printf("%s%s", i ? "," : "", grp->gr_mem[i]);
+               }
                fputs("\n\n", stdout);
        }
        return EXIT_SUCCESS;