Example #1
0
static void
on_password_answer_failure (password_answer_state_t *answer_state,
                            ply_boot_client_t       *client)
{
  ply_trace ("password answer failure");

  /* plymouthd isn't running for some reason.  If there is a command
   * to run, we'll run it anyway, because it might be important for
   * boot up to continue (to decrypt the root partition or whatever)
   */
  if (answer_state->command != NULL)
    {
      int exit_status;
      bool command_started;

      ply_trace ("daemon not available, running command on our own");

      exit_status = 127;
      command_started = false;
      while (answer_state->number_of_tries_left > 0)
        {
          command_started = answer_via_command (answer_state->command, NULL,
                                                &exit_status);

          if (command_started && WIFEXITED (exit_status) &&
              WEXITSTATUS (exit_status) == 0)
            {
              ply_trace ("command was successful");
              break;
            }

          ply_trace ("command failed");
          answer_state->number_of_tries_left--;
        }

      if (command_started && WIFSIGNALED (exit_status))
        {
          ply_trace ("command died with signal %s", strsignal (WTERMSIG (exit_status)));
          raise (WTERMSIG (exit_status));
        }
      else
        {
          ply_event_loop_exit (answer_state->state->loop,
                               WEXITSTATUS (exit_status));
        }
    }
  else
    {
      ply_event_loop_exit (answer_state->state->loop, 1);
    }
}
Example #2
0
static void
on_key_answer (key_answer_state_t *answer_state,
               const char         *answer,
               ply_boot_client_t  *client)
{
  if (answer_state->command != NULL)
    {
      answer_via_command (answer_state->command, answer, NULL);
    }
  else
    {
      if (answer != NULL)
        write (STDOUT_FILENO, answer, strlen (answer));
    }

  if (answer != NULL)
    ply_event_loop_exit (answer_state->state->loop, 0);
  ply_event_loop_exit (answer_state->state->loop, 1);
}
Example #3
0
static void
on_question_answer (question_answer_state_t   *answer_state,
                   const char                 *answer,
                   ply_boot_client_t          *client)
{
  if (answer != NULL)
    {
      if (answer_state->command != NULL)
        {
          answer_via_command (answer_state->command, answer, NULL);
        }
      else
        {
          write (STDOUT_FILENO, answer, strlen (answer));
        }
      if (answer_state->pause)
        ply_boot_client_tell_daemon_to_progress_unpause (client,
                                                         (ply_boot_client_response_handler_t)
                                                         on_success,
                                                         (ply_boot_client_response_handler_t)
                                                         on_failure,
                                                         answer_state->state);
      else
        ply_event_loop_exit (answer_state->state->loop, 0);
    }
  else
    {
      if (answer_state->pause)
        ply_boot_client_tell_daemon_to_progress_unpause (client,
                                                         (ply_boot_client_response_handler_t)
                                                         on_failure,
                                                         (ply_boot_client_response_handler_t)
                                                         on_failure,
                                                         answer_state->state);
      else
        ply_event_loop_exit (answer_state->state->loop, 1);
    }
}
Example #4
0
static void
on_multiple_password_answers (password_answer_state_t     *answer_state,
                              const char * const          *answers)
{
  bool need_to_ask_user;
  int i;
  int exit_status;

  assert (answer_state->command != NULL);

  ply_trace ("on multiple password answers");

  need_to_ask_user = true;

  if (answers != NULL)
    {
      ply_trace ("daemon has a few candidate passwords for us to try");
      for (i = 0; answers[i] != NULL; i++)
        {
          bool command_started;
          exit_status = 127;
          command_started = answer_via_command (answer_state->command, answers[i],
                                                &exit_status);
          if (command_started && WIFEXITED (exit_status) &&
              WEXITSTATUS (exit_status) == 0)
            {
              need_to_ask_user = false;
              break;
            }
        }
    }
  else
    {
      ply_trace ("daemon has no candidate passwords for us to try");
    }

  if (need_to_ask_user)
    {
      ply_boot_client_ask_daemon_for_password (answer_state->state->client,
                                               answer_state->prompt,
                                               (ply_boot_client_answer_handler_t)
                                               on_password_answer,
                                               (ply_boot_client_response_handler_t)
                                               on_password_answer_failure, answer_state);
      return;
    }

  ply_event_loop_exit (answer_state->state->loop, 0);
}
Example #5
0
Plymouth::answer_t Plymouth::displayMessage(const std::string & message){
    ply_boot_client_attach_to_event_loop(_ply_client, _ply_event_loop);

    auto response_helper = [this] (int exit_status) -> void {
	ply_event_loop_exit(_ply_event_loop, exit_status);
    };
    typedef decltype(response_helper) answer_helper_t;
    auto response_hdl = [] (void * data, ply_boot_client_t *) -> void{
	(*reinterpret_cast<answer_helper_t*>(data))(OK);
    };
    auto fail_hdl = [] (void *data, ply_boot_client_t*) -> void{
	(*reinterpret_cast<answer_helper_t*>(data))(FAILED);
    };
    ply_boot_client_tell_daemon_to_display_message(_ply_client, message.c_str(), response_hdl, fail_hdl, &response_helper);

    return static_cast<answer_t>(ply_event_loop_run(_ply_event_loop));
}
Example #6
0
static void
on_disconnect (state_t *state)
{
  bool wait;
  int status = 0;

  wait = false;
  ply_command_parser_get_options (state->command_parser,
                                   "wait", &wait,
                                   NULL
                                  );

  if (! wait) {
      ply_error ("error: unexpectedly disconnected from boot status daemon");
      status = 2;
  }

  ply_trace ("disconnect");
  ply_event_loop_exit (state->loop, status);
}
Example #7
0
Plymouth::answer_t Plymouth::pause(bool do_pause){
    ply_boot_client_attach_to_event_loop(_ply_client, _ply_event_loop);

    auto response_helper = [this] (int exit_status) -> void {
	ply_event_loop_exit(_ply_event_loop, exit_status);
    };
    typedef decltype(response_helper) answer_helper_t;
    auto success_hdl = [] (void * data, ply_boot_client_t *) -> void{
	(*reinterpret_cast<answer_helper_t*>(data))(OK);
    };
    auto fail_hdl = [] (void *data, ply_boot_client_t*) -> void{
	(*reinterpret_cast<answer_helper_t*>(data))(FAILED);
    };

    if (do_pause){
	ply_boot_client_tell_daemon_to_progress_pause(_ply_client, success_hdl, fail_hdl, &response_helper);
    } else {
	ply_boot_client_tell_daemon_to_progress_unpause(_ply_client, success_hdl, fail_hdl, &response_helper);
    }

    return static_cast<answer_t>(ply_event_loop_run(_ply_event_loop));
}
Example #8
0
Plymouth::answer_t Plymouth::askQuestion(const std::string & prompt, std::string & answer){
    ply_boot_client_attach_to_event_loop(_ply_client, _ply_event_loop);

    auto answer_helper = [this, &answer] (const char * _answer, int exit_status) -> void {
	if(_answer == 0 || _answer[0] == KEY_CTRL_C){
	    exit_status = CANCELED;
	}
	if(exit_status == OK){
	    answer.assign(_answer);
	}
	ply_event_loop_exit(_ply_event_loop, exit_status);
    };
    typedef decltype(answer_helper) answer_helper_t;
    auto answer_hdl = [] (void * data, const char * answer, ply_boot_client_t *) -> void{
	(*reinterpret_cast<answer_helper_t*>(data))(answer, OK);
    };
    auto fail_hdl = [] (void *data, ply_boot_client_t*) -> void{
	(*reinterpret_cast<answer_helper_t*>(data))("", FAILED);
    };
    ply_boot_client_ask_daemon_question(_ply_client, prompt.c_str(), answer_hdl, fail_hdl, &answer_helper);

    return static_cast<answer_t>(ply_event_loop_run(_ply_event_loop));
}
Example #9
0
Plymouth::answer_t Plymouth::whatchKey(const std::string & keys, std::string & result){
    ply_boot_client_attach_to_event_loop(_ply_client, _ply_event_loop);

    auto answer_helper = [this, &result] (const char * _answer, int exit_status) -> void {
	if(_answer == 0){
	    exit_status = CANCELED;
	}
	if(exit_status == OK){
	    result.assign(_answer);
	}
	ply_event_loop_exit(_ply_event_loop, exit_status);
    };
    typedef decltype(answer_helper) answer_helper_t;
    auto answer_hdl = [] (void * data, const char * answer, ply_boot_client_t *) -> void{
	(*reinterpret_cast<answer_helper_t*>(data))(answer, OK);
    };
    auto fail_hdl = [] (void *data, ply_boot_client_t*) -> void{
	(*reinterpret_cast<answer_helper_t*>(data))("", FAILED);
    };

    ply_boot_client_ask_daemon_to_watch_for_keystroke(_ply_client, keys == "" ? 0 : keys.c_str(), answer_hdl, fail_hdl, &answer_helper);

    return static_cast<answer_t>(ply_event_loop_run(_ply_event_loop));
}
Example #10
0
static void
on_disconnect (ply_event_loop_t *loop)
{
  printf ("DISCONNECT!\n");
  ply_event_loop_exit (loop, 1);
}
Example #11
0
static void
on_quit_failed (ply_event_loop_t *loop)
{
  printf ("QUIT FAILED! %m\n");
  ply_event_loop_exit (loop, 2);
}
Example #12
0
static void
on_quit (ply_event_loop_t *loop)
{
  printf ("QUIT!\n");
  ply_event_loop_exit (loop, 0);
}
Example #13
0
static void
on_system_initialized_failed (ply_event_loop_t *loop)
{
  printf ("SYSTEM INITIALIZATION REQUEST FAILED!\n");
  ply_event_loop_exit (loop, 1);
}
Example #14
0
static void
on_update_failed (ply_event_loop_t *loop)
{
  printf ("UPDATE FAILED! %m\n");
  ply_event_loop_exit (loop, 1);
}
Example #15
0
static void
on_ping_failed (ply_event_loop_t *loop)
{
  printf ("PING FAILED! %m\n");
  ply_event_loop_exit (loop, 1);
}
Example #16
0
static void on_disconnect(void* dummy)
{
	ply_event_loop_exit(ply_loop, 0);
}
Example #17
0
static void on_failure(void* dummy)
{
	ply_event_loop_exit(ply_loop, 0);
}
Example #18
0
static void
on_password_answer (password_answer_state_t   *answer_state,
                    const char                *answer,
                    ply_boot_client_t         *client)
{
  int exit_status;

  exit_status = 127;
  if (answer != NULL && answer[0] != KEY_CTRL_C)  /* a CTRL-C answer means the user canceled */
    {
      if (answer_state->command != NULL)
        {
          bool command_started = false;

          command_started = answer_via_command (answer_state->command, answer,
                                                &exit_status);

          if (command_started && (!WIFEXITED (exit_status) ||
              WEXITSTATUS (exit_status) != 0))
            {
              answer_state->number_of_tries_left--;

              if (answer_state->number_of_tries_left > 0)
                {
                  ply_boot_client_ask_daemon_for_password (answer_state->state->client,
                                                           answer_state->prompt,
                                                           (ply_boot_client_answer_handler_t)
                                                           on_password_answer,
                                                           (ply_boot_client_response_handler_t)
                                                           on_password_answer_failure,
                                                           answer_state);
                  return;
                }
            }
        }
      else
        {
          write (STDOUT_FILENO, answer, strlen (answer));
          exit_status = 0;
        }
    }
  else if (answer == NULL)
    {
      on_password_answer_failure (answer_state, answer_state->state->client);
    }

  if (WIFSIGNALED (exit_status))
    raise (WTERMSIG (exit_status));
  
  if (answer_state->pause)
    {
      ply_boot_client_tell_daemon_to_progress_unpause (client,
                                                       (ply_boot_client_response_handler_t)
                                                       (WEXITSTATUS (exit_status) ? on_failure : on_success),
                                                       (ply_boot_client_response_handler_t)
                                                       on_failure,
                                                       answer_state->state);
    }
  else
    ply_event_loop_exit (answer_state->state->loop, WEXITSTATUS (exit_status));
}
Example #19
0
static void
on_success (state_t *state)
{
  ply_event_loop_exit (state->loop, 0);
}
Example #20
0
static void
on_quit (ply_event_loop_t *loop)
{
  printf ("got quit request, quiting...\n");
  ply_event_loop_exit (loop, 0);
}
static void
on_disconnect (state_t *state)
{
  ply_trace ("disconnected from boot status daemon");
  ply_event_loop_exit (state->loop, 0);
}
Example #22
0
static void
on_key_answer_failure (key_answer_state_t *answer_state,
                       ply_boot_client_t  *client)
{
  ply_event_loop_exit (answer_state->state->loop, 1);
}
Example #23
0
static void
on_interrupt (ply_boot_splash_plugin_t *plugin)
{
  ply_event_loop_exit (plugin->loop, 1);
  stop_animation (plugin, NULL);
}
Example #24
0
static void
on_failure (state_t *state)
{
  ply_event_loop_exit (state->loop, 1);
}