Option to suppress group/gshadow inconsistencies
'gshadow' man page suggests that "You should use the same list of users as in /etc/group", but not must. Closes #261
This commit is contained in:
parent
6baeb25038
commit
e8c44a4c12
@ -34,7 +34,6 @@
|
|||||||
<!-- SHADOW-CONFIG-HERE -->
|
<!-- SHADOW-CONFIG-HERE -->
|
||||||
]>
|
]>
|
||||||
<refentry id='grpck.8'>
|
<refentry id='grpck.8'>
|
||||||
<!-- $Id$ -->
|
|
||||||
<refentryinfo>
|
<refentryinfo>
|
||||||
<author>
|
<author>
|
||||||
<firstname>Julianne Frances</firstname>
|
<firstname>Julianne Frances</firstname>
|
||||||
@ -192,6 +191,17 @@
|
|||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>-S</option>, <option>--silence-warnings</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Suppress more controversial warnings, in particular warnings about
|
||||||
|
inconsistency between group members listed in
|
||||||
|
<filename>/etc/group</filename> and
|
||||||
|
<filename>/etc/ghadow</filename>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
<para>
|
<para>
|
||||||
By default, <command>grpck</command> operates on
|
By default, <command>grpck</command> operates on
|
||||||
|
22
src/grpck.c
22
src/grpck.c
@ -33,8 +33,6 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#ident "$Id$"
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <grp.h>
|
#include <grp.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
@ -82,6 +80,7 @@ static bool gr_locked = false;
|
|||||||
/* Options */
|
/* Options */
|
||||||
static bool read_only = false;
|
static bool read_only = false;
|
||||||
static bool sort_mode = false;
|
static bool sort_mode = false;
|
||||||
|
static bool silence_warnings = false;
|
||||||
|
|
||||||
/* local function prototypes */
|
/* local function prototypes */
|
||||||
static void fail_exit (int status);
|
static void fail_exit (int status);
|
||||||
@ -158,6 +157,7 @@ static /*@noreturn@*/void usage (int status)
|
|||||||
" but do not change files\n"), usageout);
|
" but do not change files\n"), usageout);
|
||||||
(void) fputs (_(" -R, --root CHROOT_DIR directory to chroot into\n"), usageout);
|
(void) fputs (_(" -R, --root CHROOT_DIR directory to chroot into\n"), usageout);
|
||||||
(void) fputs (_(" -s, --sort sort entries by UID\n"), usageout);
|
(void) fputs (_(" -s, --sort sort entries by UID\n"), usageout);
|
||||||
|
(void) fputs (_(" -S, --silence-warnings silence controversial/paranoid warnings\nn"), usageout);
|
||||||
(void) fputs ("\n", usageout);
|
(void) fputs ("\n", usageout);
|
||||||
exit (status);
|
exit (status);
|
||||||
}
|
}
|
||||||
@ -193,18 +193,19 @@ static void process_flags (int argc, char **argv)
|
|||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
{"help", no_argument, NULL, 'h'},
|
{"help", no_argument, NULL, 'h'},
|
||||||
{"quiet", no_argument, NULL, 'q'},
|
{"quiet", no_argument, NULL, 'q'},
|
||||||
{"read-only", no_argument, NULL, 'r'},
|
{"read-only", no_argument, NULL, 'r'},
|
||||||
{"root", required_argument, NULL, 'R'},
|
{"root", required_argument, NULL, 'R'},
|
||||||
{"sort", no_argument, NULL, 's'},
|
{"silence-warnings", no_argument, NULL, 'S'},
|
||||||
|
{"sort", no_argument, NULL, 's'},
|
||||||
{NULL, 0, NULL, '\0'}
|
{NULL, 0, NULL, '\0'}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Parse the command line arguments
|
* Parse the command line arguments
|
||||||
*/
|
*/
|
||||||
while ((c = getopt_long (argc, argv, "hqrR:s",
|
while ((c = getopt_long (argc, argv, "hqrR:sS",
|
||||||
long_options, NULL)) != -1) {
|
long_options, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'h':
|
case 'h':
|
||||||
@ -221,6 +222,9 @@ static void process_flags (int argc, char **argv)
|
|||||||
case 's':
|
case 's':
|
||||||
sort_mode = true;
|
sort_mode = true;
|
||||||
break;
|
break;
|
||||||
|
case 'S':
|
||||||
|
silence_warnings = true;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage (E_USAGE);
|
usage (E_USAGE);
|
||||||
}
|
}
|
||||||
@ -456,7 +460,7 @@ static void compare_members_lists (const char *groupname,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (*other_pmem == NULL) {
|
if (!silence_warnings && *other_pmem == NULL) {
|
||||||
printf
|
printf
|
||||||
("'%s' is a member of the '%s' group in %s but not in %s\n",
|
("'%s' is a member of the '%s' group in %s but not in %s\n",
|
||||||
*pmem, groupname, file, other_file);
|
*pmem, groupname, file, other_file);
|
||||||
|
Loading…
Reference in New Issue
Block a user