* src/groupmems.c: The grp structure returned by gr_locate is a
const. Duplicate this structure before working on it. * src/groupmems.c: Do not fail and do not display warnings if a close failure happens with the --list option. (Files are opened read-only).
This commit is contained in:
parent
281721cd15
commit
81e1dbc90e
@ -1,3 +1,11 @@
|
|||||||
|
2008-08-29 Nicolas François <nicolas.francois@centraliens.net>
|
||||||
|
|
||||||
|
* src/groupmems.c: The grp structure returned by gr_locate is a
|
||||||
|
const. Duplicate this structure before working on it.
|
||||||
|
* src/groupmems.c: Do not fail and do not display warnings if a
|
||||||
|
close failure happens with the --list option. (Files are opened
|
||||||
|
read-only).
|
||||||
|
|
||||||
2008-08-29 Nicolas François <nicolas.francois@centraliens.net>
|
2008-08-29 Nicolas François <nicolas.francois@centraliens.net>
|
||||||
|
|
||||||
* src/gpasswd.c: Replace the 'valid' variable by is_valid to avoid
|
* src/gpasswd.c: Replace the 'valid' variable by is_valid to avoid
|
||||||
|
105
src/groupmems.c
105
src/groupmems.c
@ -70,13 +70,14 @@ static int exclusive = 0;
|
|||||||
static char *Prog;
|
static char *Prog;
|
||||||
static bool gr_locked = false;
|
static bool gr_locked = false;
|
||||||
|
|
||||||
|
/* local function prototypes */
|
||||||
static char *whoami (void);
|
static char *whoami (void);
|
||||||
static void add_user (const char *user,
|
static void add_user (const char *user,
|
||||||
struct group *grp);
|
const struct group *grp);
|
||||||
static void remove_user (const char *user,
|
static void remove_user (const char *user,
|
||||||
struct group *grp);
|
const struct group *grp);
|
||||||
static void purge_members (struct group *grp);
|
static void purge_members (const struct group *grp);
|
||||||
static void display_members (char **members);
|
static void display_members (const char *const *members);
|
||||||
static void usage (void);
|
static void usage (void);
|
||||||
static void process_flags (int argc, char **argv);
|
static void process_flags (int argc, char **argv);
|
||||||
static void check_perms (void);
|
static void check_perms (void);
|
||||||
@ -103,8 +104,10 @@ static char *whoami (void)
|
|||||||
* add_user - Add an user to the specified group
|
* add_user - Add an user to the specified group
|
||||||
*/
|
*/
|
||||||
static void add_user (const char *user,
|
static void add_user (const char *user,
|
||||||
struct group *grp)
|
const struct group *grp)
|
||||||
{
|
{
|
||||||
|
struct group *newgrp;
|
||||||
|
|
||||||
/* Make sure the user is not already part of the group */
|
/* Make sure the user is not already part of the group */
|
||||||
if (is_on_list (grp->gr_mem, user)) {
|
if (is_on_list (grp->gr_mem, user)) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
@ -113,12 +116,20 @@ static void add_user (const char *user,
|
|||||||
fail_exit (EXIT_MEMBER_EXISTS);
|
fail_exit (EXIT_MEMBER_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newgrp = __gr_dup(grp);
|
||||||
|
if (NULL == newgrp) {
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: Out of memory. Cannot update %s.\n"),
|
||||||
|
Prog, gr_dbname ());
|
||||||
|
exit (13);
|
||||||
|
}
|
||||||
|
|
||||||
/* Add the user to the /etc/group group */
|
/* Add the user to the /etc/group group */
|
||||||
grp->gr_mem = add_list (grp->gr_mem, user);
|
newgrp->gr_mem = add_list (newgrp->gr_mem, user);
|
||||||
if (gr_update (grp) == 0) {
|
if (gr_update (newgrp) == 0) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: failed to prepare the new %s entry '%s'\n"),
|
_("%s: failed to prepare the new %s entry '%s'\n"),
|
||||||
Prog, gr_dbname (), grp->gr_name);
|
Prog, gr_dbname (), newgrp->gr_name);
|
||||||
fail_exit (13);
|
fail_exit (13);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -127,8 +138,10 @@ static void add_user (const char *user,
|
|||||||
* remove_user - Remove an user from a given group
|
* remove_user - Remove an user from a given group
|
||||||
*/
|
*/
|
||||||
static void remove_user (const char *user,
|
static void remove_user (const char *user,
|
||||||
struct group *grp)
|
const struct group *grp)
|
||||||
{
|
{
|
||||||
|
struct group *newgrp;
|
||||||
|
|
||||||
/* Check if the user is a member of the specified group */
|
/* Check if the user is a member of the specified group */
|
||||||
if (!is_on_list (grp->gr_mem, user)) {
|
if (!is_on_list (grp->gr_mem, user)) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
@ -137,12 +150,20 @@ static void remove_user (const char *user,
|
|||||||
fail_exit (EXIT_NOT_MEMBER);
|
fail_exit (EXIT_NOT_MEMBER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
newgrp = __gr_dup (grp);
|
||||||
|
if (NULL == newgrp) {
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: Out of memory. Cannot update %s.\n"),
|
||||||
|
Prog, gr_dbname ());
|
||||||
|
exit (13);
|
||||||
|
}
|
||||||
|
|
||||||
/* Remove the user from the /etc/group group */
|
/* Remove the user from the /etc/group group */
|
||||||
grp->gr_mem = del_list (grp->gr_mem, user);
|
newgrp->gr_mem = del_list (newgrp->gr_mem, user);
|
||||||
if (gr_update (grp) == 0) {
|
if (gr_update (newgrp) == 0) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: failed to prepare the new %s entry '%s'\n"),
|
_("%s: failed to prepare the new %s entry '%s'\n"),
|
||||||
Prog, gr_dbname (), grp->gr_name);
|
Prog, gr_dbname (), newgrp->gr_name);
|
||||||
fail_exit (13);
|
fail_exit (13);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -150,19 +171,28 @@ static void remove_user (const char *user,
|
|||||||
/*
|
/*
|
||||||
* purge_members - Rmeove every members of the specified group
|
* purge_members - Rmeove every members of the specified group
|
||||||
*/
|
*/
|
||||||
static void purge_members (struct group *grp)
|
static void purge_members (const struct group *grp)
|
||||||
{
|
{
|
||||||
|
struct group *newgrp = __gr_dup (grp);
|
||||||
|
|
||||||
|
if (NULL == newgrp) {
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: Out of memory. Cannot update %s.\n"),
|
||||||
|
Prog, gr_dbname ());
|
||||||
|
exit (13);
|
||||||
|
}
|
||||||
|
|
||||||
/* Remove all the members of the /etc/group group */
|
/* Remove all the members of the /etc/group group */
|
||||||
grp->gr_mem[0] = NULL;
|
newgrp->gr_mem[0] = NULL;
|
||||||
if (gr_update (grp) == 0) {
|
if (gr_update (newgrp) == 0) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: failed to prepare the new %s entry '%s'\n"),
|
_("%s: failed to prepare the new %s entry '%s'\n"),
|
||||||
Prog, gr_dbname (), grp->gr_name);
|
Prog, gr_dbname (), newgrp->gr_name);
|
||||||
fail_exit (13);
|
fail_exit (13);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void display_members (char **members)
|
static void display_members (const char *const *members)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -285,10 +315,45 @@ static void fail_exit (int code)
|
|||||||
exit (code);
|
exit (code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void open_files (void)
|
||||||
|
{
|
||||||
|
if (!list) {
|
||||||
|
if (gr_lock () == 0) {
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: cannot lock %s; try again later.\n"),
|
||||||
|
Prog, gr_dbname ());
|
||||||
|
fail_exit (EXIT_GROUP_FILE);
|
||||||
|
}
|
||||||
|
gr_locked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gr_open (list ? O_RDONLY : O_RDWR) == 0) {
|
||||||
|
fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
|
||||||
|
fail_exit (EXIT_GROUP_FILE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void close_files (void)
|
||||||
|
{
|
||||||
|
if ((gr_close () == 0) && !list) {
|
||||||
|
fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, gr_dbname ());
|
||||||
|
SYSLOG ((LOG_ERR, "failure while writing changes to %s", gr_dbname ()));
|
||||||
|
fail_exit (EXIT_GROUP_FILE);
|
||||||
|
}
|
||||||
|
if (gr_locked) {
|
||||||
|
if (gr_unlock () == 0) {
|
||||||
|
fprintf (stderr, _("%s: failed to unlock %s\n"), Prog, gr_dbname ());
|
||||||
|
SYSLOG ((LOG_ERR, "failed to unlock %s", gr_dbname ()));
|
||||||
|
/* continue */
|
||||||
|
}
|
||||||
|
gr_locked = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
struct group *grp;
|
const struct group *grp;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get my name so that I can use it to report errors.
|
* Get my name so that I can use it to report errors.
|
||||||
@ -334,7 +399,7 @@ int main (int argc, char **argv)
|
|||||||
fail_exit (EXIT_GROUP_FILE);
|
fail_exit (EXIT_GROUP_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
grp = (struct group *) gr_locate (name);
|
grp = gr_locate (name);
|
||||||
|
|
||||||
if (NULL == grp) {
|
if (NULL == grp) {
|
||||||
fprintf (stderr, _("%s: group '%s' does not exist in %s\n"),
|
fprintf (stderr, _("%s: group '%s' does not exist in %s\n"),
|
||||||
@ -343,7 +408,7 @@ int main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (list) {
|
if (list) {
|
||||||
display_members (grp->gr_mem);
|
display_members ((const char *const *)grp->gr_mem);
|
||||||
} else if (NULL != adduser) {
|
} else if (NULL != adduser) {
|
||||||
add_user (adduser, grp);
|
add_user (adduser, grp);
|
||||||
} else if (NULL != deluser) {
|
} else if (NULL != deluser) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user