diff --git a/ChangeLog b/ChangeLog index 47c2ee48..4b58a47a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-08-27 Nicolas François + + * src/groupmems.c: Added functions add_user(), remove_user(), and + purge_members() to ease the support of gshadow. + 2008-08-27 Nicolas François * src/expiry.c: Use Basename for Prog. diff --git a/src/groupmems.c b/src/groupmems.c index 5f1dcb03..97014771 100644 --- a/src/groupmems.c +++ b/src/groupmems.c @@ -71,6 +71,11 @@ static char *Prog; static bool gr_locked = false; static char *whoami (void); +static void add_user (const char *user, + struct group *grp); +static void remove_user (const char *user, + struct group *grp); +static void purge_members (struct group *grp); static void display_members (char **members); static void usage (void); static void process_flags (int argc, char **argv); @@ -94,6 +99,69 @@ static char *whoami (void) } } +/* + * add_user - Add an user to the specified group + */ +static void add_user (const char *user, + struct group *grp) +{ + /* Make sure the user is not already part of the group */ + if (is_on_list (grp->gr_mem, user)) { + fprintf (stderr, + _("%s: user '%s' is already a member of '%s'\n"), + Prog, user, grp->gr_name); + fail_exit (EXIT_MEMBER_EXISTS); + } + + /* Add the user to the /etc/group group */ + grp->gr_mem = add_list (grp->gr_mem, user); + if (gr_update (grp) == 0) { + fprintf (stderr, + _("%s: failed to prepare the new %s entry '%s'\n"), + Prog, gr_dbname (), grp->gr_name); + fail_exit (13); + } +} + +/* + * remove_user - Remove an user from a given group + */ +static void remove_user (const char *user, + struct group *grp) +{ + /* Check if the user is a member of the specified group */ + if (!is_on_list (grp->gr_mem, user)) { + fprintf (stderr, + _("%s: user '%s' is not a member of '%s'\n"), + Prog, user, grp->gr_name); + fail_exit (EXIT_NOT_MEMBER); + } + + /* Remove the user from the /etc/group group */ + grp->gr_mem = del_list (grp->gr_mem, user); + if (gr_update (grp) == 0) { + fprintf (stderr, + _("%s: failed to prepare the new %s entry '%s'\n"), + Prog, gr_dbname (), grp->gr_name); + fail_exit (13); + } +} + +/* + * purge_members - Rmeove every members of the specified group + */ +static void purge_members (struct group *grp) +{ + /* Remove all the members of the /etc/group group */ + grp->gr_mem[0] = NULL; + if (gr_update (grp) == 0) { + fprintf (stderr, + _("%s: failed to prepare the new %s entry '%s'\n"), + Prog, gr_dbname (), grp->gr_name); + fail_exit (13); + } +} + static void display_members (char **members) { int i; @@ -277,41 +345,11 @@ int main (int argc, char **argv) if (list) { display_members (grp->gr_mem); } else if (NULL != adduser) { - 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); - fail_exit (EXIT_MEMBER_EXISTS); - } - grp->gr_mem = add_list (grp->gr_mem, adduser); - if (gr_update (grp) == 0) { - fprintf (stderr, - _("%s: failed to prepare the new %s entry '%s'\n"), - Prog, gr_dbname (), grp->gr_name); - fail_exit (13); - } + add_user (adduser, grp); } else if (NULL != deluser) { - if (!is_on_list (grp->gr_mem, deluser)) { - fprintf (stderr, - _("%s: user '%s' is not a member of '%s'\n"), - Prog, deluser, grp->gr_name); - fail_exit (EXIT_NOT_MEMBER); - } - grp->gr_mem = del_list (grp->gr_mem, deluser); - if (gr_update (grp) == 0) { - fprintf (stderr, - _("%s: failed to prepare the new %s entry '%s'\n"), - Prog, gr_dbname (), grp->gr_name); - fail_exit (13); - } + remove_user (deluser, grp); } else if (purge) { - grp->gr_mem[0] = NULL; - if (gr_update (grp) == 0) { - fprintf (stderr, - _("%s: failed to prepare the new %s entry '%s'\n"), - Prog, gr_dbname (), grp->gr_name); - fail_exit (13); - } + purge_members (grp); } if (gr_close () == 0) {