* src/groupmems.c: Add fail_exit() to remove the group lock file
in case of failure. Replace the calls to exit() by fail_exit().
This commit is contained in:
parent
db98798134
commit
b2f5629de8
@ -1,3 +1,8 @@
|
|||||||
|
2008-07-27 Nicolas François <nicolas.francois@centraliens.net>
|
||||||
|
|
||||||
|
* src/groupmems.c: Add fail_exit() to remove the group lock file
|
||||||
|
in case of failure. Replace the calls to exit() by fail_exit().
|
||||||
|
|
||||||
2008-07-27 Nicolas François <nicolas.francois@centraliens.net>
|
2008-07-27 Nicolas François <nicolas.francois@centraliens.net>
|
||||||
|
|
||||||
* src/groupmems.c: Reduce the number of checks. Isolate the
|
* src/groupmems.c: Reduce the number of checks. Isolate the
|
||||||
|
@ -68,9 +68,11 @@ static bool purge = false;
|
|||||||
static bool list = false;
|
static bool list = false;
|
||||||
static int exclusive = 0;
|
static int exclusive = 0;
|
||||||
static char *Prog;
|
static char *Prog;
|
||||||
|
static bool group_locked = false;
|
||||||
|
|
||||||
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);
|
||||||
|
static void fail_exit (int code);
|
||||||
#define isroot() (getuid () == 0)
|
#define isroot() (getuid () == 0)
|
||||||
|
|
||||||
static char *whoami (void)
|
static char *whoami (void)
|
||||||
@ -105,7 +107,7 @@ static void members (char **members)
|
|||||||
static void usage (void)
|
static void usage (void)
|
||||||
{
|
{
|
||||||
fputs (_("Usage: groupmems -a username | -d username | -D | -l [-g groupname]\n"), stderr);
|
fputs (_("Usage: groupmems -a username | -d username | -D | -l [-g groupname]\n"), stderr);
|
||||||
exit (EXIT_USAGE);
|
fail_exit (EXIT_USAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -159,7 +161,7 @@ static void process_flags (int argc, char **argv)
|
|||||||
if (getpwnam (adduser) == NULL) {
|
if (getpwnam (adduser) == NULL) {
|
||||||
fprintf (stderr, _("%s: user `%s' does not exist\n"),
|
fprintf (stderr, _("%s: user `%s' does not exist\n"),
|
||||||
Prog, adduser);
|
Prog, adduser);
|
||||||
exit (EXIT_INVALID_USER);
|
fail_exit (EXIT_INVALID_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -203,7 +205,7 @@ static void check_perms (void)
|
|||||||
|
|
||||||
if (retval != PAM_SUCCESS) {
|
if (retval != PAM_SUCCESS) {
|
||||||
fprintf (stderr, _("%s: PAM authentication failed\n"), Prog);
|
fprintf (stderr, _("%s: PAM authentication failed\n"), Prog);
|
||||||
exit (1);
|
fail_exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retval == PAM_SUCCESS) {
|
if (retval == PAM_SUCCESS) {
|
||||||
@ -212,6 +214,18 @@ static void check_perms (void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void fail_exit (int code)
|
||||||
|
{
|
||||||
|
if (group_locked) {
|
||||||
|
if (gr_unlock () == 0) {
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: unable to unlock group file\n"),
|
||||||
|
Prog);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit (code);
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, char **argv)
|
int main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
@ -232,26 +246,27 @@ int main (int argc, char **argv)
|
|||||||
name = whoami ();
|
name = whoami ();
|
||||||
if (NULL == name) {
|
if (NULL == name) {
|
||||||
fprintf (stderr, _("%s: your groupname does not match your username\n"), Prog);
|
fprintf (stderr, _("%s: your groupname does not match your username\n"), Prog);
|
||||||
exit (EXIT_NOT_PRIMARY);
|
fail_exit (EXIT_NOT_PRIMARY);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
name = thisgroup;
|
name = thisgroup;
|
||||||
if (!isroot ()) {
|
if (!isroot ()) {
|
||||||
fprintf (stderr, _("%s: only root can use the -g/--group option\n"), Prog);
|
fprintf (stderr, _("%s: only root can use the -g/--group option\n"), Prog);
|
||||||
exit (EXIT_NOT_ROOT);
|
fail_exit (EXIT_NOT_ROOT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
check_perms ();
|
check_perms ();
|
||||||
|
|
||||||
if (!gr_lock ()) {
|
if (!gr_lock ()) {
|
||||||
fputs (_("Unable to lock group file\n"), stderr);
|
fprintf (stderr, _("%s: unable to lock group file\n"), Prog);
|
||||||
exit (EXIT_GROUP_FILE);
|
fail_exit (EXIT_GROUP_FILE);
|
||||||
}
|
}
|
||||||
|
group_locked = true;
|
||||||
|
|
||||||
if (!gr_open (O_RDWR)) {
|
if (!gr_open (O_RDWR)) {
|
||||||
fputs (_("Unable to open group file\n"), stderr);
|
fprintf (stderr, _("%s: unable to open group file\n"), Prog);
|
||||||
exit (EXIT_GROUP_FILE);
|
fail_exit (EXIT_GROUP_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
grp = (struct group *) gr_locate (name);
|
grp = (struct group *) gr_locate (name);
|
||||||
@ -259,7 +274,7 @@ int main (int argc, char **argv)
|
|||||||
if (grp == NULL) {
|
if (grp == NULL) {
|
||||||
fprintf (stderr, _("%s: `%s' not found in /etc/group\n"),
|
fprintf (stderr, _("%s: `%s' not found in /etc/group\n"),
|
||||||
Prog, name);
|
Prog, name);
|
||||||
exit (EXIT_INVALID_GROUP);
|
fail_exit (EXIT_INVALID_GROUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL != adduser) {
|
if (NULL != adduser) {
|
||||||
@ -267,7 +282,7 @@ int main (int argc, char **argv)
|
|||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: user `%s' is already a member of `%s'\n"),
|
_("%s: user `%s' is already a member of `%s'\n"),
|
||||||
Prog, adduser, grp->gr_name);
|
Prog, adduser, grp->gr_name);
|
||||||
exit (EXIT_MEMBER_EXISTS);
|
fail_exit (EXIT_MEMBER_EXISTS);
|
||||||
}
|
}
|
||||||
grp->gr_mem = add_list (grp->gr_mem, adduser);
|
grp->gr_mem = add_list (grp->gr_mem, adduser);
|
||||||
gr_update (grp);
|
gr_update (grp);
|
||||||
@ -276,7 +291,7 @@ int main (int argc, char **argv)
|
|||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: user `%s' is not a member of `%s'\n"),
|
_("%s: user `%s' is not a member of `%s'\n"),
|
||||||
Prog, deluser, grp->gr_name);
|
Prog, deluser, grp->gr_name);
|
||||||
exit (EXIT_NOT_MEMBER);
|
fail_exit (EXIT_NOT_MEMBER);
|
||||||
}
|
}
|
||||||
grp->gr_mem = del_list (grp->gr_mem, deluser);
|
grp->gr_mem = del_list (grp->gr_mem, deluser);
|
||||||
gr_update (grp);
|
gr_update (grp);
|
||||||
@ -289,10 +304,15 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
if (!gr_close ()) {
|
if (!gr_close ()) {
|
||||||
fputs (_("Cannot close group file\n"), stderr);
|
fputs (_("Cannot close group file\n"), stderr);
|
||||||
exit (EXIT_GROUP_FILE);
|
fail_exit (EXIT_GROUP_FILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gr_unlock ();
|
if (gr_unlock () == 0) {
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: unable to unlock group file\n"),
|
||||||
|
Prog);
|
||||||
|
}
|
||||||
|
|
||||||
exit (EXIT_SUCCESS);
|
exit (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user