+static int get_password(const char *name, usec_t until, bool accept_cached, char ***passwords) {
+ int r;
+ char **p;
+ _cleanup_free_ char *text = NULL;
+
+ assert(name);
+ assert(passwords);
+
+ if (asprintf(&text, "Please enter passphrase for disk %s!", name) < 0)
+ return log_oom();
+
+ r = ask_password_auto(text, "drive-harddisk", until, accept_cached, passwords);
+ if (r < 0) {
+ log_error("Failed to query password: %s", strerror(-r));
+ return r;
+ }
+
+ if (opt_verify) {
+ _cleanup_strv_free_ char **passwords2 = NULL;
+
+ assert(strv_length(*passwords) == 1);
+
+ if (asprintf(&text, "Please enter passphrase for disk %s! (verification)", name) < 0)
+ return log_oom();
+
+ r = ask_password_auto(text, "drive-harddisk", until, false, &passwords2);
+ if (r < 0) {
+ log_error("Failed to query verification password: %s", strerror(-r));
+ return r;
+ }
+
+ assert(strv_length(passwords2) == 1);
+
+ if (!streq(*passwords[0], passwords2[0])) {
+ log_warning("Passwords did not match, retrying.");
+ return -EAGAIN;
+ }
+ }
+
+ strv_uniq(*passwords);
+
+ STRV_FOREACH(p, *passwords) {
+ char *c;
+
+ if (strlen(*p)+1 >= opt_key_size)
+ continue;
+
+ /* Pad password if necessary */
+ if (!(c = new(char, opt_key_size)))
+ return log_oom();
+
+ strncpy(c, *p, opt_key_size);
+ free(*p);
+ *p = c;
+ }
+
+ return 0;
+}
+