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