diff options
| author | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2014-11-04 18:22:33 +0000 |
|---|---|---|
| committer | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2014-11-04 18:22:33 +0000 |
| commit | fb90d29ec2763027a93943b3f30250bd05afd62c (patch) | |
| tree | 96a455d21208bb7513ef6e9f676483252d38afa3 /pw/pw_user.c | |
| parent | a67255c0571b3f564056b8dd161f54db9815c014 (diff) | |
| parent | 8c4532e1189f5ef981aff455332acbfbb082cfa9 (diff) | |
| download | pw-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.c | 23 |
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); |
