This should address the problems people are having now.
Wait a little bit for tty to appear. There is a race condition that
occurs after xend creates a domain. Since no event triggers consoled to
re-examine existing domains, we'll often not see the new pty by the time
we're here. Since consoled sleeps for 2 second periods, a 5 second
timeout should keep us covered.
A xenstore watch isn't much better since we don't want to block forever
if given an invalid domain or worse yes, a domain that someone else has
connected to.
Signed-off-by: Anthony Liguori
Regards,
Anthony Liguori
# HG changeset patch
# User Anthony Liguori <aliguori@xxxxxxxxxx>
# Node ID fe6c5ecea53aabedc6b53988da25910e108eafe9
# Parent 551870a55f240791695d30fd7fa92a1bf4e48387
Wait for domain tty to become available.
diff -r 551870a55f24 -r fe6c5ecea53a tools/console/client/main.c
--- a/tools/console/client/main.c Tue Aug 30 17:53:49 2005
+++ b/tools/console/client/main.c Tue Aug 30 22:01:01 2005
@@ -176,6 +176,7 @@
unsigned int len = 0;
struct xs_handle *xs;
char *end;
+ time_t now;
while((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) {
switch(ch) {
@@ -215,13 +216,37 @@
snprintf(path, sizeof(path), "/console/%d/tty", domid);
str_pty = xs_read(xs, path, &len);
+
/* FIXME consoled currently does not assume domain-0 doesn't have a
console which is good when we break domain-0 up. To keep us
user friendly, we'll bail out here since no data will ever show
up on domain-0. */
- if (domid == 0 || str_pty == NULL) {
+ if (domid == 0) {
err(errno, "Could not read tty from store");
}
+
+ /* FIXME wait a little bit for tty to appear. There is a race
+ condition that occurs after xend creates a domain. Since no event
+ triggers consoled to re-examine existing domains, we'll often not
+ see the new pty by the time we're here. Since consoled sleeps for
+ 2 second periods, a 5 second timeout should keep us covered.
+
+ A xenstore watch isn't much better since we don't want to block
+ forever if given an invalid domain or worse yes, a domain that
+ someone else has connected to. */
+
+ now = time(0);
+ while (str_pty == NULL && (now + 5) > time(0)) {
+ struct timeval tv = { 0, 500 };
+ select(0, NULL, NULL, NULL, &tv); /* pause briefly */
+
+ str_pty = xs_read(xs, path, &len);
+ }
+
+ if (str_pty == NULL) {
+ err(errno, "Could not read tty from store");
+ }
+
spty = open(str_pty, O_RDWR | O_NOCTTY);
if (spty == -1) {
err(errno, "Could not open tty `%s'", str_pty);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|