diff options
| author | Ray Strode <rstrode@redhat.com> | 2008-06-03 22:58:01 -0400 |
|---|---|---|
| committer | Ray Strode <rstrode@redhat.com> | 2008-06-03 22:58:01 -0400 |
| commit | 459b8cc09ae362637df47a592f476143a50131c3 (patch) | |
| tree | b6de74b6e6f8e8160db8dff1c856a5afa818a223 /src | |
| parent | 25507b1cf42df9fa1e812a606f3f5effe359054b (diff) | |
| download | plymouth-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.c | 60 | ||||
| -rw-r--r-- | src/libply/ply-utils.h | 7 | ||||
| -rw-r--r-- | src/main.c | 18 |
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 */ @@ -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; } |
