]> granicus.if.org Git - shadow/commitdiff
* src/groupmems.c: Reuse the functions from libmisc/list.c to deal
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 27 Jul 2008 00:21:42 +0000 (00:21 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Sun, 27 Jul 2008 00:21:42 +0000 (00:21 +0000)
with user lists. addtogroup() was broken when realloc() move the
memory area.
* src/groupmems.c: Report failures with the name of the program.

ChangeLog
src/groupmems.c

index 8a2d1d33d87c445a648e458438f80d26c7b125b2..b0fcd392c01e82f6f0ffa28626caf7f06d988c3f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-07-27  Nicolas François  <nicolas.francois@centraliens.net>
+
+       * 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  <nicolas.francois@centraliens.net>
 
        * src/groupmems.c: EXIT_READ_GROUP changed to EXIT_INVALID_GROUP.
index af38c896b05e59ffed6b8e300b26fb853142bb8c..2056312ff6e17512319455968eeea3de74d41c55 100644 (file)
@@ -42,6 +42,7 @@
 #endif                         /* USE_PAM */
 #include <pwd.h>
 #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);