Subject: Re: NetBSD/Xen Howto
To: None <port-xen@NetBSD.org>
From: Jed Davis <jdev@panix.com>
List: port-xen
Date: 03/07/2006 19:54:51
--=-=-=
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

Manuel Bouyer <bouyer@antioche.eu.org> writes:

> On Tue, Mar 07, 2006 at 10:54:16PM +0100, Rainer Brinkmöller wrote:
>> 
>> >shutdown -p will cause the domain to shutdown and destroy once shutdown
>> >is complete.
>> >
>> At my environment not that way, that it brings me back to dom0.
>> It just stay at this message without the dom0 prompt.
>> So i have to use Ctrl + ]
>
> Any character will cause the console to exit. xm just fail to detect
> the other end of the socket has been closed until it tries to send
> something.

This is actually a bug in xentools that I found the other day; the
process that's reading goes into a loop on EOF instead of stopping.

I have an untidy patch that fixes this, and also introduces a new
feature where setting TERM=xencons_noescape in the environment
disables the ^] escape sequence, for use inside something like
conserver.  I'm attaching it in its current form so that, if I wind up
without time to clean it up, someone else can if they feel like it.

-- 
(let ((C call-with-current-continuation)) (apply (lambda (x y) (x y)) (map
((lambda (r) ((C C) (lambda (s) (r (lambda l (apply (s s) l))))))  (lambda
(f) (lambda (l) (if (null? l) C (lambda (k) (display (car l)) ((f (cdr l))
(C k)))))))    '((#\J #\d #\D #\v #\s) (#\e #\space #\a #\i #\newline)))))

--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=xencons-stuff.diff

--- xen/util/console_client.py	2005-08-03 19:57:58.000000000 -0400
+++ xen/util/console_client.py	2006-02-09 23:14:54.000000000 -0500
@@ -17,12 +17,22 @@
 OSPEED = 5
 CC     = 6
 
+doescape = True
+try:
+    if os.environ["TERM"] == "xencons_noescape":
+        doescape = False
+except:
+    pass
+
+kid_pid = False
+
 def __child_death(signum, frame):
-    global stop
+    global stop, kid_pid
     stop = True
+    kid_pid = False
 
 def __recv_from_sock(sock):
-    global stop
+    global stop, kid_pid
     stop = False
     while not stop:
         try:
@@ -31,14 +41,20 @@
             if error[0] != errno.EINTR:
                 raise
         else:
-            try:
-                os.write(1, data)
-            except os.error, error:
-                if error[0] != errno.EINTR:
-                    raise
+            if not data:
+                stop = True
+            else:
+                try:
+                    os.write(1, data)
+                except os.error, error:
+                    if error[0] != errno.EINTR:
+                        raise
+    if kid_pid:
+	os.kill(kid_pid, signal.SIGHUP)
     os.wait()
 
 def __send_to_sock(sock):
+    global doescape
     while 1:
         try:
             data = os.read(0,1024)
@@ -46,7 +62,7 @@
             if error[0] != errno.EINTR:
                 raise
         else:
-            if ord(data[0]) == ord(']')-64:
+            if doescape and ord(data[0]) == ord(']')-64:
                 break
             try:
                 sock.send(data)
@@ -58,6 +74,7 @@
     sys.exit(0)
 
 def connect(host,port):
+    global kid_pid
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
     sock.connect((host,port))
 
@@ -71,16 +88,18 @@
     nattrs[CC][VMIN] = 1
     nattrs[CC][VTIME] = 0
 
-    if os.fork():
+    kid_pid = os.fork()
+    if kid_pid:
         signal.signal(signal.SIGCHLD, __child_death)
-        print "************ REMOTE CONSOLE: CTRL-] TO QUIT ********"
+        if doescape: print "************ REMOTE CONSOLE: CTRL-] TO QUIT ********"
         tcsetattr(0, TCSAFLUSH, nattrs)
         try:
             __recv_from_sock(sock)
         finally:
             tcsetattr(0, TCSAFLUSH, oattrs)
-            print
-            print "************ REMOTE CONSOLE EXITED *****************"
+            if doescape:
+                print
+                print "************ REMOTE CONSOLE EXITED *****************"
     else:
         signal.signal(signal.SIGPIPE, signal.SIG_IGN)
         __send_to_sock(sock)

--=-=-=--