Date: Wed, 8 Jun 2005 20:07:34 -0500 (CDT) From: Seán Farley <sean-freebsd@farley.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: bin/82058: [PATCH] Ability for pw groupmod to delete members Message-ID: <200506090107.j5917YJx020539@thor.farley.org> Resent-Message-ID: <200506090110.j591A81J074135@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 82058 >Category: bin >Synopsis: [PATCH] Ability for pw groupmod to delete members >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: update >Submitter-Id: current-users >Arrival-Date: Thu Jun 09 01:10:08 GMT 2005 >Closed-Date: >Last-Modified: >Originator: Seán Farley >Release: FreeBSD 5.4-STABLE i386 >Organization: >Environment: System: FreeBSD thor.farley.org 5.4-STABLE FreeBSD 5.4-STABLE #2: Fri Jun 3 08:54:24 CDT 2005 root@thor.farley.org:/usr/obj/usr/src/sys/THOR i386 >Description: pw has the ability to add to a group's members with the -m flag. I wrote a patch to give it the ability to delete specified group members using the -d flag. >How-To-Repeat: Example to add member1 and member2 to group1's member list: pw groupmod group1 -d member1,member2 >Fix: This patch can also be found here: http://www.farley.org/freebsd/tmp/pw.patch diff -u /usr/src/usr.sbin/pw/pw.8 ./pw.8 --- /usr/src/usr.sbin/pw/pw.8 Fri Jul 2 18:12:54 2004 +++ ./pw.8 Wed Jun 8 19:51:57 2005 @@ -152,6 +152,7 @@ .Op Fl l Ar name .Op Fl M Ar members .Op Fl m Ar newmembers +.Op Fl d Ar oldmembers .Op Fl h Ar fd | Fl H Ar fd .Op Fl N .Op Fl P @@ -754,6 +755,15 @@ .Fl M , this option allows the .Em addition +of existing users to a group without replacing the existing list of +members. +Login names or user ids may be used, and duplicate users are +silently eliminated. +.It Fl d Ar oldmembers +Similar to +.Fl M , +this option allows the +.Em deletion of existing users to a group without replacing the existing list of members. Login names or user ids may be used, and duplicate users are diff -u /usr/src/usr.sbin/pw/pw.c ./pw.c --- /usr/src/usr.sbin/pw/pw.c Sun Jan 11 12:28:08 2004 +++ ./pw.c Wed Jun 8 19:51:57 2005 @@ -117,7 +117,7 @@ { /* grp */ "V:C:qn:g:h:H:M:pNPY", "V:C:qn:g:Y", - "V:C:qn:g:l:h:H:FM:m:NPY", + "V:C:qn:d:g:l:h:H:FM:m:NPY", "V:C:qn:g:FPa", "V:C:q" } diff -u /usr/src/usr.sbin/pw/pw_group.c ./pw_group.c --- /usr/src/usr.sbin/pw/pw_group.c Sun Jan 11 12:28:08 2004 +++ ./pw_group.c Wed Jun 8 19:51:57 2005 @@ -207,37 +207,55 @@ } } - if (((arg = getarg(args, 'M')) != NULL || (arg = getarg(args, 'm')) != NULL) && arg->val) { + if (((arg = getarg(args, 'M')) != NULL || + (arg = getarg(args, 'd')) != NULL || + (arg = getarg(args, 'm')) != NULL) && arg->val) { int i = 0; char *p; struct passwd *pwd; /* Make sure this is not stay NULL with -M "" */ extendarray(&members, &grmembers, 200); - if (arg->ch == 'm') { + if (arg->ch == 'd' || arg->ch == 'm') { int k = 0; + int matchFound; while (grp->gr_mem[k] != NULL) { - if (extendarray(&members, &grmembers, i + 2) != -1) { - members[i++] = grp->gr_mem[k]; + /* Delete requested members. */ + for (matchFound = 0, + p = strtok(arg->val, ", \t"); p != NULL; + p = strtok(NULL, ", \t")) { + if ((pwd = GETPWNAM(p)) == NULL) + if (!isdigit((unsigned char)*p) || + (pwd = getpwuid((uid_t) atoi(p))) == NULL) + errx(EX_NOUSER, "user `%s' does not exist", p); + if (strcmp(grp->gr_mem[k], pwd->pw_name) == 0) { + matchFound = 1; + break; + } } + if (! matchFound) + if (extendarray(&members, &grmembers, i + 2) != -1) { + members[i++] = grp->gr_mem[k]; + } k++; } } - for (p = strtok(arg->val, ", \t"); p != NULL; p = strtok(NULL, ", \t")) { - int j; - if ((pwd = GETPWNAM(p)) == NULL) { - if (!isdigit((unsigned char)*p) || (pwd = getpwuid((uid_t) atoi(p))) == NULL) - errx(EX_NOUSER, "user `%s' does not exist", p); + if (arg->ch != 'd') + for (p = strtok(arg->val, ", \t"); p != NULL; p = strtok(NULL, ", \t")) { + int j; + if ((pwd = GETPWNAM(p)) == NULL) { + if (!isdigit((unsigned char)*p) || (pwd = getpwuid((uid_t) atoi(p))) == NULL) + errx(EX_NOUSER, "user `%s' does not exist", p); + } + /* + * Check for duplicates + */ + for (j = 0; j < i && strcmp(members[j], pwd->pw_name)!=0; j++) + ; + if (j == i && extendarray(&members, &grmembers, i + 2) != -1) + members[i++] = newstr(pwd->pw_name); } - /* - * Check for duplicates - */ - for (j = 0; j < i && strcmp(members[j], pwd->pw_name)!=0; j++) - ; - if (j == i && extendarray(&members, &grmembers, i + 2) != -1) - members[i++] = newstr(pwd->pw_name); - } while (i < grmembers) members[i++] = NULL; grp->gr_mem = members; >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200506090107.j5917YJx020539>