Пример #1
0
bool 
ply_open_unidirectional_pipe (int *sender_fd,
                              int *receiver_fd)
{
  int pipe_fds[2];

  assert (sender_fd != NULL);
  assert (receiver_fd != NULL);

  if (pipe (pipe_fds) < 0)
    return false;

  if (fcntl (pipe_fds[0], F_SETFD, O_NONBLOCK | FD_CLOEXEC) < 0)
    {
      ply_save_errno ();
      close (pipe_fds[0]);
      close (pipe_fds[1]);
      ply_restore_errno ();
      return false;
    }

  if (fcntl (pipe_fds[1], F_SETFD, O_NONBLOCK | FD_CLOEXEC) < 0)
    {
      ply_save_errno ();
      close (pipe_fds[0]);
      close (pipe_fds[1]);
      ply_restore_errno ();
      return false;
    }

  *sender_fd = pipe_fds[1];
  *receiver_fd = pipe_fds[0];

  return true;
}
Пример #2
0
static int
ply_open_unix_socket (void)
{
  int fd;
  const int should_pass_credentials = true;

  fd = socket (PF_UNIX, SOCK_STREAM, 0);

  if (fd < 0)
    return -1;

  if (fcntl (fd, F_SETFD, O_NONBLOCK | FD_CLOEXEC) < 0)
    {
      ply_save_errno ();
      close (fd);
      ply_restore_errno ();

      return -1;
    }

  if (setsockopt (fd, SOL_SOCKET, SO_PASSCRED,
                  &should_pass_credentials, sizeof (should_pass_credentials)) < 0)
    {
      ply_save_errno ();
      close (fd);
      ply_restore_errno ();
      return -1;
    }

  return fd;
}
Пример #3
0
static bool
ply_renderer_load_plugin (ply_renderer_t *renderer,
                          const char     *module_path)
{
  assert (renderer != NULL);

  get_backend_interface_function_t get_renderer_backend_interface;

  renderer->module_handle = ply_open_module (module_path);

  if (renderer->module_handle == NULL)
    return false;

  get_renderer_backend_interface = (get_backend_interface_function_t)
      ply_module_look_up_function (renderer->module_handle,
                                   "ply_renderer_backend_get_interface");

  if (get_renderer_backend_interface == NULL)
    {
      ply_save_errno ();
      ply_trace ("module '%s' is not a renderer plugin",
                 module_path);
      ply_close_module (renderer->module_handle);
      renderer->module_handle = NULL;
      ply_restore_errno ();
      return false;
    }

  renderer->plugin_interface = get_renderer_backend_interface ();

  if (renderer->plugin_interface == NULL)
    {
      ply_trace ("module '%s' is not a valid renderer plugin",
                 module_path);
      ply_save_errno ();
      ply_close_module (renderer->module_handle);
      renderer->module_handle = NULL;
      ply_restore_errno ();
      return false;
    }

  renderer->backend = renderer->plugin_interface->create_backend (renderer->device_name,
                                                                  renderer->terminal);

  if (renderer->backend == NULL)
    {
      ply_save_errno ();
      ply_trace ("module '%s' renderer backend could not be created",
                 module_path);
      ply_close_module (renderer->module_handle);
      renderer->module_handle = NULL;
      ply_restore_errno ();
      return false;
    }

  return true;
}
Пример #4
0
static bool
ply_label_load_plugin (ply_label_t *label)
{
  assert (label != NULL);

  get_plugin_interface_function_t get_label_plugin_interface;

  label->module_handle = ply_open_module (PLYMOUTH_PLUGIN_PATH "label.so");

  if (label->module_handle == NULL)
    return false;

  get_label_plugin_interface = (get_plugin_interface_function_t)
      ply_module_look_up_function (label->module_handle,
                                   "ply_label_plugin_get_interface");

  if (get_label_plugin_interface == NULL)
    {
      ply_save_errno ();
      ply_close_module (label->module_handle);
      label->module_handle = NULL;
      ply_restore_errno ();
      return false;
    }

  label->plugin_interface = get_label_plugin_interface ();

  if (label->plugin_interface == NULL)
    {
      ply_save_errno ();
      ply_close_module (label->module_handle);
      label->module_handle = NULL;
      ply_restore_errno ();
      return false;
    }

  label->control = label->plugin_interface->create_control ();

  if (label->text != NULL)
    label->plugin_interface->set_text_for_control (label->control,
                                                   label->text);
  label->plugin_interface->set_alignment_for_control (label->control,
                                                      label->alignment);
  label->plugin_interface->set_width_for_control (label->control,
                                                  label->width);
  if (label->fontdesc != NULL)
    label->plugin_interface->set_font_for_control (label->control,
                                                   label->fontdesc);

  label->plugin_interface->set_color_for_control (label->control,
                                                  label->red,
                                                  label->green,
                                                  label->blue,
                                                  label->alpha);
  return true;
}