18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <string.h> 38c2ecf20Sopenharmony_ci#include "slip_common.h" 48c2ecf20Sopenharmony_ci#include <net_user.h> 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ciint slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip) 78c2ecf20Sopenharmony_ci{ 88c2ecf20Sopenharmony_ci int i, n, size, start; 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci if(slip->more > 0){ 118c2ecf20Sopenharmony_ci i = 0; 128c2ecf20Sopenharmony_ci while(i < slip->more){ 138c2ecf20Sopenharmony_ci size = slip_unesc(slip->ibuf[i++], slip->ibuf, 148c2ecf20Sopenharmony_ci &slip->pos, &slip->esc); 158c2ecf20Sopenharmony_ci if(size){ 168c2ecf20Sopenharmony_ci memcpy(buf, slip->ibuf, size); 178c2ecf20Sopenharmony_ci memmove(slip->ibuf, &slip->ibuf[i], 188c2ecf20Sopenharmony_ci slip->more - i); 198c2ecf20Sopenharmony_ci slip->more = slip->more - i; 208c2ecf20Sopenharmony_ci return size; 218c2ecf20Sopenharmony_ci } 228c2ecf20Sopenharmony_ci } 238c2ecf20Sopenharmony_ci slip->more = 0; 248c2ecf20Sopenharmony_ci } 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci n = net_read(fd, &slip->ibuf[slip->pos], 278c2ecf20Sopenharmony_ci sizeof(slip->ibuf) - slip->pos); 288c2ecf20Sopenharmony_ci if(n <= 0) 298c2ecf20Sopenharmony_ci return n; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci start = slip->pos; 328c2ecf20Sopenharmony_ci for(i = 0; i < n; i++){ 338c2ecf20Sopenharmony_ci size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos, 348c2ecf20Sopenharmony_ci &slip->esc); 358c2ecf20Sopenharmony_ci if(size){ 368c2ecf20Sopenharmony_ci memcpy(buf, slip->ibuf, size); 378c2ecf20Sopenharmony_ci memmove(slip->ibuf, &slip->ibuf[start+i+1], 388c2ecf20Sopenharmony_ci n - (i + 1)); 398c2ecf20Sopenharmony_ci slip->more = n - (i + 1); 408c2ecf20Sopenharmony_ci return size; 418c2ecf20Sopenharmony_ci } 428c2ecf20Sopenharmony_ci } 438c2ecf20Sopenharmony_ci return 0; 448c2ecf20Sopenharmony_ci} 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ciint slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci int actual, n; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci actual = slip_esc(buf, slip->obuf, len); 518c2ecf20Sopenharmony_ci n = net_write(fd, slip->obuf, actual); 528c2ecf20Sopenharmony_ci if(n < 0) 538c2ecf20Sopenharmony_ci return n; 548c2ecf20Sopenharmony_ci else return len; 558c2ecf20Sopenharmony_ci} 56