55 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			55 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;
 | 
						|
}
 |