diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2004-03-22 13:45:33 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2004-03-22 13:45:33 +0000 |
commit | 6c00e171dce67db88b8888f159c4eb78396366e5 (patch) | |
tree | 381ab5846881124393b54ced2858e89bfc5f1386 /tools/misc | |
parent | 3170a76e13e31f34970df503a3e67cdcf570bdef (diff) | |
download | xen-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')
-rw-r--r-- | tools/misc/Makefile | 3 | ||||
-rwxr-xr-x | tools/misc/xencons | 85 |
2 files changed, 87 insertions, 1 deletions
diff --git a/tools/misc/Makefile b/tools/misc/Makefile index 3db1b76fc0..c572e6d9a4 100644 --- a/tools/misc/Makefile +++ b/tools/misc/Makefile @@ -10,7 +10,8 @@ OBJS = $(patsubst %.c,%.o,$(SRCS)) TARGETS = xen_cpuperf -INSTALL = $(TARGETS) xen-mkdevnodes xen_nat_enable xen-clone xen_dmesg.py +INSTALL = $(TARGETS) xen-mkdevnodes xen_nat_enable xen-clone +INSTALL += xen_dmesg.py xencons all: $(TARGETS) $(MAKE) -C miniterm 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])) |