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)
예제 #2
0
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
예제 #3
0
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
 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, 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
예제 #7
0
 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 __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)