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 } 56