/* check for a free uid (and maybe gid) */
while (getpwuid(p->pw_uid) || (!p->pw_gid && getgrgid(p->pw_uid)))
p->pw_uid++;
-
+
if (!p->pw_gid) {
/* new gid = uid */
p->pw_gid = p->pw_uid;
free(cmd);
}
-static void passwd_wrapper(const char *login) ATTRIBUTE_NORETURN;
+static void passwd_wrapper(const char *login) NORETURN;
static void passwd_wrapper(const char *login)
{
bb_error_msg_and_die("cannot execute %s, you must set password manually", prog);
}
+#if ENABLE_FEATURE_ADDUSER_LONG_OPTIONS
+static const char adduser_longopts[] ALIGN1 =
+ "home\0" Required_argument "h"
+ "gecos\0" Required_argument "g"
+ "shell\0" Required_argument "s"
+ "ingroup\0" Required_argument "G"
+ "disabled-password\0" No_argument "D"
+ "empty-password\0" No_argument "D"
+ "system\0" No_argument "S"
+ "no-create-home\0" No_argument "H"
+ ;
+#endif
+
/*
* adduser will take a login_name as its first parameter.
* home, shell, gecos:
* can be customized via command-line parameters.
*/
int adduser_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int adduser_main(int argc, char **argv)
+int adduser_main(int argc UNUSED_PARAM, char **argv)
{
struct passwd pw;
const char *usegroup = NULL;
FILE *file;
+#if ENABLE_FEATURE_ADDUSER_LONG_OPTIONS
+ applet_long_options = adduser_longopts;
+#endif
+
/* got root? */
if (geteuid()) {
bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
/* fill in the passwd struct */
pw.pw_name = argv[0];
+ die_if_bad_username(pw.pw_name);
if (!pw.pw_dir) {
/* create string for $HOME if not specified already */
pw.pw_dir = xasprintf("/home/%s", argv[0]);
if (mkdir(pw.pw_dir, 0755)
|| chown(pw.pw_dir, pw.pw_uid, pw.pw_gid)
|| chmod(pw.pw_dir, 02755) /* set setgid bit on homedir */
- ) {
+ ) {
bb_simple_perror_msg(pw.pw_dir);
}
}