summaryrefslogtreecommitdiffstats
path: root/src/splash-plugins/text
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2008-05-21 22:57:40 -0400
committerRay Strode <rstrode@redhat.com>2008-05-21 22:57:40 -0400
commitb8624e3cd05258a81a7e3cf4d95e2dcd81fe0aa4 (patch)
treeb9026ccd834ec9887de61b6c23e3776493ce5665 /src/splash-plugins/text
parentb5b6fb666d44738296b7cb1c0950ee2226493e34 (diff)
downloadplymouth-b8624e3cd05258a81a7e3cf4d95e2dcd81fe0aa4.tar.gz
plymouth-b8624e3cd05258a81a7e3cf4d95e2dcd81fe0aa4.tar.xz
plymouth-b8624e3cd05258a81a7e3cf4d95e2dcd81fe0aa4.zip
Add second cut at password support
This version works even in raw mode, by buffering key presses passed from the window object, and replying to the client after the user presses enter. There are a lot of layers of function pointers getting passed around, so it may make sense to introduce an opaque type for holding the password and triggering the reply.
Diffstat (limited to 'src/splash-plugins/text')
-rw-r--r--src/splash-plugins/text/text.c72
1 files changed, 48 insertions, 24 deletions
diff --git a/src/splash-plugins/text/text.c b/src/splash-plugins/text/text.c
index d65c0be..a40e945 100644
--- a/src/splash-plugins/text/text.c
+++ b/src/splash-plugins/text/text.c
@@ -38,8 +38,10 @@
#include <termios.h>
#include <unistd.h>
#include <values.h>
+#include <wchar.h>
#include "ply-boot-splash-plugin.h"
+#include "ply-buffer.h"
#include "ply-event-loop.h"
#include "ply-list.h"
#include "ply-logger.h"
@@ -50,11 +52,18 @@
#include <linux/kd.h>
+#define CLEAR_LINE_SEQUENCE "\033[2K"
+
struct _ply_boot_splash_plugin
{
ply_event_loop_t *loop;
int console_fd;
+ ply_boot_splash_password_answer_handler_t password_answer_handler;
+ void *password_answer_data;
+
+ ply_buffer_t *keyboard_input_buffer;
+ uint32_t keyboard_input_is_hidden : 1;
};
ply_boot_splash_plugin_t *
@@ -65,6 +74,7 @@ create_plugin (void)
ply_trace ("creating plugin");
plugin = calloc (1, sizeof (ply_boot_splash_plugin_t));
+ plugin->keyboard_input_buffer = ply_buffer_new ();
plugin->console_fd = -1;
return plugin;
@@ -78,6 +88,8 @@ destroy_plugin (ply_boot_splash_plugin_t *plugin)
if (plugin == NULL)
return;
+ ply_buffer_free (plugin->keyboard_input_buffer);
+
free (plugin);
}
@@ -151,38 +163,50 @@ hide_splash_screen (ply_boot_splash_plugin_t *plugin,
}
}
-char *
-ask_for_password (ply_boot_splash_plugin_t *plugin)
+void
+ask_for_password (ply_boot_splash_plugin_t *plugin,
+ ply_boot_splash_password_answer_handler_t answer_handler,
+ void *answer_data)
{
- char answer[1024];
- struct termios initial_term_attributes;
- struct termios noecho_term_attributes;
-
- tcgetattr (STDIN_FILENO, &initial_term_attributes);
- noecho_term_attributes = initial_term_attributes;
- noecho_term_attributes.c_lflag &= ~ECHO;
-
- printf ("Password: ");
-
- if (tcsetattr (STDIN_FILENO, TCSAFLUSH, &noecho_term_attributes) != 0) {
- fprintf (stderr, "Could not set terminal attributes\n");
- return NULL;
- }
-
- fgets (answer, sizeof (answer), stdin);
- answer[strlen (answer) - 1] = '\0';
-
- tcsetattr (STDIN_FILENO, TCSANOW, &initial_term_attributes);
+ plugin->password_answer_handler = answer_handler;
+ plugin->password_answer_data = answer_data;
- printf ("\n");
-
- return strdup (answer);
+ write (STDOUT_FILENO, "\nPassword: ", strlen ("\nPassword: "));
+ plugin->keyboard_input_is_hidden = true;
}
void
on_keyboard_input (ply_boot_splash_plugin_t *plugin,
const char *keyboard_input)
{
+ ssize_t character_size;
+
+ character_size = (ssize_t) mbrlen (keyboard_input, MB_CUR_MAX, NULL);
+
+ if (character_size < 0)
+ return;
+
+ if (plugin->password_answer_handler != NULL)
+ {
+ if (character_size == 1 && keyboard_input[0] == '\r')
+ {
+ plugin->password_answer_handler (plugin->password_answer_data,
+ ply_buffer_get_bytes (plugin->keyboard_input_buffer));
+ plugin->keyboard_input_is_hidden = false;
+ ply_buffer_clear (plugin->keyboard_input_buffer);
+ plugin->password_answer_handler = NULL;
+ write (STDOUT_FILENO, CLEAR_LINE_SEQUENCE, strlen (CLEAR_LINE_SEQUENCE));
+ return;
+ }
+ }
+
+ ply_buffer_append_bytes (plugin->keyboard_input_buffer,
+ keyboard_input, character_size);
+
+ if (plugin->keyboard_input_is_hidden)
+ write (STDOUT_FILENO, "•", strlen ("•"));
+ else
+ write (STDOUT_FILENO, keyboard_input, character_size);
}
ply_boot_splash_plugin_interface_t *