| 
					
				 | 
			
			
				@@ -197,7 +197,7 @@ void serial_communicate(struct serial_device *port, int infd, int outfd) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   FD_ZERO(&write_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   FD_ZERO(&except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   FD_SET(port->fd, &read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  FD_SET(infd, &read_set);; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  FD_SET(infd, &read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   FD_SET(port->fd, &except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   FD_SET(infd, &except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   FD_SET(outfd, &except_set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -221,36 +221,41 @@ void serial_communicate(struct serial_device *port, int infd, int outfd) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       n = write(port->fd, buf, n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       ringbuf_move(&port->out_buf, n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FD_ZERO(&read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FD_ZERO(&write_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FD_ZERO(&except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FD_SET(port->fd, &read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FD_SET(infd, &read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FD_SET(port->fd, &except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FD_SET(infd, &except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    FD_SET(outfd, &except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(FD_ISSET(infd, &read_set)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       bytes = sizeof(port->out_buf.data) - port->out_buf.size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if(bytes>0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	n = read(infd, buf, bytes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if(n==0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	ringbuf_append(&port->out_buf, buf, n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	FD_CLR(infd, &read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      FD_SET(port->fd, &write_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(FD_ISSET(port->fd, &read_set)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      bytes = sizeof(port->in_buf.data) - port->out_buf.size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      bytes = sizeof(port->in_buf.data) - port->in_buf.size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if(bytes>0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	n = read(infd, buf, bytes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	ringbuf_append(&port->out_buf, buf, n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	FD_CLR(port->fd, &read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      FD_SET(outfd, &write_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	n = read(port->fd, buf, bytes); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if(n==0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	ringbuf_append(&port->in_buf, buf, n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FD_ZERO(&write_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FD_ZERO(&read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FD_ZERO(&except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FD_SET(port->fd, &read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FD_SET(infd, &read_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FD_SET(port->fd, &except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FD_SET(infd, &except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    FD_SET(outfd, &except_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if(port->in_buf.size>0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      FD_SET(outfd, &write_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if(port->out_buf.size>0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      FD_SET(port->fd, &write_set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -332,6 +337,7 @@ void ringbuf_move(struct ring_buf *buf, unsigned int bytes) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(p>=sizeof(buf->data)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       p -= sizeof(buf->data); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     buf->start = p; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    buf->size -= bytes; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |