* 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.
This commit is contained in:
nekral-guest 2008-07-27 00:21:42 +00:00
parent 4c2ed7b52e
commit 44db9db053
2 changed files with 23 additions and 53 deletions

View File

@ -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.

View 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);