+2008-03-08 Nicolas François <nicolas.francois@centraliens.net>
+
+ * NEWS, src/groupdel.c: Make sure the group, and gshadow files are
+ unlocked on exit. Add function fail_exit(). Use fail_exit()
+ instead of exit().
+ * src/groupdel.c: Fail immediately instead of increasing errors.
+ Better handling of error cases, like locked group or gshadow file.
+
2008-03-08 Nicolas François <nicolas.francois@centraliens.net>
* NEWS, src/newusers.c: Make sure the passwd, group, shadow, and
/* local function prototypes */
static void usage (void);
+static void fail_exit (int);
static void grp_update (void);
static void close_files (void);
static void open_files (void);
exit (E_USAGE);
}
+/*
+ * fail_exit - exit with a failure code after unlocking the files
+ */
+static void fail_exit (int code)
+{
+ (void) gr_unlock ();
+#ifdef SHADOWGRP
+ if (is_shadow_grp) {
+ sgr_unlock ();
+ }
+#endif
+
+#ifdef WITH_AUDIT
+ audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "deleting group",
+ group_name, -1, 0);
+#endif
+
+ exit (code);
+}
+
/*
* grp_update - update group file entries
*
{
if (!gr_remove (group_name)) {
fprintf (stderr, _("%s: error removing group entry\n"), Prog);
- errors++;
+ fail_exit (E_GRP_UPDATE);
}
#ifdef SHADOWGRP
/*
fprintf (stderr,
_("%s: error removing shadow group entry\n"),
Prog);
- errors++;
+ fail_exit (E_GRP_UPDATE);
}
}
#endif /* SHADOWGRP */
if (!gr_close ()) {
fprintf (stderr, _("%s: cannot rewrite group file\n"), Prog);
- errors++;
+ fail_exit (E_GRP_UPDATE);
}
gr_unlock ();
#ifdef SHADOWGRP
if (is_shadow_grp && !sgr_close ()) {
fprintf (stderr,
_("%s: cannot rewrite shadow group file\n"), Prog);
- errors++;
+ fail_exit (E_GRP_UPDATE);
}
if (is_shadow_grp)
sgr_unlock ();
{
if (!gr_lock ()) {
fprintf (stderr, _("%s: unable to lock group file\n"), Prog);
- exit (E_GRP_UPDATE);
+ fail_exit (E_GRP_UPDATE);
}
if (!gr_open (O_RDWR)) {
fprintf (stderr, _("%s: unable to open group file\n"), Prog);
- exit (E_GRP_UPDATE);
+ fail_exit (E_GRP_UPDATE);
}
#ifdef SHADOWGRP
if (is_shadow_grp && !sgr_lock ()) {
fprintf (stderr,
_("%s: unable to lock shadow group file\n"), Prog);
- exit (E_GRP_UPDATE);
+ fail_exit (E_GRP_UPDATE);
}
if (is_shadow_grp && !sgr_open (O_RDWR)) {
fprintf (stderr,
_("%s: unable to open shadow group file\n"), Prog);
- exit (E_GRP_UPDATE);
+ fail_exit (E_GRP_UPDATE);
}
#endif /* SHADOWGRP */
}
* Can't remove the group.
*/
fprintf (stderr, _("%s: cannot remove user's primary group.\n"), Prog);
- exit (E_GROUP_BUSY);
+ fail_exit (E_GROUP_BUSY);
}
/*
open_files ();
grp_update ();
- if (errors == 0) {
- close_files ();
- nscd_flush_cache ("group");
- }
+
+ close_files ();
+
+ nscd_flush_cache ("group");
#ifdef USE_PAM
if (retval == PAM_SUCCESS)
pam_end (pamh, PAM_SUCCESS);
#endif /* USE_PAM */
- if (errors != 0)
-#ifdef WITH_AUDIT
- audit_logger (AUDIT_USER_CHAUTHTOK, Prog, "deleting group",
- group_name, -1, 0);
-#endif
- exit (errors == 0 ? E_SUCCESS : E_GRP_UPDATE);
- /* NOT REACHED */
- return 0;
+
+ return E_SUCCESS;
}
+