<!ENTITY PASS_MAX_DAYS SYSTEM "login.defs.d/PASS_MAX_DAYS.xml">
<!ENTITY PASS_MIN_DAYS SYSTEM "login.defs.d/PASS_MIN_DAYS.xml">
<!ENTITY PASS_WARN_AGE SYSTEM "login.defs.d/PASS_WARN_AGE.xml">
+<!ENTITY SYS_GID_MAX SYSTEM "login.defs.d/SYS_GID_MAX.xml">
+<!ENTITY SYS_UID_MAX SYSTEM "login.defs.d/SYS_UID_MAX.xml">
<!ENTITY UID_MAX SYSTEM "login.defs.d/UID_MAX.xml">
<!ENTITY UMASK SYSTEM "login.defs.d/UMASK.xml">
+<!ENTITY USERGROUPS_ENAB SYSTEM "login.defs.d/USERGROUPS_ENAB.xml">
]>
<refentry id='useradd.8'>
<!-- $Id$ -->
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>
+ <option>-N</option>, <option>--no-user-group</option>
+ </term>
+ <listitem>
+ <para>
+ Do not create a group with the same name as the user, but
+ add the user to the group specified by the <option>-g</option>
+ option or by the GROUP variable in
+ <filename>/etc/default/useradd</filename>.
+ </para>
+ <para>
+ The default behavior (if the <option>-g</option>,
+ <option>-N</option>, and <option>-U</option> options are not
+ specified) is defined by the <option>USERGROUPS_ENAB</option>
+ variable in <filename>login.defs</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
<varlistentry>
<term>
<option>-o</option>, <option>--non-unique</option>
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>
+ <option>-U</option>, <option>--user-group</option>
+ </term>
+ <listitem>
+ <para>
+ Create a group with the same name as the user, and
+ add the user to this group.
+ </para>
+ <para>
+ The default behavior (if the <option>-g</option>,
+ <option>-N</option>, and <option>-U</option> options are not
+ specified) is defined by the <option>USERGROUPS_ENAB</option>
+ variable in <filename>login.defs</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<refsect2 id='changing_the_default_values'>
&PASS_MAX_DAYS;
&PASS_MIN_DAYS;
&PASS_WARN_AGE;
+ &SYS_GID_MAX; <!-- documents also SYS_GID_MIN -->
+ &SYS_UID_MAX; <!-- documents also SYS_UID_MIN -->
&UID_MAX; <!-- documents also UID_MIN -->
&UMASK;
+ &USERGROUPS_ENAB;
</variablelist>
</refsect1>
kflg = 0, /* specify a directory to fill new user directory */
lflg = 0, /* do not add user to lastlog database file */
mflg = 0, /* create user's home directory if it doesn't exist */
- nflg = 0, /* create a group having the same name as the user */
+ Nflg = 0, /* do not create a group having the same name as the user, but add the user to def_group (or the group specified with -g) */
oflg = 0, /* permit non-unique user ID to be specified with -u */
rflg = 0, /* create a system account */
sflg = 0, /* shell program for new account */
- uflg = 0; /* specify user ID for new account */
+ uflg = 0, /* specify user ID for new account */
+ Uflg = 0; /* create a group having the same name as the user */
static int home_added;
" faillog databases\n"
" -m, --create-home create home directory for the new user\n"
" account\n"
+ " -N, --no-user-group do not create a group with the same name as\n"
+ " the user\n"
" -o, --non-unique allow create user with duplicate\n"
" (non-unique) UID\n"
" -p, --password PASSWORD use encrypted password for the new user\n"
" -r, --system create a system account\n"
" -s, --shell SHELL the login shell for the new user account\n"
" -u, --uid UID force use the UID for the new user account\n"
+ " -U, --user-group create a group with the same name as the user\n"
"\n"), stderr);
exit (E_USAGE);
}
{"skel", required_argument, NULL, 'k'},
{"key", required_argument, NULL, 'K'},
{"create-home", no_argument, NULL, 'm'},
+ {"no-user-group", no_argument, NULL, 'N'},
{"non-unique", no_argument, NULL, 'o'},
{"password", required_argument, NULL, 'p'},
{"system", no_argument, NULL, 'r'},
{"shell", required_argument, NULL, 's'},
{"uid", required_argument, NULL, 'u'},
+ {"user-group", no_argument, NULL, 'U'},
{NULL, 0, NULL, '\0'}
};
while ((c =
- getopt_long (argc, argv, "b:c:d:De:f:g:G:k:K:lmMop:rs:u:",
+ getopt_long (argc, argv, "b:c:d:De:f:g:G:k:K:lmMNop:rs:u:U",
long_options, NULL)) != -1) {
switch (c) {
case 'b':
case 'm':
mflg++;
break;
+ case 'N':
+ Nflg++;
+ break;
case 'o':
oflg++;
break;
user_id = get_uid (optarg);
uflg++;
break;
+ case 'U':
+ Uflg++;
+ break;
default:
usage ();
}
}
}
+ if (!gflg && !Nflg && ! Uflg) {
+ /* Get the settings from login.defs */
+ Uflg = getdef_bool ("USERGROUPS_ENAB");
+ }
+
/*
* Certain options are only valid in combination with others.
* Check it here so that they can be specified in any order.
*/
- if ((oflg && !uflg) || (kflg && !mflg))
+ if (oflg && !uflg) {
+ fprintf (stderr,
+ _("%s: %s flag is ONLY allowed with the %s flag\n"),
+ Prog, "-o", "-u");
+ usage ();
+ }
+ if (kflg && !mflg) {
+ fprintf (stderr,
+ _("%s: %s flag is ONLY allowed with the %s flag\n"),
+ Prog, "-k", "-m");
usage ();
+ }
+ if (Uflg && gflg) {
+ fprintf (stderr,
+ _("%s: options %s and %s conflict\n"),
+ Prog, "-U", "-g");
+ usage ();
+ }
+ if (Uflg && Nflg) {
+ fprintf (stderr,
+ _("%s: options %s and %s conflict\n"),
+ Prog, "-U", "-N");
+ usage ();
+ }
/*
* Either -D or username is required. Defaults can be set with -D
* to that group, use useradd -g username username.
* --bero
*/
- if (!gflg) {
+ if (Uflg) {
if (getgrnam (user_name)) { /* local, no need for xgetgrnam */
fprintf (stderr,
_
/* do we have to add a group for that user? This is why we need to
* open the group files in the open_files() function --gafton */
- if (!(nflg || gflg)) {
+ if (Uflg) {
if (find_new_gid (rflg, &user_gid, &user_id) < 0) {
fprintf (stderr,
_("%s: can't create group\n"),