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