aboutsummaryrefslogtreecommitdiffstats
path: root/xenscreen.c
diff options
context:
space:
mode:
authorkraxel <kraxel>2006-07-03 14:27:24 +0000
committerkraxel <kraxel>2006-07-03 14:27:24 +0000
commit541f6b989347c819bcedcd4ee4e9dd47acd19dfa (patch)
treee6bb85d4b10446ba23247c702d975664c2c3dd68 /xenscreen.c
parentbad7d2ac304d1844ae75d988aa3a61efada4c5f9 (diff)
downloadxenwatch-541f6b989347c819bcedcd4ee4e9dd47acd19dfa.tar.gz
screen window switching tweaks
Diffstat (limited to 'xenscreen.c')
-rw-r--r--xenscreen.c77
1 files changed, 50 insertions, 27 deletions
diff --git a/xenscreen.c b/xenscreen.c
index 3ad5868..c8cbad0 100644
--- a/xenscreen.c
+++ b/xenscreen.c
@@ -13,7 +13,8 @@
/* ------------------------------------------------------------- */
-#define BUFSIZE 64
+#define BUFSIZE 64
+#define PRE_STATE "%16s: "
struct dom {
int domid;
@@ -26,8 +27,8 @@ struct dom {
static LIST_HEAD(doms);
static int domcnt;
-static char *screenrc = "/etc/xen/xenscreenrc";
-//static char *screenrc = "/home/kraxel/projects/xenwatch/xenscreenrc";
+//static char *screenrc = "/etc/xen/xenscreenrc";
+static char *screenrc = "/home/kraxel/projects/xenwatch/xenscreenrc";
static char *screen_session = "xencon";
static char *screen_title = "watch";
@@ -69,7 +70,7 @@ static void catchsig(int sig)
termsig = sig;
}
-static void try_attach_screen(struct dom *dom)
+static void try_attach_screen(struct dom *dom, int boot)
{
int rc;
@@ -80,8 +81,8 @@ static void try_attach_screen(struct dom *dom)
if (!strlen(dom->tty))
return;
- fprintf(stderr," conn: %s (%d) @ %s\n",
- dom->name, dom->domid, dom->tty);
+ fprintf(stderr, PRE_STATE "%s (%d) @ %s\n",
+ "connecting", dom->name, dom->domid, dom->tty);
if (0 != access(dom->tty, R_OK)) {
fprintf(stderr, " error: no access to tty %s\n", dom->tty);
@@ -106,10 +107,11 @@ static void try_attach_screen(struct dom *dom)
* Better would be to not switch in the first place,
* seems screen can't do that though :-(
*/
- rc = run_application(1, "screen", "screen",
- "-X", "-S", screen_session,
- "other",
- NULL);
+ if (!boot)
+ rc = run_application(1, "screen", "screen",
+ "-X", "-S", screen_session,
+ "other",
+ NULL);
#endif
dom->connected = 1;
@@ -120,8 +122,8 @@ static void try_release_domain(struct dom *dom)
{
if (!dom->destroyed)
return;
- fprintf(stderr," gone: %s (%d)%s\n", dom->name, dom->domid,
- dom->connected ? " [conn]" : "");
+ fprintf(stderr, PRE_STATE "%s (%d)%s\n", "disappeared",
+ dom->name, dom->domid, dom->connected ? " [conn]" : "");
if (dom->connected)
domcnt--;
list_del(&dom->next);
@@ -157,18 +159,27 @@ int main(int argc, char *argv[])
if (0 == rc)
exit(0);
/* failing that, start a new screen session */
- rc = run_application(1,"screen", "screen",
- "-d", "-m",
- "-S", screen_session,
- "-c", screenrc,
- "-t", screen_title, argv[0],
- NULL);
+ if (0 != access(screenrc, R_OK))
+ screenrc = "/dev/null";
execlp("screen", "screen",
"-S", screen_session,
- "-r", "-p", "=",
+ "-c", screenrc,
+ "-t", screen_title, argv[0],
NULL);
perror("execlp(screen)");
exit(1);
+
+ } else if (0 != access(screenrc, R_OK)) {
+ /* no screenrc: minimum setup (status line only) */
+ rc = run_application(1, "screen", "screen",
+ "-X", "-S", screen_session,
+ "sorendition", "=s", "wb",
+ NULL);
+ rc = run_application(1, "screen", "screen",
+ "-X", "-S", screen_session,
+ "hardstatus", "lastline",
+ "%{=b bw} xen |%{-} %-w%{= yb} %50>%n* %t %{-}%+w%<",
+ NULL);
}
/* setup signal handler */
@@ -201,7 +212,7 @@ int main(int argc, char *argv[])
vec = xs_directory(xenstore, xst, "/local/domain", &count);
xs_transaction_end(xenstore, xst, 0);
- fprintf(stderr,"looking for existing domains ...\n");
+ fprintf(stderr,"looking for existing domains\n");
for (i = 0; i < count; i++) {
domid = atoi(vec[i]);
dom = get_dom(domid);
@@ -209,11 +220,19 @@ 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);
+ try_attach_screen(dom, 1);
}
+ rc = run_application(1, "screen", "screen",
+ "-X", "-S", screen_session,
+ "select", "0",
+ NULL);
+ rc = run_application(1, "screen", "screen",
+ "-X", "-S", screen_session,
+ "windowlist", "-b",
+ NULL);
/* main loop */
- fprintf(stderr,"... done, watching out for new changes now.\n");
+ fprintf(stderr,"ok, watching out for changes now\n");
for (;;) {
if (termsig) {
if (!domcnt)
@@ -222,9 +241,13 @@ int main(int argc, char *argv[])
break;
fprintf(stderr,
"\n"
- "Still %d domain(s) active - not quitting.\n"
- "Better try detach instead (Ctrl-A d).\n"
- "Hit Ctrl-C within 3 secs again to quit nevertheless.\n"
+ "Got ^C - still %d domain(s) active - not quitting.\n"
+ "\n"
+ "You should better use detach instead (^A d).\n"
+ "Or kill all windows (^A \\) if you don't want\n"
+ "keep screen hanging around.\n"
+ "\n"
+ "Hit ^C within 3 secs again to quit nevertheless.\n"
"\n",
domcnt);
last_ctrl_c = time(NULL);
@@ -277,14 +300,14 @@ int main(int argc, char *argv[])
if (0 != rc)
continue;
strcpy(dom->name, value);
- fprintf(stderr," boot: %s (%d)\n", dom->name, dom->domid);
+ fprintf(stderr, PRE_STATE "%s (%d)\n", "new domain", dom->name, dom->domid);
} else {
continue;
}
- try_attach_screen(dom);
+ try_attach_screen(dom, 0);
try_release_domain(dom);
}
return 0;