+static int
+ventoy_password_get (char buf[], unsigned buf_size)
+{
+ unsigned i, cur_len = 0;
+ int key;
+ struct grub_term_coordinate *pos = grub_term_save_pos ();
+
+ while (1)
+ {
+ key = grub_getkey ();
+ if (key == '\n' || key == '\r')
+ break;
+
+ if (key == GRUB_TERM_ESC)
+ {
+ cur_len = 0;
+ break;
+ }
+
+ if (key == '\b')
+ {
+ if (cur_len)
+ {
+ grub_term_restore_pos (pos);
+ for (i = 0; i < cur_len; i++)
+ grub_xputs (" ");
+ grub_term_restore_pos (pos);
+ cur_len--;
+ for (i = 0; i < cur_len; i++)
+ grub_xputs ("*");
+ grub_refresh ();
+ }
+ continue;
+ }
+
+ if (!grub_isprint (key))
+ continue;
+
+ if (cur_len + 2 < buf_size)
+ buf[cur_len++] = key;
+ grub_xputs ("*");
+ grub_refresh ();
+ }
+
+ grub_memset (buf + cur_len, 0, buf_size - cur_len);
+
+ grub_xputs ("\n");
+ grub_refresh ();
+ grub_free (pos);
+
+ return (key != GRUB_TERM_ESC);
+}
+