summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2008-06-03 22:58:01 -0400
committerRay Strode <rstrode@redhat.com>2008-06-03 22:58:01 -0400
commit459b8cc09ae362637df47a592f476143a50131c3 (patch)
treeb6de74b6e6f8e8160db8dff1c856a5afa818a223 /src
parent25507b1cf42df9fa1e812a606f3f5effe359054b (diff)
downloadplymouth-459b8cc09ae362637df47a592f476143a50131c3.tar.gz
plymouth-459b8cc09ae362637df47a592f476143a50131c3.tar.xz
plymouth-459b8cc09ae362637df47a592f476143a50131c3.zip
Daemonize after starting boot server
Previously we would daemonize when spawning the terminal session. We don't do that now, since we attach to an existing already running terminal session.
Diffstat (limited to 'src')
-rw-r--r--src/libply/ply-utils.c60
-rw-r--r--src/libply/ply-utils.h7
-rw-r--r--src/main.c18
3 files changed, 85 insertions, 0 deletions
diff --git a/src/libply/ply-utils.c b/src/libply/ply-utils.c
index 4e02fba..1f0ce22 100644
--- a/src/libply/ply-utils.c
+++ b/src/libply/ply-utils.c
@@ -984,4 +984,64 @@ ply_unmount_filesystem (const char *directory)
return true;
}
+ply_daemon_handle_t *
+ply_create_daemon (void)
+{
+ pid_t pid;
+ int sender_fd, receiver_fd;
+ int *handle;
+
+ if (!ply_open_unidirectional_pipe (&sender_fd, &receiver_fd))
+ return NULL;
+
+ handle = calloc (1, sizeof (int));
+
+ pid = fork ();
+
+ if (pid < 0)
+ return NULL;
+
+ if (pid != 0)
+ {
+ uint8_t byte;
+ close (sender_fd);
+
+ if (!ply_read (receiver_fd, &byte, sizeof (uint8_t)))
+ {
+ ply_error ("could not read byte from child: %m");
+ _exit (1);
+ }
+
+ _exit ((int) byte);
+ }
+ close (receiver_fd);
+
+ *handle = sender_fd;
+
+ return (ply_daemon_handle_t *) handle;
+}
+
+bool
+ply_detach_daemon (ply_daemon_handle_t *handle,
+ int exit_code)
+{
+ int sender_fd;
+ uint8_t byte;
+
+ assert (handle != NULL);
+ assert (exit_code >= 0 && exit_code < 256);
+
+ sender_fd = *(int *) handle;
+
+ byte = (uint8_t) exit_code;
+
+ if (!ply_write (sender_fd, &byte, sizeof (uint8_t)))
+ return false;
+
+ close (sender_fd);
+ free (handle);
+
+ return true;
+}
+
/* vim: set ts=4 sw=4 expandtab autoindent cindent cino={.5s,(0: */
diff --git a/src/libply/ply-utils.h b/src/libply/ply-utils.h
index 3e2265a..e9803c9 100644
--- a/src/libply/ply-utils.h
+++ b/src/libply/ply-utils.h
@@ -41,6 +41,8 @@
typedef intptr_t ply_module_handle_t;
typedef void (* ply_module_function_t) (void);
+typedef intptr_t ply_daemon_handle_t;
+
#ifndef PLY_HIDE_FUNCTION_DECLARATIONS
bool ply_open_unidirectional_pipe (int *sender_fd,
int *receiver_fd);
@@ -86,6 +88,11 @@ int ply_detach_directory (const char *directory);
bool ply_copy_file (const char *source, const char *destination);
bool ply_copy_directory (const char *source, const char *destination);
bool ply_unmount_filesystem (const char *directory);
+
+ply_daemon_handle_t *ply_create_daemon (void);
+bool ply_detach_daemon (ply_daemon_handle_t *handle,
+ int exit_code);
+
#endif
#endif /* PLY_UTILS_H */
diff --git a/src/main.c b/src/main.c
index c2c7b8d..52d8034 100644
--- a/src/main.c
+++ b/src/main.c
@@ -568,6 +568,7 @@ main (int argc,
};
int exit_code;
bool attach_to_session = false;
+ ply_daemon_handle_t *daemon_handle;
if (argc >= 2 && !strcmp(argv[1], "--attach-to-session"))
attach_to_session = true;
@@ -588,6 +589,14 @@ main (int argc,
return EX_USAGE;
}
+ daemon_handle = ply_create_daemon ();
+
+ if (daemon_handle == NULL)
+ {
+ ply_error ("cannot daemonize: %m");
+ return EX_UNAVAILABLE;
+ }
+
state.loop = ply_event_loop_new ();
/* before do anything we need to make sure we have a working
@@ -599,6 +608,7 @@ main (int argc,
{
ply_error ("could not setup basic operating environment: %m");
ply_list_directory (PLY_WORKING_DIRECTORY);
+ ply_detach_daemon (daemon_handle, EX_OSERR);
return EX_OSERR;
}
@@ -611,6 +621,7 @@ main (int argc,
if (state.session == NULL)
{
ply_error ("could not create session: %m");
+ ply_detach_daemon (daemon_handle, EX_UNAVAILABLE);
return EX_UNAVAILABLE;
}
}
@@ -620,6 +631,13 @@ main (int argc,
if (state.boot_server == NULL)
{
ply_error ("could not log bootup: %m");
+ ply_detach_daemon (daemon_handle, EX_UNAVAILABLE);
+ return EX_UNAVAILABLE;
+ }
+
+ if (!ply_detach_daemon (daemon_handle, 0))
+ {
+ ply_error ("could not tell parent to exit: %m");
return EX_UNAVAILABLE;
}