//usage: IF_LONG_OPTS("[--md5|--encrypted]") IF_NOT_LONG_OPTS("[-m|-e]")
//usage:#define chpasswd_full_usage "\n\n"
//usage: "Read user:password from stdin and update /etc/passwd\n"
-//usage: "\nOptions:"
//usage: IF_LONG_OPTS(
//usage: "\n -e,--encrypted Supplied passwords are in encrypted form"
//usage: "\n -m,--md5 Use MD5 encryption instead of DES"
//usage: "\n -m Use MD5 encryption instead of DES"
//usage: )
+//TODO: implement -c ALGO
+
#if ENABLE_LONG_OPTS
static const char chpasswd_longopts[] ALIGN1 =
"encrypted\0" No_argument "e"
int chpasswd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int chpasswd_main(int argc UNUSED_PARAM, char **argv)
{
- char *name, *pass;
- char salt[sizeof("$N$XXXXXXXX")];
- int opt, rc;
+ char *name;
+ int opt;
if (getuid() != 0)
bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
opt = getopt32(argv, "em");
while ((name = xmalloc_fgetline(stdin)) != NULL) {
+ char *free_me;
+ char *pass;
+ int rc;
+
pass = strchr(name, ':');
if (!pass)
bb_error_msg_and_die("missing new password");
xuname2uid(name); /* dies if there is no such user */
+ free_me = NULL;
if (!(opt & OPT_ENC)) {
+ char salt[sizeof("$N$XXXXXXXX")];
+
crypt_make_salt(salt, 1);
if (opt & OPT_MD5) {
salt[0] = '$';
salt[2] = '$';
crypt_make_salt(salt + 3, 4);
}
- pass = pw_encrypt(pass, salt, 0);
+ free_me = pass = pw_encrypt(pass, salt, 0);
}
/* This is rather complex: if user is not found in /etc/shadow,
bb_info_msg("Password for '%s' changed", name);
logmode = LOGMODE_STDIO;
free(name);
- if (!(opt & OPT_ENC))
- free(pass);
+ free(free_me);
}
return EXIT_SUCCESS;
}