1a3c77c67a443e631febf708bb0c376caede31657Jeff Dike#include <string.h>
2a3c77c67a443e631febf708bb0c376caede31657Jeff Dike#include "slip_common.h"
337185b33240870719b6b5913a46e6a441f1ae96fAl Viro#include <net_user.h>
4a3c77c67a443e631febf708bb0c376caede31657Jeff Dike
5a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeint slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip)
6a3c77c67a443e631febf708bb0c376caede31657Jeff Dike{
7a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	int i, n, size, start;
8a3c77c67a443e631febf708bb0c376caede31657Jeff Dike
9a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	if(slip->more > 0){
10a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		i = 0;
11a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		while(i < slip->more){
12a3c77c67a443e631febf708bb0c376caede31657Jeff Dike			size = slip_unesc(slip->ibuf[i++], slip->ibuf,
13a3c77c67a443e631febf708bb0c376caede31657Jeff Dike					  &slip->pos, &slip->esc);
14a3c77c67a443e631febf708bb0c376caede31657Jeff Dike			if(size){
15a3c77c67a443e631febf708bb0c376caede31657Jeff Dike				memcpy(buf, slip->ibuf, size);
16a3c77c67a443e631febf708bb0c376caede31657Jeff Dike				memmove(slip->ibuf, &slip->ibuf[i],
17a3c77c67a443e631febf708bb0c376caede31657Jeff Dike					slip->more - i);
18a3c77c67a443e631febf708bb0c376caede31657Jeff Dike				slip->more = slip->more - i;
19a3c77c67a443e631febf708bb0c376caede31657Jeff Dike				return size;
20a3c77c67a443e631febf708bb0c376caede31657Jeff Dike			}
21a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		}
22a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		slip->more = 0;
23a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	}
24a3c77c67a443e631febf708bb0c376caede31657Jeff Dike
25a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	n = net_read(fd, &slip->ibuf[slip->pos],
26a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		     sizeof(slip->ibuf) - slip->pos);
27a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	if(n <= 0)
28a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		return n;
29a3c77c67a443e631febf708bb0c376caede31657Jeff Dike
30a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	start = slip->pos;
31a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	for(i = 0; i < n; i++){
32a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos,
33a3c77c67a443e631febf708bb0c376caede31657Jeff Dike				  &slip->esc);
34a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		if(size){
35a3c77c67a443e631febf708bb0c376caede31657Jeff Dike			memcpy(buf, slip->ibuf, size);
36a3c77c67a443e631febf708bb0c376caede31657Jeff Dike			memmove(slip->ibuf, &slip->ibuf[start+i+1],
37a3c77c67a443e631febf708bb0c376caede31657Jeff Dike				n - (i + 1));
38a3c77c67a443e631febf708bb0c376caede31657Jeff Dike			slip->more = n - (i + 1);
39a3c77c67a443e631febf708bb0c376caede31657Jeff Dike			return size;
40a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		}
41a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	}
42a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	return 0;
43a3c77c67a443e631febf708bb0c376caede31657Jeff Dike}
44a3c77c67a443e631febf708bb0c376caede31657Jeff Dike
45a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeint slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip)
46a3c77c67a443e631febf708bb0c376caede31657Jeff Dike{
47a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	int actual, n;
48a3c77c67a443e631febf708bb0c376caede31657Jeff Dike
49a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	actual = slip_esc(buf, slip->obuf, len);
50a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	n = net_write(fd, slip->obuf, actual);
51a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	if(n < 0)
52a3c77c67a443e631febf708bb0c376caede31657Jeff Dike		return n;
53a3c77c67a443e631febf708bb0c376caede31657Jeff Dike	else return len;
54a3c77c67a443e631febf708bb0c376caede31657Jeff Dike}
55