+ if (!arg_zone)
+ opt_failure("--zone must be given");
+
+ char *passwd = xstrdup(getpass("New password: "));
+ char *again = xstrdup(getpass("Confirm password: "));
+ if (strcmp(passwd, again))
+ die("Passwords do not match");
+
+ op_new("set-passwd");
+ set_string(rq, "zone", arg_zone);
+ set_string(rq, "passwd", passwd);
+
+ op_run();
+}
+
+static void cmd_delete_passwd(void)
+{
+ if (!arg_zone)
+ opt_failure("--zone must be given");
+
+ op_new("delete-passwd");
+ set_string(rq, "zone", arg_zone);
+
+ op_run();
+}
+
+static void cmd_create_token(void)
+{
+ if (!arg_zone)
+ opt_failure("--zone must be given");
+
+ op_new("create-token");
+ set_string(rq, "zone", arg_zone);
+ set_string(rq, "comment", arg_comment);
+
+ op_run();
+ struct json_node *jt = need_child(rp, "token", JSON_STRING);
+ printf("%s\n", jt->string);
+}
+
+static void cmd_delete_token(void)
+{
+ if (!arg_zone || !arg_ident)
+ opt_failure("--zone and --ident must be given");
+
+ op_new("delete-token");
+ set_string(rq, "zone", arg_zone);
+ set_string(rq, "ident", arg_ident);
+
+ op_run();
+}
+
+static void cmd_create_acct(void)
+{
+ if (!arg_zone || !arg_user)
+ opt_failure("--zone and --user must be given");
+
+ op_new("create-acct");
+ set_string(rq, "zone", arg_zone);
+ set_string(rq, "login", arg_user);
+
+ op_run();
+}
+
+static void cmd_delete_acct(void)
+{
+ if (!arg_zone || !arg_user)
+ opt_failure("--zone and --user must be given");
+
+ op_new("delete-acct");
+ set_string(rq, "zone", arg_zone);
+ set_string(rq, "login", arg_user);
+
+ op_run();
+}
+
+static void cmd_delete_user(void)
+{
+ if (!arg_user)
+ opt_failure("--user must be given");
+
+ op_new("delete-acct");
+ set_string(rq, "zone", "*");
+ set_string(rq, "login", arg_user);
+
+ op_run();