summaryrefslogtreecommitdiffstats
path: root/pw/pw_user.c
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2014-11-04 18:22:33 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2014-11-04 18:22:33 +0000
commitfb90d29ec2763027a93943b3f30250bd05afd62c (patch)
tree96a455d21208bb7513ef6e9f676483252d38afa3 /pw/pw_user.c
parenta67255c0571b3f564056b8dd161f54db9815c014 (diff)
parent8c4532e1189f5ef981aff455332acbfbb082cfa9 (diff)
downloadpw-darwin-fb90d29ec2763027a93943b3f30250bd05afd62c.tar.gz
pw-darwin-fb90d29ec2763027a93943b3f30250bd05afd62c.zip
Sync to HEAD@r274095.
Diffstat (limited to 'pw/pw_user.c')
-rw-r--r--pw/pw_user.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/pw/pw_user.c b/pw/pw_user.c
index efb2901..483148a 100644
--- a/pw/pw_user.c
+++ b/pw/pw_user.c
@@ -321,6 +321,9 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
(a_uid = a_name)->ch = 'u';
a_name = NULL;
}
+ } else {
+ if (strspn(a_uid->val, "0123456789") != strlen(a_uid->val))
+ errx(EX_USAGE, "-u expects a number");
}
/*
@@ -751,7 +754,25 @@ pw_user(struct userconf * cnf, int mode, struct cargs * args)
*/
if (mode == M_ADD || getarg(args, 'G') != NULL) {
- int i;
+ int i, j;
+ /* First remove the user from all group */
+ SETGRENT();
+ while ((grp = GETGRENT()) != NULL) {
+ char group[MAXLOGNAME];
+ if (grp->gr_mem == NULL)
+ continue;
+ for (i = 0; grp->gr_mem[i] != NULL; i++) {
+ if (strcmp(grp->gr_mem[i] , pwd->pw_name) != 0)
+ continue;
+ for (j = i; grp->gr_mem[j] != NULL ; j++)
+ grp->gr_mem[j] = grp->gr_mem[j+1];
+ strlcpy(group, grp->gr_name, MAXLOGNAME);
+ chggrent(group, grp);
+ }
+ }
+ ENDGRENT();
+
+ /* now add to group where needed */
for (i = 0; cnf->groups[i] != NULL; i++) {
grp = GETGRNAM(cnf->groups[i]);
grp = gr_add(grp, pwd->pw_name);