aboutsummaryrefslogtreecommitdiffstats
path: root/tools/misc/xencons
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2004-03-22 13:45:33 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2004-03-22 13:45:33 +0000
commit6c00e171dce67db88b8888f159c4eb78396366e5 (patch)
tree381ab5846881124393b54ced2858e89bfc5f1386 /tools/misc/xencons
parent3170a76e13e31f34970df503a3e67cdcf570bdef (diff)
downloadxen-6c00e171dce67db88b8888f159c4eb78396366e5.tar.gz
xen-6c00e171dce67db88b8888f159c4eb78396366e5.tar.bz2
xen-6c00e171dce67db88b8888f159c4eb78396366e5.zip
bitkeeper revision 1.816 (405eedfdtQSsv_FQddod4l3qGl-RuA)
xencons: new file Makefile, Xeno-HOWTO.txt, README.CD: Install an easily-accessible console terminal client program.
Diffstat (limited to 'tools/misc/xencons')
-rwxr-xr-xtools/misc/xencons85
1 files changed, 85 insertions, 0 deletions
diff --git a/tools/misc/xencons b/tools/misc/xencons
new file mode 100755
index 0000000000..b826c89dee
--- /dev/null
+++ b/tools/misc/xencons
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+##############################################
+# Console client for Xen guest OSes
+# Copyright (c) 2004, K A Fraser
+##############################################
+
+import errno, os, signal, socket, struct, sys
+
+from termios import *
+# Indexes into termios.tcgetattr() list.
+IFLAG = 0
+OFLAG = 1
+CFLAG = 2
+LFLAG = 3
+ISPEED = 4
+OSPEED = 5
+CC = 6
+
+def __child_death(signum, frame):
+ global stop
+ stop = True
+
+def __recv_from_sock(sock):
+ global stop
+ stop = False
+ while not stop:
+ try:
+ data = sock.recv(1)
+ os.write(1, data)
+ except socket.error, error:
+ if error[0] != errno.EINTR:
+ raise
+ os.wait()
+
+def __send_to_sock(sock):
+ while 1:
+ data = os.read(0,1)
+ if ord(data[0]) == ord(']')-64:
+ break
+ try:
+ sock.send(data)
+ except socket.error, error:
+ if error[0] == errno.EPIPE:
+ sys.exit(0)
+ if error[0] != errno.EINTR:
+ raise
+ sys.exit(0)
+
+def connect(host,port):
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
+ struct.pack('ii', 0, 0))
+ sock.connect((host,port))
+
+ oattrs = tcgetattr(0)
+ nattrs = tcgetattr(0)
+ nattrs[IFLAG] = nattrs[IFLAG] & ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON)
+ nattrs[OFLAG] = nattrs[OFLAG] & ~(OPOST)
+ nattrs[CFLAG] = nattrs[CFLAG] & ~(CSIZE | PARENB)
+ nattrs[CFLAG] = nattrs[CFLAG] | CS8
+ nattrs[LFLAG] = nattrs[LFLAG] & ~(ECHO | ICANON | IEXTEN | ISIG)
+ nattrs[CC][VMIN] = 1
+ nattrs[CC][VTIME] = 0
+
+ if os.fork():
+ signal.signal(signal.SIGCHLD, __child_death)
+ 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 *****************"
+ else:
+ signal.signal(signal.SIGPIPE, signal.SIG_IGN)
+ __send_to_sock(sock)
+
+if __name__ == '__main__':
+ if len(sys.argv) != 3:
+ print sys.argv[0] + " <host> <port>"
+ sys.exit(1)
+ connect(str(sys.argv[1]),int(sys.argv[2]))