* NEWS, src/usermod.c: Accept options in any order (username not
necessarily at the end)
This commit is contained in:
parent
91f972bb59
commit
229f243ca0
@ -1,3 +1,8 @@
|
|||||||
|
2010-08-29 Nicolas François <nicolas.francois@centraliens.net>
|
||||||
|
|
||||||
|
* NEWS, src/usermod.c: Accept options in any order (username not
|
||||||
|
necessarily at the end)
|
||||||
|
|
||||||
2010-08-29 Nicolas François <nicolas.francois@centraliens.net>
|
2010-08-29 Nicolas François <nicolas.francois@centraliens.net>
|
||||||
|
|
||||||
* autogen.sh: Expand autoreconf to avoid running autopoint.
|
* autogen.sh: Expand autoreconf to avoid running autopoint.
|
||||||
|
2
NEWS
2
NEWS
@ -36,6 +36,8 @@ shadow-4.1.4.2 -> shadow-4.1.5 UNRELEASED
|
|||||||
- useradd
|
- useradd
|
||||||
* If the skeleton directory contained hardlinked files, copies of the
|
* If the skeleton directory contained hardlinked files, copies of the
|
||||||
hardlink were removed from the skeleton directory.
|
hardlink were removed from the skeleton directory.
|
||||||
|
- usermod
|
||||||
|
* Accept options in any order (username not necessarily at the end)
|
||||||
|
|
||||||
*** translation
|
*** translation
|
||||||
* Updated Czech translation.
|
* Updated Czech translation.
|
||||||
|
151
src/usermod.c
151
src/usermod.c
@ -92,21 +92,21 @@
|
|||||||
const char *Prog;
|
const char *Prog;
|
||||||
|
|
||||||
static char *user_name;
|
static char *user_name;
|
||||||
static char *user_newname;
|
static char *user_newname = NULL;
|
||||||
static char *user_pass;
|
static char *user_pass;
|
||||||
static uid_t user_id;
|
static uid_t user_id;
|
||||||
static uid_t user_newid;
|
static uid_t user_newid;
|
||||||
static gid_t user_gid;
|
static gid_t user_gid;
|
||||||
static gid_t user_newgid;
|
static gid_t user_newgid;
|
||||||
static char *user_comment;
|
static char *user_comment;
|
||||||
static char *user_newcomment;
|
static char *user_newcomment = NULL;
|
||||||
static char *user_home;
|
static char *user_home;
|
||||||
static char *user_newhome;
|
static char *user_newhome = NULL;
|
||||||
static char *user_shell;
|
static char *user_shell;
|
||||||
#ifdef WITH_SELINUX
|
#ifdef WITH_SELINUX
|
||||||
static const char *user_selinux = "";
|
static const char *user_selinux = "";
|
||||||
#endif
|
#endif
|
||||||
static char *user_newshell;
|
static char *user_newshell = NULL;
|
||||||
static long user_expire;
|
static long user_expire;
|
||||||
static long user_newexpire;
|
static long user_newexpire;
|
||||||
static long user_inactive;
|
static long user_inactive;
|
||||||
@ -817,68 +817,6 @@ static void process_flags (int argc, char **argv)
|
|||||||
|
|
||||||
bool anyflag = false;
|
bool anyflag = false;
|
||||||
|
|
||||||
if ((1 == argc) || ('-' == argv[argc - 1][0])) {
|
|
||||||
usage (E_USAGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
const struct passwd *pwd;
|
|
||||||
/* local, no need for xgetpwnam */
|
|
||||||
pwd = getpwnam (argv[argc - 1]);
|
|
||||||
if (NULL == pwd) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("%s: user '%s' does not exist\n"),
|
|
||||||
Prog, argv[argc - 1]);
|
|
||||||
exit (E_NOTFOUND);
|
|
||||||
}
|
|
||||||
|
|
||||||
user_name = argv[argc - 1];
|
|
||||||
user_id = pwd->pw_uid;
|
|
||||||
user_gid = pwd->pw_gid;
|
|
||||||
user_comment = xstrdup (pwd->pw_gecos);
|
|
||||||
user_home = xstrdup (pwd->pw_dir);
|
|
||||||
user_shell = xstrdup (pwd->pw_shell);
|
|
||||||
}
|
|
||||||
user_newname = user_name;
|
|
||||||
user_newid = user_id;
|
|
||||||
user_newgid = user_gid;
|
|
||||||
user_newcomment = user_comment;
|
|
||||||
user_newhome = user_home;
|
|
||||||
user_newshell = user_shell;
|
|
||||||
|
|
||||||
#ifdef USE_NIS
|
|
||||||
/*
|
|
||||||
* Now make sure it isn't an NIS user.
|
|
||||||
*/
|
|
||||||
if (__ispwNIS ()) {
|
|
||||||
char *nis_domain;
|
|
||||||
char *nis_master;
|
|
||||||
|
|
||||||
fprintf (stderr,
|
|
||||||
_("%s: user %s is a NIS user\n"),
|
|
||||||
Prog, user_name);
|
|
||||||
|
|
||||||
if ( !yp_get_default_domain (&nis_domain)
|
|
||||||
&& !yp_master (nis_domain, "passwd.byname", &nis_master)) {
|
|
||||||
fprintf (stderr,
|
|
||||||
_("%s: %s is the NIS master\n"),
|
|
||||||
Prog, nis_master);
|
|
||||||
}
|
|
||||||
exit (E_NOTFOUND);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
{
|
|
||||||
const struct spwd *spwd = NULL;
|
|
||||||
/* local, no need for xgetspnam */
|
|
||||||
if (is_shadow_pwd && ((spwd = getspnam (user_name)) != NULL)) {
|
|
||||||
user_expire = spwd->sp_expire;
|
|
||||||
user_inactive = spwd->sp_inact;
|
|
||||||
user_newexpire = user_expire;
|
|
||||||
user_newinactive = user_inactive;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Parse the command line options.
|
* Parse the command line options.
|
||||||
@ -1048,6 +986,74 @@ static void process_flags (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (optind != argc - 1) {
|
||||||
|
usage (E_USAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
user_name = argv[argc - 1];
|
||||||
|
|
||||||
|
{
|
||||||
|
const struct passwd *pwd;
|
||||||
|
/* local, no need for xgetpwnam */
|
||||||
|
pwd = getpwnam (user_name);
|
||||||
|
if (NULL == pwd) {
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: user '%s' does not exist\n"),
|
||||||
|
Prog, user_name);
|
||||||
|
exit (E_NOTFOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
user_id = pwd->pw_uid;
|
||||||
|
user_gid = pwd->pw_gid;
|
||||||
|
user_comment = xstrdup (pwd->pw_gecos);
|
||||||
|
user_home = xstrdup (pwd->pw_dir);
|
||||||
|
user_shell = xstrdup (pwd->pw_shell);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* user_newname, user_newid, user_newgid can be used even when the
|
||||||
|
* options where not specified. */
|
||||||
|
if (!lflg) {
|
||||||
|
user_newname = user_name;
|
||||||
|
}
|
||||||
|
if (!uflg) {
|
||||||
|
user_newid = user_id;
|
||||||
|
}
|
||||||
|
if (!gflg) {
|
||||||
|
user_newgid = user_gid;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef USE_NIS
|
||||||
|
/*
|
||||||
|
* Now make sure it isn't an NIS user.
|
||||||
|
*/
|
||||||
|
if (__ispwNIS ()) {
|
||||||
|
char *nis_domain;
|
||||||
|
char *nis_master;
|
||||||
|
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: user %s is a NIS user\n"),
|
||||||
|
Prog, user_name);
|
||||||
|
|
||||||
|
if ( !yp_get_default_domain (&nis_domain)
|
||||||
|
&& !yp_master (nis_domain, "passwd.byname", &nis_master)) {
|
||||||
|
fprintf (stderr,
|
||||||
|
_("%s: %s is the NIS master\n"),
|
||||||
|
Prog, nis_master);
|
||||||
|
}
|
||||||
|
exit (E_NOTFOUND);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{
|
||||||
|
const struct spwd *spwd = NULL;
|
||||||
|
/* local, no need for xgetspnam */
|
||||||
|
if (is_shadow_pwd && ((spwd = getspnam (user_name)) != NULL)) {
|
||||||
|
user_expire = spwd->sp_expire;
|
||||||
|
user_inactive = spwd->sp_inact;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!anyflag) {
|
if (!anyflag) {
|
||||||
fprintf (stderr, _("%s: no flags given\n"), Prog);
|
fprintf (stderr, _("%s: no flags given\n"), Prog);
|
||||||
exit (E_USAGE);
|
exit (E_USAGE);
|
||||||
@ -1060,7 +1066,8 @@ static void process_flags (int argc, char **argv)
|
|||||||
if (user_newgid == user_gid) {
|
if (user_newgid == user_gid) {
|
||||||
gflg = false;
|
gflg = false;
|
||||||
}
|
}
|
||||||
if (strcmp (user_newshell, user_shell) == 0) {
|
if ( (NULL != user_newshell)
|
||||||
|
&& (strcmp (user_newshell, user_shell) == 0)) {
|
||||||
sflg = false;
|
sflg = false;
|
||||||
}
|
}
|
||||||
if (strcmp (user_newname, user_name) == 0) {
|
if (strcmp (user_newname, user_name) == 0) {
|
||||||
@ -1072,11 +1079,13 @@ static void process_flags (int argc, char **argv)
|
|||||||
if (user_newexpire == user_expire) {
|
if (user_newexpire == user_expire) {
|
||||||
eflg = false;
|
eflg = false;
|
||||||
}
|
}
|
||||||
if (strcmp (user_newhome, user_home) == 0) {
|
if ( (NULL != user_newhome)
|
||||||
|
&& (strcmp (user_newhome, user_home) == 0)) {
|
||||||
dflg = false;
|
dflg = false;
|
||||||
mflg = false;
|
mflg = false;
|
||||||
}
|
}
|
||||||
if (strcmp (user_newcomment, user_comment) == 0) {
|
if ( (NULL != user_newcomment)
|
||||||
|
&& (strcmp (user_newcomment, user_comment) == 0)) {
|
||||||
cflg = false;
|
cflg = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1097,10 +1106,6 @@ static void process_flags (int argc, char **argv)
|
|||||||
exit (E_USAGE);
|
exit (E_USAGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (optind != argc - 1) {
|
|
||||||
usage (E_USAGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aflg && (!Gflg)) {
|
if (aflg && (!Gflg)) {
|
||||||
fprintf (stderr,
|
fprintf (stderr,
|
||||||
_("%s: %s flag is only allowed with the %s flag\n"),
|
_("%s: %s flag is only allowed with the %s flag\n"),
|
||||||
|
Loading…
Reference in New Issue
Block a user