 a3c77c67a4
			
		
	
	
	a3c77c67a4
	
	
	
		
			
			This patch merges a lot of duplicated code in the slip and slirp drivers, abstracts out the slip protocol, and makes the slip driver work in 2.6. Signed-off-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
		
			
				
	
	
		
			54 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <string.h>
 | |
| #include "slip_common.h"
 | |
| #include "net_user.h"
 | |
| 
 | |
| 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;
 | |
| }
 |