summaryrefslogtreecommitdiff
path: root/src/libply/ply-terminal-session.c
diff options
context:
space:
mode:
authorPeter Jones <pjones@redhat.com>2008-06-03 15:15:32 -0400
committerPeter Jones <pjones@pjones2.localdomain>2008-06-03 15:15:32 -0400
commitc65d9337c5032f8a7ede8cdc1c5d0b6869c02ba1 (patch)
tree2d9e51863e1e945fac352c6765d50094ec4a843d /src/libply/ply-terminal-session.c
parent4c1b2fc6b76d973fb816ccc4445cf9be2e075385 (diff)
Add ply_terminal_session_attach()
Make ply_terminal_session_new() not require argv.
Diffstat (limited to 'src/libply/ply-terminal-session.c')
-rw-r--r--src/libply/ply-terminal-session.c56
1 files changed, 50 insertions, 6 deletions
diff --git a/src/libply/ply-terminal-session.c b/src/libply/ply-terminal-session.c
index 2e179869..f305c421 100644
--- a/src/libply/ply-terminal-session.c
+++ b/src/libply/ply-terminal-session.c
@@ -126,16 +126,14 @@ ply_terminal_session_execute (ply_terminal_session_t *session,
}
ply_terminal_session_t *
-ply_terminal_session_new (const char * const *argv)
-
+ply_terminal_session_new (const char * const *argv)
{
ply_terminal_session_t *session;
- assert (argv != NULL);
- assert (argv[0] != NULL);
+ assert (argv == NULL || argv[0] != NULL);
session = calloc (1, sizeof (ply_terminal_session_t));
- session->argv = ply_copy_string_array (argv);
+ session->argv = argv == NULL ? NULL : ply_copy_string_array (argv);
session->terminal = ply_terminal_new ();
session->logger = ply_logger_new ();
session->is_running = false;
@@ -234,7 +232,7 @@ ply_terminal_session_run (ply_terminal_session_t *session,
ply_terminal_session_done_handler_t done_handler,
void *user_data)
{
- int pid;
+ pid_t pid;
bool run_in_parent, look_in_path, should_redirect_console;
assert (session != NULL);
@@ -306,6 +304,52 @@ ply_terminal_session_run (ply_terminal_session_t *session,
return false;
}
+bool
+ply_terminal_session_attach (ply_terminal_session_t *session,
+ ply_terminal_session_flags_t flags,
+ ply_terminal_session_output_handler_t output_handler,
+ ply_terminal_session_done_handler_t done_handler,
+ int ptmx,
+ void *user_data)
+{
+ bool should_redirect_console;
+
+ assert (session != NULL);
+ assert (session->loop != NULL);
+ assert (!session->is_running);
+ assert (session->done_handler == NULL);
+ assert (ptmx >= 0);
+
+ should_redirect_console =
+ (flags & PLY_TERMINAL_SESSION_FLAGS_REDIRECT_CONSOLE) != 0;
+
+ session->change_root_to_current_directory =
+ (flags & PLY_TERMINAL_SESSION_FLAGS_CHANGE_ROOT_TO_CURRENT_DIRECTORY) != 0;
+
+ ply_terminal_set_fd(session->terminal, ptmx);
+
+ 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");
+
+ session->is_running = true;
+ session->output_handler = output_handler;
+ session->done_handler = done_handler;
+ session->user_data = user_data;
+ ply_terminal_session_start_logging (session);
+
+ return true;
+}
+
int
ply_terminal_session_get_fd (ply_terminal_session_t *session)
{