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; }
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; }
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; }
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; }