diff --git a/loginutils/cryptpw.c b/loginutils/cryptpw.c index d4bcad3e0..54babdc80 100644 --- a/loginutils/cryptpw.c +++ b/loginutils/cryptpw.c @@ -3,7 +3,6 @@ * cryptpw.c * * Cooked from passwd.c by Thomas Lundquist - * */ #include "busybox.h" @@ -11,27 +10,19 @@ int cryptpw_main(int argc, char **argv); int cryptpw_main(int argc, char **argv) { - char *clear; - char salt[sizeof("$N$XXXXXXXX")]; /* "$N$XXXXXXXX" or "XX" */ - const char *opt_a = "md5"; + char salt[sizeof("$N$XXXXXXXX")]; - getopt32(argc, argv, "a:", &opt_a); - /* move past the commandline options */ - /*argc -= optind; - unused */ - argv += optind; - - crypt_make_salt(salt, 1); /* des */ - if (strcasecmp(opt_a, "md5") == 0) { + if (!getopt32(argc, argv, "a:", NULL) || argv[optind - 1][0] != 'd') { strcpy(salt, "$1$"); - crypt_make_salt(salt + 3, 4); - } else if (strcasecmp(opt_a, "des") != 0) { - bb_show_usage(); + /* Too ugly, and needs even more magic to handle endianness: */ + //((uint32_t*)&salt)[0] = '$' + '1'*0x100 + '$'*0x10000; + /* Hope one day gcc will do it itself (inlining strcpy) */ + crypt_make_salt(salt + 3, 4); /* md5 */ + } else { + crypt_make_salt(salt, 1); /* des */ } - clear = argv[0]; - if (!clear) - clear = xmalloc_getline(stdin); + puts(pw_encrypt(argv[optind] ? argv[optind] : xmalloc_getline(stdin), salt)); - puts(pw_encrypt(clear, salt)); return 0; }