diff --git a/ChangeLog b/ChangeLog index 8a2d1d33..b0fcd392 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-07-27 Nicolas François + + * src/groupmems.c: Reuse the functions from libmisc/list.c to deal + with user lists. addtogroup() was broken when realloc() move the + memory area. + * src/groupmems.c: Report failures with the name of the program. + 2008-07-27 Nicolas François * src/groupmems.c: EXIT_READ_GROUP changed to EXIT_INVALID_GROUP. diff --git a/src/groupmems.c b/src/groupmems.c index af38c896..2056312f 100644 --- a/src/groupmems.c +++ b/src/groupmems.c @@ -42,6 +42,7 @@ #endif /* USE_PAM */ #include #include "defines.h" +#include "prototypes.h" #include "groupio.h" /* Exit Status Values */ @@ -92,56 +93,6 @@ static char *whoami (void) } } -static void addtogroup (char *user, char **members) -{ - int i; - - for (i = 0; NULL != members[i]; i++) { - if (0 == strcmp (user, members[i])) { - fputs (_("Member already exists\n"), stderr); - exit (EXIT_MEMBER_EXISTS); - } - } - - members = (char **) realloc (members, sizeof (char *) * (i+2)); - members[i] = user; - members[i + 1] = NULL; -} - -static void rmfromgroup (char *user, char **members) -{ - int i; - bool found = false; - - i = 0; - while (!found && NULL != members[i]) { - if (0 == strcmp (user, members[i])) { - found = true; - } else { - i++; - } - } - - while (found && NULL != members[i]) { - members[i] = members[i+1]; - i++; - } - - if (!found) { - fputs (_("Member to remove could not be found\n"), stderr); - exit (EXIT_NOT_MEMBER); - } -} - -static void nomembers (char **members) -{ - int i; - - for (i = 0; NULL != members[i]; i++) { - members[i] = NULL; - } -} - static void members (char **members) { int i; @@ -300,13 +251,25 @@ int main (int argc, char **argv) } if (NULL != adduser) { - addtogroup (adduser, grp->gr_mem); + if (is_on_list (grp->gr_mem, adduser)) { + fprintf (stderr, + _("%s: user `%s' is already a member of `%s'\n"), + Prog, adduser, grp->gr_name); + exit (EXIT_MEMBER_EXISTS); + } + grp->gr_mem = add_list (grp->gr_mem, adduser); gr_update (grp); } else if (NULL != deluser) { - rmfromgroup (deluser, grp->gr_mem); + if (!is_on_list (grp->gr_mem, adduser)) { + fprintf (stderr, + _("%s: user `%s' is not a member of `%s'\n"), + Prog, deluser, grp->gr_name); + exit (EXIT_NOT_MEMBER); + } + grp->gr_mem = del_list (grp->gr_mem, deluser); gr_update (grp); } else if (purge) { - nomembers (grp->gr_mem); + grp->gr_mem[0] = NULL; gr_update (grp); } else if (list) { members (grp->gr_mem);