summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2007-06-21 09:51:32 -0400
committerRay Strode <rstrode@redhat.com>2007-06-21 09:51:32 -0400
commitab9f3e9667f1d70ff957c6d5795928499b3efcb3 (patch)
tree8dda4aeed4fa0b75381976c6a2e8895d49e7d3f8 /src
parent1c243bdf2dd8f2f3fc2ea0b78e84314cdf28d456 (diff)
downloadplymouth-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.c27
-rw-r--r--src/libply/ply-terminal-session.h5
-rw-r--r--src/libply/ply-terminal.c9
-rw-r--r--src/libply/ply-utils.c21
-rw-r--r--src/libply/tests/Makefile.am2
-rw-r--r--src/libply/tests/ply-terminal-test.am2
-rw-r--r--src/main.c256
-rw-r--r--src/splash-plugins/fedora-fade-in/fedora-fade-in.c9
-rw-r--r--src/tests/Makefile.am2
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 \
diff --git a/src/main.c b/src/main.c
index 14dda58..b612a47 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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