Merge pull request #263 from BrendanSimon/list_port_name

list_ports: set default `name` attribute
diff --git a/examples/port_publisher.py b/examples/port_publisher.py
index f617875..eecc2a1 100755
--- a/examples/port_publisher.py
+++ b/examples/port_publisher.py
@@ -221,7 +221,7 @@
                     # escape outgoing data when needed (Telnet IAC (0xff) character)
                     if self.rfc2217:
                         data = serial.to_bytes(self.rfc2217.escape(data))
-                    self.buffer_ser2net += data
+                    self.buffer_ser2net.extend(data)
             else:
                 self.handle_serial_error()
         except Exception as msg:
@@ -250,13 +250,15 @@
             if data:
                 # Process RFC 2217 stuff when enabled
                 if self.rfc2217:
-                    data = serial.to_bytes(self.rfc2217.filter(data))
+                    data = b''.join(self.rfc2217.filter(data))
                 # add data to buffer
-                self.buffer_net2ser += data
+                self.buffer_net2ser.extend(data)
             else:
                 # empty read indicates disconnection
                 self.handle_disconnect()
         except socket.error:
+            if self.log is not None:
+                self.log.exception("{}: error reading...".format(self.device))
             self.handle_socket_error()
 
     def handle_socket_write(self):
@@ -267,6 +269,8 @@
             # and remove the sent data from the buffer
             self.buffer_ser2net = self.buffer_ser2net[count:]
         except socket.error:
+            if self.log is not None:
+                self.log.exception("{}: error writing...".format(self.device))
             self.handle_socket_error()
 
     def handle_socket_error(self):
diff --git a/serial/serialposix.py b/serial/serialposix.py
index afe5062..3ac6283 100644
--- a/serial/serialposix.py
+++ b/serial/serialposix.py
@@ -733,21 +733,28 @@
         if not self.is_open:
             raise portNotOpenError
         read = bytearray()
+        timeout = Timeout(self._timeout)
         poll = select.poll()
         poll.register(self.fd, select.POLLIN | select.POLLERR | select.POLLHUP | select.POLLNVAL)
+        poll.register(self.pipe_abort_read_r, select.POLLIN | select.POLLERR | select.POLLHUP | select.POLLNVAL)
         if size > 0:
             while len(read) < size:
                 # print "\tread(): size",size, "have", len(read)    #debug
                 # wait until device becomes ready to read (or something fails)
-                for fd, event in poll.poll(self._timeout * 1000):
+                for fd, event in poll.poll(None if timeout.is_infinite else (timeout.time_left() * 1000)):
+                    if fd == self.pipe_abort_read_r:
+                        break
                     if event & (select.POLLERR | select.POLLHUP | select.POLLNVAL):
                         raise SerialException('device reports error (poll)')
                     #  we don't care if it is select.POLLIN or timeout, that's
                     #  handled below
+                if fd == self.pipe_abort_read_r:
+                    os.read(self.pipe_abort_read_r, 1000)
+                    break
                 buf = os.read(self.fd, size - len(read))
                 read.extend(buf)
-                if ((self._timeout is not None and self._timeout >= 0) or
-                        (self._inter_byte_timeout is not None and self._inter_byte_timeout > 0)) and not buf:
+                if timeout.expired() \
+                        or (self._inter_byte_timeout is not None and self._inter_byte_timeout > 0) and not buf:
                     break   # early abort on timeout
         return bytes(read)
 
diff --git a/serial/tools/miniterm.py b/serial/tools/miniterm.py
index 88307c6..812f146 100644
--- a/serial/tools/miniterm.py
+++ b/serial/tools/miniterm.py
@@ -275,12 +275,12 @@
     """Print what is sent and received"""
 
     def rx(self, text):
-        sys.stderr.write(' [RX:{}] '.format(repr(text)))
+        sys.stderr.write(' [RX:{!r}] '.format(text))
         sys.stderr.flush()
         return text
 
     def tx(self, text):
-        sys.stderr.write(' [TX:{}] '.format(repr(text)))
+        sys.stderr.write(' [TX:{!r}] '.format(text))
         sys.stderr.flush()
         return text
 
@@ -612,7 +612,7 @@
         if new_filters:
             for f in new_filters:
                 if f not in TRANSFORMATIONS:
-                    sys.stderr.write('--- unknown filter: {}\n'.format(repr(f)))
+                    sys.stderr.write('--- unknown filter: {!r}\n'.format(f))
                     break
             else:
                 self.filters = new_filters
@@ -931,7 +931,7 @@
 
             serial_instance.open()
         except serial.SerialException as e:
-            sys.stderr.write('could not open port {}: {}\n'.format(repr(args.port), e))
+            sys.stderr.write('could not open port {!r}: {}\n'.format(args.port, e))
             if args.develop:
                 raise
             if not args.ask: