diff options
author | kraxel <kraxel> | 2006-07-18 11:51:46 +0000 |
---|---|---|
committer | kraxel <kraxel> | 2006-07-18 11:51:46 +0000 |
commit | 12863fa56f630f0409c0bd4bfbcf3f164b6fca38 (patch) | |
tree | 72ad014b21f89f7c002197327a971f82bd36215b /xenscreen.c | |
parent | 0d797cb5c1fb803a9d8bd84f2100b3b3c3f094b8 (diff) | |
download | xenwatch-12863fa56f630f0409c0bd4bfbcf3f164b6fca38.tar.gz |
xenscreen tweaks
Diffstat (limited to 'xenscreen.c')
-rw-r--r-- | xenscreen.c | 46 |
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); } |