static gboolean gvir_sandbox_console_raw_attach(GVirSandboxConsole *console, GUnixInputStream *localStdin, GUnixOutputStream *localStdout, GUnixOutputStream *localStderr, GError **error) { GVirSandboxConsoleRawPrivate *priv = GVIR_SANDBOX_CONSOLE_RAW(console)->priv; gboolean ret = FALSE; if (priv->attached) { g_set_error(error, GVIR_SANDBOX_CONSOLE_RAW_ERROR, 0, "%s", _("Console is already attached to a stream")); return FALSE; } if (localStdin && !gvir_sandbox_console_raw_start_term(GVIR_SANDBOX_CONSOLE_RAW(console), localStdin, error)) return FALSE; priv->localStdin = localStdin ? g_object_ref(localStdin) : NULL; priv->localStdout = localStdout ? g_object_ref(localStdout) : NULL; priv->localStderr = g_object_ref(localStderr); if (!gvir_sandbox_console_open_remote(GVIR_SANDBOX_CONSOLE_RAW(console), error)) goto cleanup; priv->consoleToLocalLength = 4096; priv->consoleToLocal = g_new0(gchar, priv->consoleToLocalLength); if (localStdin) { priv->localToConsoleLength = 4096; priv->localToConsole = g_new0(gchar, priv->localToConsoleLength); } priv->attached = TRUE; do_console_raw_update_events(GVIR_SANDBOX_CONSOLE_RAW(console)); ret = TRUE; cleanup: if (!ret && localStdin) gvir_sandbox_console_raw_stop_term(GVIR_SANDBOX_CONSOLE_RAW(console), localStdin, NULL); return ret; }
static gboolean gvir_sandbox_console_raw_attach(GVirSandboxConsole *console, GUnixInputStream *localStdin, GUnixOutputStream *localStdout, GUnixOutputStream *localStderr, GError **error) { GVirSandboxConsoleRawPrivate *priv = GVIR_SANDBOX_CONSOLE_RAW(console)->priv; gboolean ret = FALSE; GVirConnection *conn = NULL; GVirDomain *dom = NULL; gchar *devname = NULL; if (priv->console) { g_set_error(error, GVIR_SANDBOX_CONSOLE_RAW_ERROR, 0, "%s", _("Console is already attached to a stream")); return FALSE; } if (localStdin && !gvir_sandbox_console_raw_start_term(GVIR_SANDBOX_CONSOLE_RAW(console), localStdin, error)) return FALSE; priv->localStdin = localStdin ? g_object_ref(localStdin) : NULL; priv->localStdout = localStdout ? g_object_ref(localStdout) : NULL; priv->localStderr = g_object_ref(localStderr); g_object_get(console, "connection", &conn, "domain", &dom, "devname", &devname, NULL); priv->console = gvir_connection_get_stream(conn, 0); if (!gvir_domain_open_console(dom, priv->console, devname, 0, error)) goto cleanup; priv->consoleToLocalLength = 4096; priv->consoleToLocal = g_new0(gchar, priv->consoleToLocalLength); if (localStdin) { priv->localToConsoleLength = 4096; priv->localToConsole = g_new0(gchar, priv->localToConsoleLength); } do_console_raw_update_events(GVIR_SANDBOX_CONSOLE_RAW(console)); ret = TRUE; cleanup: if (!ret && localStdin) gvir_sandbox_console_raw_stop_term(GVIR_SANDBOX_CONSOLE_RAW(console), localStdin, NULL); if (conn) g_object_unref(conn); if (dom) g_object_unref(dom); g_free(devname); return ret; }