def __init__(self, device_name): self.ack_format = "3s" self.ack_msg = "ACK" self.hi_format = "2s" self.hi_msg = "HI" if self.is_windows: vport_name = '\\\\.\\Global\\' + device_name from windows_support import WinBufferedReadFile self._vport = WinBufferedReadFile(vport_name) else: vport_name = '/dev/virtio-ports/' + device_name self._vport = os.open(vport_name, os.O_RDWR)
class VirtIoChannel: # Python on Windows 7 return 'Microsoft' rather than 'Windows' as documented. is_windows = ((platform.system() == 'Windows') or (platform.system() == 'Microsoft')) def __init__(self, vport_name): if self.is_windows: from windows_support import WinBufferedReadFile self._vport = WinBufferedReadFile(vport_name) else: self._vport = os.open(vport_name, os.O_RDWR) def read(self): size = self._read_header() if self.is_windows: rest = self._vport.read(size) else: rest = os.read(self._vport, size) # TODO: concat message? handle NULL terminated string? cmd = struct.unpack("%ds" % len(rest), rest)[0] return cmd def write(self, message, arg=''): if type(message) != int: raise TypeError("1nd arg must be a known message type.") if type(arg) != str: raise TypeError("2nd arg must be a string.") stream = self._pack_message(message, arg) if self.is_windows: self._vport.write(stream) else: os.write(self._vport, stream) def _read_header(self): if self.is_windows: hdr = self._vport.read(READ_HEADER_LEN) else: hdr = os.read(self._vport, (READ_HEADER_LEN)) if hdr == '': return 0 return socket.ntohl(struct.unpack(READ_HEADER, hdr)[2]) - READ_HEADER_LEN def _pack_message(self, message, arg): size = WRITE_HEADER_LEN + len(arg) stream = struct.pack(WRITE_HEADER + "%ds" % len(arg), socket.htonl(1), socket.htonl(3), socket.htonl(size), socket.htonl(message), arg) return stream
class VirtIoChannel: # Python on Windows 7 return 'Microsoft' rather than 'Windows' as documented. is_windows = (platform.system() == 'Windows') or (platform.system() == 'Microsoft') def __init__(self, device_name): self.ack_format = "3s" self.ack_msg = "ACK" self.hi_format = "2s" self.hi_msg = "HI" if self.is_windows: vport_name = '\\\\.\\Global\\' + device_name from windows_support import WinBufferedReadFile self._vport = WinBufferedReadFile(vport_name) else: vport_name = '/dev/virtio-ports/' + device_name self._vport = os.open(vport_name, os.O_RDWR) def close(self): if self.is_windows: self._vport.close() else: os.close(self._vport) def receive(self, size): if self.is_windows: txt = self._vport.read(size) else: txt = os.read(self._vport, size) return txt def send(self, message): if self.is_windows: self._vport.write(message) else: os.write(self._vport, message) def shake_hand(self, size=0, action="receive"): hi_msg_len = struct.calcsize(self.hi_format) ack_msg_len = struct.calcsize(self.ack_format) if action == "send": self.send(self.hi_msg) txt = self.receive(hi_msg_len) out = struct.unpack(self.hi_format, txt)[0] if out != "HI": raise ShakeHandError("Fail to get HI from guest.") size_s = struct.pack("q", size) self.send(size_s) txt = self.receive(ack_msg_len) ack_str = struct.unpack(self.ack_format, txt)[0] if ack_str != self.ack_msg: raise "Guest did not ACK the file size message." return size elif action == "receive": txt = self.receive(hi_msg_len) hi_str = struct.unpack(self.hi_format, txt)[0] if hi_str != self.hi_msg: raise ShakeHandError("Fail to get HI from guest.") self.send(txt) size = self.receive(8) print("xxxx size = %s" % size) if size: size = struct.unpack("q", size)[0] txt = struct.pack(self.ack_format, self.ack_msg) self.send(txt) return size
class VirtIoChannel: # Python on Windows 7 return 'Microsoft' rather than 'Windows' as documented. is_windows = (platform.system() == 'Windows') or ( platform.system() == 'Microsoft') def __init__(self, device_name): self.ack_format = "3s" self.ack_msg = "ACK" self.hi_format = "2s" self.hi_msg = "HI" if self.is_windows: vport_name = '\\\\.\\Global\\' + device_name from windows_support import WinBufferedReadFile self._vport = WinBufferedReadFile(vport_name) else: vport_name = '/dev/virtio-ports/' + device_name self._vport = os.open(vport_name, os.O_RDWR) def close(self): if self.is_windows: self._vport.close() else: os.close(self._vport) def receive(self, size): if self.is_windows: txt = self._vport.read(size) else: txt = os.read(self._vport, size) return txt def send(self, message): if self.is_windows: self._vport.write(message) else: os.write(self._vport, message) def shake_hand(self, size=0, action="receive"): hi_msg_len = struct.calcsize(self.hi_format) ack_msg_len = struct.calcsize(self.ack_format) if action == "send": self.send(self.hi_msg) txt = self.receive(hi_msg_len) out = struct.unpack(self.hi_format, txt)[0] if out != "HI": raise ShakeHandError("Fail to get HI from guest.") size_s = struct.pack("q", size) self.send(size_s) txt = self.receive(ack_msg_len) ack_str = struct.unpack(self.ack_format, txt)[0] if ack_str != self.ack_msg: raise "Guest did not ACK the file size message." return size elif action == "receive": txt = self.receive(hi_msg_len) hi_str = struct.unpack(self.hi_format, txt)[0] if hi_str != self.hi_msg: raise ShakeHandError("Fail to get HI from guest.") self.send(txt) size = self.receive(8) print("xxxx size = %s" % size) if size: size = struct.unpack("q", size)[0] txt = struct.pack(self.ack_format, self.ack_msg) self.send(txt) return size
def __init__(self, vport_name): if self.is_windows: from windows_support import WinBufferedReadFile self._vport = WinBufferedReadFile(vport_name) else: self._vport = os.open(vport_name, os.O_RDWR)