Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/um/drivers/slip_common.c
10818 views
1
#include <string.h>
2
#include "slip_common.h"
3
#include "net_user.h"
4
5
int slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip)
6
{
7
int i, n, size, start;
8
9
if(slip->more > 0){
10
i = 0;
11
while(i < slip->more){
12
size = slip_unesc(slip->ibuf[i++], slip->ibuf,
13
&slip->pos, &slip->esc);
14
if(size){
15
memcpy(buf, slip->ibuf, size);
16
memmove(slip->ibuf, &slip->ibuf[i],
17
slip->more - i);
18
slip->more = slip->more - i;
19
return size;
20
}
21
}
22
slip->more = 0;
23
}
24
25
n = net_read(fd, &slip->ibuf[slip->pos],
26
sizeof(slip->ibuf) - slip->pos);
27
if(n <= 0)
28
return n;
29
30
start = slip->pos;
31
for(i = 0; i < n; i++){
32
size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos,
33
&slip->esc);
34
if(size){
35
memcpy(buf, slip->ibuf, size);
36
memmove(slip->ibuf, &slip->ibuf[start+i+1],
37
n - (i + 1));
38
slip->more = n - (i + 1);
39
return size;
40
}
41
}
42
return 0;
43
}
44
45
int slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip)
46
{
47
int actual, n;
48
49
actual = slip_esc(buf, slip->obuf, len);
50
n = net_write(fd, slip->obuf, actual);
51
if(n < 0)
52
return n;
53
else return len;
54
}
55
56