]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
Add new subcommand "ask-for-password"
authorRay Strode <rstrode@redhat.com>
Tue, 1 Jul 2008 18:57:17 +0000 (14:57 -0400)
committerRay Strode <rstrode@redhat.com>
Tue, 1 Jul 2008 18:57:17 +0000 (14:57 -0400)
This command obsoletes --ask-for-password and supports an
optional --command for specifying what command to feed the
password to.  If the command fails, then the client will
ask the daemon to ask for the password again.

src/client/ply-boot-client.h
src/client/plymouth.c

index 214269103a50722115f6b1323d7f6d5e2105cf54..1f5a18d8d77c20b3ba6d6b8e1b7ddc2d0703bf72 100644 (file)
@@ -60,9 +60,9 @@ void ply_boot_client_tell_daemon_to_change_root (ply_boot_client_t
                                                  ply_boot_client_response_handler_t  failed_handler,
                                                  void                               *user_data);
 void ply_boot_client_ask_daemon_for_password (ply_boot_client_t                  *client,
-                                         ply_boot_client_answer_handler_t    handler,
-                                         ply_boot_client_response_handler_t  failed_handler,
-                                         void                               *user_data);
+                                              ply_boot_client_answer_handler_t    handler,
+                                              ply_boot_client_response_handler_t  failed_handler,
+                                              void                               *user_data);
 void ply_boot_client_tell_daemon_system_is_initialized (ply_boot_client_t                  *client,
                                                         ply_boot_client_response_handler_t  handler,
                                                         ply_boot_client_response_handler_t  failed_handler,
index ece2ea6ad674a0db54f76bda242304059b311026..3e332a88806fcbe9871a7caf87d830c5012b9dde 100644 (file)
@@ -38,18 +38,76 @@ typedef struct
   ply_command_parser_t *command_parser;
 } state_t;
 
+typedef struct
+{
+  state_t *state;
+  char    *command;
+} answer_state_t;
+
+static bool
+answer_via_command (answer_state_t *answer_state,
+                    const char     *answer,
+                    int            *exit_status)
+{
+  FILE *command_input_stream;
+  bool gave_answer;
+
+  gave_answer = false;
+  command_input_stream = popen (answer_state->command, "w");
+
+  if (command_input_stream == NULL)
+    goto out;
+
+  if (fwrite (answer, strlen (answer), 1, command_input_stream) != 1)
+    goto out;
+
+  if (fflush (command_input_stream) != 0)
+    goto out;
+
+  gave_answer = true;
+out:
+  if (command_input_stream != NULL)
+    *exit_status = pclose (command_input_stream);
+
+  return gave_answer;
+}
+
 static void
-on_answer (ply_event_loop_t *loop,
-           const char       *answer)
+on_answer_failure (answer_state_t *answer_state)
 {
-  write (STDOUT_FILENO, answer, strlen (answer));
-  ply_event_loop_exit (loop, 0);
+  ply_event_loop_exit (answer_state->state->loop, 1);
 }
 
 static void
-on_success (state_t *state)
+on_answer (answer_state_t   *answer_state,
+           const char       *answer)
 {
-  ply_event_loop_exit (state->loop, 0);
+  int exit_status;
+
+  exit_status = 0;
+  if (answer_state->command != NULL)
+    {
+      bool command_started = false;
+
+      exit_status = 127;
+      command_started = answer_via_command (answer_state, answer,
+                                            &exit_status);
+
+      if (command_started && (!WIFEXITED (exit_status) ||
+          WEXITSTATUS (exit_status) != 0))
+        {
+          ply_boot_client_ask_daemon_for_password (answer_state->state->client,
+                                                   (ply_boot_client_answer_handler_t)
+                                                   on_answer,
+                                                   (ply_boot_client_response_handler_t)
+                                                   on_answer_failure, answer_state);
+          return;
+        }
+    }
+  else
+    write (STDOUT_FILENO, answer, strlen (answer));
+
+  ply_event_loop_exit (answer_state->state->loop, exit_status);
 }
 
 static void
@@ -58,6 +116,12 @@ on_failure (state_t *state)
   ply_event_loop_exit (state->loop, 1);
 }
 
+static void
+on_success (state_t *state)
+{
+  ply_event_loop_exit (state->loop, 0);
+}
+
 static void
 on_disconnect (state_t *state)
 {
@@ -65,6 +129,33 @@ on_disconnect (state_t *state)
   ply_event_loop_exit (state->loop, 2);
 }
 
+static void
+on_password_request (state_t    *state,
+                     const char *command)
+{
+  char *prompt;
+  char *program;
+  answer_state_t *answer_state;
+
+  prompt = NULL;
+  program = NULL;
+  ply_command_parser_get_command_options (state->command_parser,
+                                          command,
+                                          "command", &program, NULL);
+
+  answer_state = calloc (1, sizeof (answer_state_t));
+  answer_state->state = state;
+  answer_state->command = program != NULL? strdup (program): NULL;
+
+  ply_boot_client_ask_daemon_for_password (state->client,
+                                           (ply_boot_client_answer_handler_t)
+                                           on_answer,
+                                           (ply_boot_client_response_handler_t)
+                                           on_answer_failure, answer_state);
+
+  free (program);
+}
+
 int
 main (int    argc,
       char **argv)
@@ -92,6 +183,13 @@ main (int    argc,
                                   "update", "Tell boot daemon an update about boot progress", PLY_COMMAND_OPTION_TYPE_STRING,
                                   NULL);
 
+  ply_command_parser_add_command (state.command_parser,
+                                  "ask-for-password", "Ask user for passowrd",
+                                  (ply_command_handler_t)
+                                  on_password_request, &state,
+                                  "command", "Command to send password to via standard input",
+                                  PLY_COMMAND_OPTION_TYPE_STRING, NULL);
+
   if (!ply_command_parser_parse_arguments (state.command_parser, state.loop, argv, argc))
     {
       char *help_string;
@@ -184,11 +282,16 @@ main (int    argc,
                                    (ply_boot_client_response_handler_t)
                                    on_failure, &state);
   else if (should_ask_for_password)
-    ply_boot_client_ask_daemon_for_password (state.client,
-                                   (ply_boot_client_answer_handler_t)
-                                   on_answer,
-                                   (ply_boot_client_response_handler_t)
-                                   on_failure, &state);
+    {
+      answer_state_t answer_state = { 0 };
+
+      answer_state.state = &state;
+      ply_boot_client_ask_daemon_for_password (state.client,
+                                               (ply_boot_client_answer_handler_t)
+                                                on_answer,
+                                               (ply_boot_client_response_handler_t)
+                                               on_answer_failure, &answer_state);
+    }
   else if (should_sysinit)
     ply_boot_client_tell_daemon_system_is_initialized (state.client,
                                    (ply_boot_client_response_handler_t)
@@ -201,8 +304,6 @@ main (int    argc,
                                    on_success,
                                    (ply_boot_client_response_handler_t)
                                    on_failure, &state);
-  else
-    return 1;
 
   exit_code = ply_event_loop_run (state.loop);