Merge branch 'for-5.11/i2c-hid' into for-linus
[linux-2.6-microblaze.git] / arch / um / drivers / slip_common.c
1 // SPDX-License-Identifier: GPL-2.0
2 #include <string.h>
3 #include "slip_common.h"
4 #include <net_user.h>
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 }