diff options
| author | Ray Strode <rstrode@redhat.com> | 2007-06-21 09:51:32 -0400 |
|---|---|---|
| committer | Ray Strode <rstrode@redhat.com> | 2007-06-21 09:51:32 -0400 |
| commit | ab9f3e9667f1d70ff957c6d5795928499b3efcb3 (patch) | |
| tree | 8dda4aeed4fa0b75381976c6a2e8895d49e7d3f8 /src | |
| parent | 1c243bdf2dd8f2f3fc2ea0b78e84314cdf28d456 (diff) | |
| download | plymouth-ab9f3e9667f1d70ff957c6d5795928499b3efcb3.tar.gz plymouth-ab9f3e9667f1d70ff957c6d5795928499b3efcb3.tar.xz plymouth-ab9f3e9667f1d70ff957c6d5795928499b3efcb3.zip | |
dump everything i'm working on into the main refactor branch for now
Diffstat (limited to 'src')
| -rw-r--r-- | src/libply/ply-terminal-session.c | 27 | ||||
| -rw-r--r-- | src/libply/ply-terminal-session.h | 5 | ||||
| -rw-r--r-- | src/libply/ply-terminal.c | 9 | ||||
| -rw-r--r-- | src/libply/ply-utils.c | 21 | ||||
| -rw-r--r-- | src/libply/tests/Makefile.am | 2 | ||||
| -rw-r--r-- | src/libply/tests/ply-terminal-test.am | 2 | ||||
| -rw-r--r-- | src/main.c | 256 | ||||
| -rw-r--r-- | src/splash-plugins/fedora-fade-in/fedora-fade-in.c | 9 | ||||
| -rw-r--r-- | src/tests/Makefile.am | 2 |
9 files changed, 315 insertions, 18 deletions
diff --git a/src/libply/ply-terminal-session.c b/src/libply/ply-terminal-session.c index 22da67a..c0a71c8 100644 --- a/src/libply/ply-terminal-session.c +++ b/src/libply/ply-terminal-session.c @@ -49,8 +49,8 @@ struct _ply_terminal_session ply_event_loop_t *loop; char **argv; - ply_terminal_session_done_handler_t done_handler; - void *done_handler_user_data; + ply_terminal_session_done_handler_t done_handler; + void *done_handler_user_data; uint32_t is_running : 1; uint32_t console_is_redirected : 1; @@ -220,6 +220,7 @@ ply_terminal_session_unredirect_console (ply_terminal_session_t *session) bool ply_terminal_session_run (ply_terminal_session_t *session, ply_terminal_session_flags_t flags, + ply_terminal_session_begin_handler_t begin_handler, ply_terminal_session_done_handler_t done_handler, void *user_data) { @@ -236,22 +237,33 @@ ply_terminal_session_run (ply_terminal_session_t *session, should_redirect_console = (flags & PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE) != 0; + ply_trace ("creating terminal device"); if (!ply_terminal_create_device (session->terminal)) return false; + ply_trace ("done creating terminal device"); + if (should_redirect_console) + ply_trace ("redirecting system console to terminal device"); if (should_redirect_console && !ply_terminal_session_redirect_console (session)) { + ply_save_errno (); ply_terminal_destroy_device (session->terminal); + ply_restore_errno (); return false; } + if (should_redirect_console) + ply_trace ("done redirecting system console to terminal device"); + ply_trace ("creating subprocess"); pid = fork (); if (pid < 0) { + ply_save_errno (); ply_terminal_session_unredirect_console (session); ply_terminal_destroy_device (session->terminal); + ply_restore_errno (); return false; } @@ -266,6 +278,14 @@ ply_terminal_session_run (ply_terminal_session_t *session, return true; } + if (begin_handler != NULL) + { + ply_trace ("running 'begin handler'"); + begin_handler (user_data, session); + ply_trace ("ran 'begin handler'"); + } + + ply_trace ("beginning session"); ply_terminal_session_execute (session, look_in_path); _exit (errno); @@ -421,7 +441,8 @@ main (int argc, ply_terminal_session_attach_to_event_loop (session, loop); if (!ply_terminal_session_run (session, flags, - (ply_terminal_session_done_handler_t) + (ply_terminal_session_begin_handler_t) NULL, + (ply_terminal_session_done_handler_t) on_finished, loop)) { perror ("could not start terminal session"); diff --git a/src/libply/ply-terminal-session.h b/src/libply/ply-terminal-session.h index 3a35a45..8d474ea 100644 --- a/src/libply/ply-terminal-session.h +++ b/src/libply/ply-terminal-session.h @@ -29,6 +29,10 @@ #include "ply-event-loop.h" typedef struct _ply_terminal_session ply_terminal_session_t; + +typedef void (* ply_terminal_session_begin_handler_t) + (void *user_data, ply_terminal_session_t *session); + typedef void (* ply_terminal_session_done_handler_t) (void *user_data, ply_terminal_session_t *session); @@ -48,6 +52,7 @@ void ply_terminal_session_attach_to_event_loop (ply_terminal_session_t *session, ply_event_loop_t *loop); bool ply_terminal_session_run (ply_terminal_session_t *session, ply_terminal_session_flags_t flags, + ply_terminal_session_begin_handler_t begin_handler, ply_terminal_session_done_handler_t done_handler, void *user_data); int ply_terminal_session_get_fd (ply_terminal_session_t *session); diff --git a/src/libply/ply-terminal.c b/src/libply/ply-terminal.c index b0ca9d9..19d85e6 100644 --- a/src/libply/ply-terminal.c +++ b/src/libply/ply-terminal.c @@ -36,6 +36,7 @@ #include <sys/types.h> #include <unistd.h> +#include "ply-logger.h" #include "ply-utils.h" struct _ply_terminal @@ -72,6 +73,7 @@ ply_terminal_create_device (ply_terminal_t *terminal) assert (terminal != NULL); assert (!ply_terminal_has_device (terminal)); + ply_trace ("opening device '/dev/ptmx'"); #if 0 terminal->fd = posix_openpt (O_RDWR | O_NOCTTY); #endif @@ -79,15 +81,20 @@ ply_terminal_create_device (ply_terminal_t *terminal) if (terminal->fd < 0) return false; + ply_trace (" opened device '/dev/ptmx'"); + ply_trace ("creating pseudoterminal"); if (grantpt (terminal->fd) < 0) { saved_errno = errno; + ply_trace ("could not create psuedoterminal: %m"); ply_terminal_destroy_device (terminal); errno = saved_errno; return false; } + ply_trace ("done creating pseudoterminal"); + ply_trace ("unlocking pseudoterminal"); if (unlockpt (terminal->fd) < 0) { saved_errno = errno; @@ -95,8 +102,10 @@ ply_terminal_create_device (ply_terminal_t *terminal) errno = saved_errno; return false; } + ply_trace ("unlocked pseudoterminal"); terminal->name = strdup (ptsname (terminal->fd)); + ply_trace ("pseudoterminal '%s' ready for action", terminal->name); return true; } diff --git a/src/libply/ply-utils.c b/src/libply/ply-utils.c index 0467b78..ed8b19a 100644 --- a/src/libply/ply-utils.c +++ b/src/libply/ply-utils.c @@ -42,6 +42,8 @@ #include <dlfcn.h> +#include "ply-logger.h" + #ifndef PLY_OPEN_FILE_DESCRIPTORS_DIR #define PLY_OPEN_FILE_DESCRIPTORS_DIR "/proc/self/fd" #endif @@ -624,10 +626,14 @@ ply_create_directory (const char *directory) assert (directory[0] != '\0'); if (ply_directory_exists (directory)) - return true; + { + ply_trace ("directory '%s' already exists", directory); + return true; + } if (ply_file_exists (directory)) { + ply_trace ("file '%s' is in the way", directory); errno = EEXIST; return false; } @@ -636,22 +642,26 @@ ply_create_directory (const char *directory) { char *parent_directory; char *last_path_component; - bool parent_is_created; + bool is_created; - parent_is_created = false; + is_created = false; if (errno == ENOENT) { parent_directory = strdup (directory); last_path_component = strrchr (parent_directory, '/'); *last_path_component = '\0'; - parent_is_created = ply_create_directory (parent_directory); + + ply_trace ("parent directory '%s' doesn't exist, creating it first", parent_directory); + if (ply_create_directory (parent_directory) + && (mkdir (directory, 0755) == 0)) + is_created = true; ply_save_errno (); free (parent_directory); ply_restore_errno (); } - return parent_is_created; + return is_created; } @@ -665,6 +675,7 @@ ply_create_detachable_directory (const char *directory) assert (directory != NULL); assert (directory[0] != '\0'); + ply_trace ("trying to create directory '%s'", directory); if (!ply_create_directory (directory)) return false; diff --git a/src/libply/tests/Makefile.am b/src/libply/tests/Makefile.am index e4ecfe6..58a26ef 100644 --- a/src/libply/tests/Makefile.am +++ b/src/libply/tests/Makefile.am @@ -11,6 +11,8 @@ include $(srcdir)/ply-terminal-session-test.am include $(srcdir)/ply-logger-test.am include $(srcdir)/ply-list-test.am include $(srcdir)/ply-event-loop-test.am +include $(srcdir)/ply-copy-test.am +include $(srcdir)/ply-copy-dir-test.am noinst_PROGRAMS = $(TESTS) diff --git a/src/libply/tests/ply-terminal-test.am b/src/libply/tests/ply-terminal-test.am index 66f3c41..9262413 100644 --- a/src/libply/tests/ply-terminal-test.am +++ b/src/libply/tests/ply-terminal-test.am @@ -4,6 +4,8 @@ ply_terminal_test_CFLAGS = $(PLYMOUTH_CFLAGS) -DPLY_TERMINAL_ENABLE_TEST ply_terminal_test_LDADD = $(PLYMOUTH_LIBS) ply_terminal_test_SOURCES = \ + $(srcdir)/../ply-logger.h \ + $(srcdir)/../ply-logger.c \ $(srcdir)/../ply-utils.h \ $(srcdir)/../ply-utils.c \ $(srcdir)/../ply-terminal.h \ @@ -38,15 +38,34 @@ #include "ply-terminal-session.h" #include "ply-utils.h" +#ifndef PLY_WORKING_DIRECTORY +#define PLY_WORKING_DIRECTORY "/var/run/plymouth" +#endif + typedef struct { ply_event_loop_t *loop; ply_boot_server_t *boot_server; ply_boot_splash_t *boot_splash; ply_terminal_session_t *session; + int original_root_dir_fd; } state_t; static void +on_session_start (state_t *state) +{ + ply_trace ("changing to original root fs"); + + if (fchdir (state->original_root_dir_fd) < 0) + { + ply_trace ("Could not change to original root directory " + "to start session: %m"); + return; + } + ply_trace ("changed to original root fs"); +} + +static void on_session_finished (state_t *state) { ply_log ("\nSession finished...exiting logger\n"); @@ -109,10 +128,14 @@ start_boot_splash (state_t *state, { ply_boot_splash_t *splash; - mknod ("/dev/fb", 0600 | S_IFCHR, makedev (29, 0)); + ply_trace ("Loading boot splash plugin '%s'", + module_path); splash = ply_boot_splash_new (module_path); + + ply_trace ("attaching plugin to event loop"); ply_boot_splash_attach_to_event_loop (splash, state->loop); + ply_trace ("showing plugin"); if (!ply_boot_splash_show (splash)) { ply_save_errno (); @@ -136,10 +159,15 @@ spawn_session (state_t *state, flags |= PLY_TERMINAL_SESSION_FLAGS_LOOK_IN_PATH; flags |= PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE; + ply_trace ("opening terminal session for '%s'", argv[0]); session = ply_terminal_session_new ((const char * const *) argv); + ply_trace ("attaching terminal session to event loop"); ply_terminal_session_attach_to_event_loop (session, state->loop); + ply_trace ("running '%s'", argv[0]); if (!ply_terminal_session_run (session, flags, + (ply_terminal_session_begin_handler_t) + on_session_start, (ply_terminal_session_done_handler_t) on_session_finished, state)) { @@ -152,6 +180,202 @@ spawn_session (state_t *state, return session; } +static bool +create_working_directory (state_t *state) +{ + ply_trace ("creating working directory '%s'", + PLY_WORKING_DIRECTORY); + if (!ply_create_directory (PLY_WORKING_DIRECTORY)) + return false; + + ply_trace ("changing to working directory"); + if (chdir (PLY_WORKING_DIRECTORY) < 0) + return false; + + ply_trace ("creating proc subdirectory"); + if (!ply_create_directory ("proc")) + return false; + + ply_trace ("creating dev subdirectory"); + if (!ply_create_directory ("dev")) + return false; + + ply_trace ("creating dev/pts subdirectory"); + if (!ply_create_directory ("dev/pts")) + return false; + + ply_trace ("creating usr/share/plymouth subdirectory"); + if (!ply_create_directory ("usr/share/plymouth")) + return false; + + ply_trace ("creating usr/lib/plymouth subdirectory"); + if (!ply_create_directory ("usr/lib/plymouth")) + return false; + + ply_trace ("created detachable working directory '%s'", + PLY_WORKING_DIRECTORY); + return true; +} + +static bool +change_to_working_directory (state_t *state) +{ + ply_trace ("changing to working directory"); + + state->original_root_dir_fd = open ("/", O_RDONLY); + + if (state->original_root_dir_fd < 0) + return false; + + if (chdir (PLY_WORKING_DIRECTORY) < 0) + return false; + + if (chroot (".") < 0) + return false; + + ply_trace ("now successfully in working directory"); + return true; +} + +static bool +mount_proc_filesystem (state_t *state) +{ + ply_trace ("mounting proc filesystem"); + if (mount ("none", PLY_WORKING_DIRECTORY "/proc", "proc", 0, NULL) < 0) + return false; + + open (PLY_WORKING_DIRECTORY "/proc/.", O_RDWR); + + ply_trace ("mounted proc filesystem"); + return true; +} + +static bool +create_device_nodes (state_t *state) +{ + ply_trace ("creating device nodes"); + + if (mknod ("./dev/root", 0600 | S_IFBLK, makedev (253, 0)) < 0) + return false; + + if (mknod ("./dev/null", 0600 | S_IFCHR, makedev (1, 3)) < 0) + return false; + + if (mknod ("./dev/console", 0600 | S_IFCHR, makedev (5, 1)) < 0) + return false; + + if (mknod ("./dev/tty", 0600 | S_IFCHR, makedev (5, 0)) < 0) + return false; + + if (mknod ("./dev/tty0", 0600 | S_IFCHR, makedev (4, 0)) < 0) + return false; + + if (mknod ("./dev/ptmx", 0600 | S_IFCHR, makedev (5, 2)) < 0) + return false; + + if (mknod ("./dev/fb", 0600 | S_IFCHR, makedev (29, 0)) < 0) + return false; + + ply_trace ("created device nodes"); + return true; +} + +static bool +mount_devpts_filesystem (state_t *state) +{ + ply_trace ("mounting devpts filesystem"); + if (mount ("none", PLY_WORKING_DIRECTORY "/dev/pts", "devpts", 0, + "gid=5,mode=620") < 0) + return false; + + open (PLY_WORKING_DIRECTORY "/dev/pts/.", O_RDWR); + + ply_trace ("mounted devpts filesystem"); + return true; +} + +static bool +copy_data_files (state_t *state) +{ + ply_trace ("copying data files"); + if (!ply_copy_directory ("/usr/share/plymouth", + "usr/share/plymouth")) + return false; + ply_trace ("copied data files"); + + ply_trace ("copying plugins"); + if (!ply_copy_directory ("/usr/lib/plymouth", + "usr/lib/plymouth")) + return false; + ply_trace ("copied plugins files"); + + return true; +} + +static void +ls (const char *path) +{ + DIR *dir; + struct dirent *entry; + static int level = 0; + + dir = opendir (path); + + if (dir == NULL) + return; + + if (level > 5) + return; + + int index = 0; + while ((entry = readdir (dir)) != NULL) + { + char *subdir; + + index++; + + if (index > 10) + break; + + subdir = NULL; + asprintf (&subdir, "%s/%s", path, entry->d_name); + ply_error ("%s ", subdir); + level++; + if (entry->d_name[0] != '.') + ls (subdir); + level--; + free (subdir); + } + + closedir (dir); +} + +static bool +initialize_environment (state_t *state) +{ + ply_trace ("initializing minimal work environment"); + if (!create_working_directory (state)) + return false; + + if (!create_device_nodes (state)) + return false; + + if (!copy_data_files (state)) + return false; + + if (!mount_proc_filesystem (state)) + return false; + + if (!mount_devpts_filesystem (state)) + return false; + + if (!change_to_working_directory (state)) + return false; + + ply_trace ("initialized minimal work environment"); + return true; +} + int main (int argc, char **argv) @@ -165,7 +389,29 @@ main (int argc, return EX_USAGE; } + ply_toggle_tracing (); + state.loop = ply_event_loop_new (); + + /* before do anything we need to make sure we have a working + * environment. /proc needs to be mounted and certain devices need + * to be accessible (like the framebuffer device, pseudoterminal + * devices, etc) + */ + if (!initialize_environment (&state)) + { + ply_error ("could not setup basic operating environment: %m"); + return EX_OSERR; + } + + state.session = spawn_session (&state, argv + 1); + + if (state.session == NULL) + { + ply_error ("could not run '%s': %m", argv[1]); + return EX_UNAVAILABLE; + } + state.boot_server = start_boot_server (&state); if (state.boot_server == NULL) @@ -183,14 +429,6 @@ main (int argc, return EX_UNAVAILABLE; } - state.session = spawn_session (&state, argv + 1); - - if (state.session == NULL) - { - ply_error ("could not run '%s': %m", argv[1]); - return EX_UNAVAILABLE; - } - exit_code = ply_event_loop_run (state.loop); ply_terminal_session_free (state.session); diff --git a/src/splash-plugins/fedora-fade-in/fedora-fade-in.c b/src/splash-plugins/fedora-fade-in/fedora-fade-in.c index ada73db..5ccec6b 100644 --- a/src/splash-plugins/fedora-fade-in/fedora-fade-in.c +++ b/src/splash-plugins/fedora-fade-in/fedora-fade-in.c @@ -41,10 +41,12 @@ #include "ply-boot-splash-plugin.h" #include "ply-event-loop.h" #include "ply-list.h" +#include "ply-logger.h" #include "ply-frame-buffer.h" #include "ply-image.h" #include "ply-utils.h" + #include <linux/kd.h> #ifndef FRAMES_PER_SECOND @@ -155,6 +157,7 @@ set_graphics_mode (ply_boot_splash_plugin_t *plugin) { assert (plugin != NULL); + return true; if (ioctl (plugin->console_fd, KDSETMODE, KD_GRAPHICS) < 0) return false; @@ -366,18 +369,23 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin) assert (plugin->logo_image != NULL); assert (plugin->frame_buffer != NULL); + ply_trace ("loading logo image"); if (!ply_image_load (plugin->logo_image)) return false; + ply_trace ("loading star image"); if (!ply_image_load (plugin->star_image)) return false; + ply_trace ("opening frame buffer"); if (!ply_frame_buffer_open (plugin->frame_buffer)) return false; + ply_trace ("opening console"); if (!open_console (plugin)) return false; + ply_trace ("settings graphics mode"); if (!set_graphics_mode (plugin)) { ply_save_errno (); @@ -391,6 +399,7 @@ show_splash_screen (ply_boot_splash_plugin_t *plugin) (ply_event_handler_t) on_interrupt, plugin); + ply_trace ("starting boot animation"); start_animation (plugin); return true; diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 3cc1429..7fc5eef 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -3,7 +3,7 @@ INCLUDES = \ -I$(srcdir)/.. \ -I$(srcdir)/../libply \ -I$(srcdir) -TESTS = +TESTS = include $(srcdir)/ply-boot-server-test.am include $(srcdir)/ply-boot-splash-test.am |
