aboutsummaryrefslogtreecommitdiffstats
path: root/xenscreen.c
diff options
context:
space:
mode:
authorkraxel <kraxel>2006-07-18 11:51:46 +0000
committerkraxel <kraxel>2006-07-18 11:51:46 +0000
commit12863fa56f630f0409c0bd4bfbcf3f164b6fca38 (patch)
tree72ad014b21f89f7c002197327a971f82bd36215b /xenscreen.c
parent0d797cb5c1fb803a9d8bd84f2100b3b3c3f094b8 (diff)
downloadxenwatch-12863fa56f630f0409c0bd4bfbcf3f164b6fca38.tar.gz
xenscreen tweaks
Diffstat (limited to 'xenscreen.c')
-rw-r--r--xenscreen.c46
1 files changed, 22 insertions, 24 deletions
diff --git a/xenscreen.c b/xenscreen.c
index 7cd236d..0b9774f 100644
--- a/xenscreen.c
+++ b/xenscreen.c
@@ -33,7 +33,6 @@ static char *screen_rc = "/etc/xen/xenscreenrc";
static char *screen_unlink = NULL;
static char *screen_session = "xencon";
static char *screen_title = "mon";
-static char *screen_window = NULL;
static int screen_detached;
static int screen_logging;
static int screen_shell;
@@ -128,7 +127,15 @@ static int screen_command(char *arg0, ...)
return run_application_va(1, "screen", argv);
}
-static void try_attach_screen(struct dom *dom, int boot)
+static int screen_attach(char *window)
+{
+ return run_application(1, "screen", "screen",
+ "-S", screen_session, "-r", "-x",
+ "-p", window ? window : "=",
+ NULL);
+}
+
+static void try_attach_domain(struct dom *dom, int boot)
{
int rc;
@@ -240,7 +247,7 @@ int main(int argc, char *argv[])
fd_set set;
struct xs_handle *xenstore = NULL;
xs_transaction_t xst;
- char **vec = NULL;
+ char **vec = NULL, *window = NULL;
int domid, nac, c;
char path[BUFSIZE], value[BUFSIZE];
unsigned int count, i, rc;
@@ -261,7 +268,7 @@ int main(int argc, char *argv[])
screen_session = optarg;
break;
case 'p':
- screen_window = optarg;
+ window = optarg;
break;
case 'L':
screen_logging = 1;
@@ -305,10 +312,7 @@ int main(int argc, char *argv[])
/* not running inside screen */
if (!screen_detached) {
/* try to attach */
- rc = run_application(1, "screen", "screen",
- "-S", screen_session, "-r", "-x",
- "-p", screen_window ?: "=",
- NULL);
+ rc = screen_attach(window);
if (0 == rc)
exit(0);
} else {
@@ -321,17 +325,15 @@ int main(int argc, char *argv[])
}
}
- /* failing that, start a new screen session */
+ /* failing that, start a new screen session ... */
fprintf(stderr,"Starting new screen session \"%s\".\n", screen_session);
if (0 != access(screen_rc, R_OK))
builtin_screen_setup();
nav = malloc(sizeof(char*) * (argc + 16));
nac = 0;
nav[nac++] = "screen";
- if (screen_detached) {
- nav[nac++] = "-d";
- nav[nac++] = "-m";
- }
+ nav[nac++] = "-d";
+ nav[nac++] = "-m";
nav[nac++] = "-S";
nav[nac++] = screen_session;
nav[nac++] = "-c";
@@ -345,9 +347,11 @@ int main(int argc, char *argv[])
nav[nac++] = screen_unlink;
}
nav[nac++] = NULL;
- execvp(nav[0], nav);
- perror("execvp(screen)");
- exit(1);
+ rc = run_application_va(1, "screen", nav);
+ /* ... and attach if asked for */
+ if (0 == rc && !screen_detached)
+ rc = screen_attach(window);
+ exit(rc);
}
/* setup signal handler */
@@ -391,15 +395,9 @@ int main(int argc, char *argv[])
xenstore_read(xenstore, path, dom->name, sizeof(dom->name));
snprintf(path, sizeof(path), "/local/domain/%d/console/tty", domid);
xenstore_read(xenstore, path, dom->tty, sizeof(dom->tty));
- try_attach_screen(dom, 1);
+ try_attach_domain(dom, 1);
}
- if (!screen_window) {
- rc = screen_command("select", "0", NULL);
- rc = screen_command("windowlist", "-b", NULL);
- } else
- rc = screen_command("select", screen_window, NULL);
-
/* main loop */
fprintf(stderr,"ok, watching out for changes now\n");
for (;;) {
@@ -476,7 +474,7 @@ int main(int argc, char *argv[])
}
- try_attach_screen(dom, 0);
+ try_attach_domain(dom, 0);
try_release_domain(dom);
}