| 
									
										
										
										
											2005-06-13 15:52:18 -07:00
										 |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include "slip_common.h"
 | 
					
						
							| 
									
										
										
										
											2012-10-08 03:27:32 +01:00
										 |  |  | #include <net_user.h>
 | 
					
						
							| 
									
										
										
										
											2005-06-13 15:52:18 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | int slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int i, n, size, start; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(slip->more > 0){ | 
					
						
							|  |  |  | 		i = 0; | 
					
						
							|  |  |  | 		while(i < slip->more){ | 
					
						
							|  |  |  | 			size = slip_unesc(slip->ibuf[i++], slip->ibuf, | 
					
						
							|  |  |  | 					  &slip->pos, &slip->esc); | 
					
						
							|  |  |  | 			if(size){ | 
					
						
							|  |  |  | 				memcpy(buf, slip->ibuf, size); | 
					
						
							|  |  |  | 				memmove(slip->ibuf, &slip->ibuf[i], | 
					
						
							|  |  |  | 					slip->more - i); | 
					
						
							|  |  |  | 				slip->more = slip->more - i; | 
					
						
							|  |  |  | 				return size; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		slip->more = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	n = net_read(fd, &slip->ibuf[slip->pos], | 
					
						
							|  |  |  | 		     sizeof(slip->ibuf) - slip->pos); | 
					
						
							|  |  |  | 	if(n <= 0) | 
					
						
							|  |  |  | 		return n; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	start = slip->pos; | 
					
						
							|  |  |  | 	for(i = 0; i < n; i++){ | 
					
						
							|  |  |  | 		size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos, | 
					
						
							|  |  |  | 				  &slip->esc); | 
					
						
							|  |  |  | 		if(size){ | 
					
						
							|  |  |  | 			memcpy(buf, slip->ibuf, size); | 
					
						
							|  |  |  | 			memmove(slip->ibuf, &slip->ibuf[start+i+1], | 
					
						
							|  |  |  | 				n - (i + 1)); | 
					
						
							|  |  |  | 			slip->more = n - (i + 1); | 
					
						
							|  |  |  | 			return size; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int actual, n; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	actual = slip_esc(buf, slip->obuf, len); | 
					
						
							|  |  |  | 	n = net_write(fd, slip->obuf, actual); | 
					
						
							|  |  |  | 	if(n < 0) | 
					
						
							|  |  |  | 		return n; | 
					
						
							|  |  |  | 	else return len; | 
					
						
							|  |  |  | } |