mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.1 KiB
55 lines
1.1 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
#include <string.h> |
|
#include "slip_common.h" |
|
#include <net_user.h> |
|
|
|
int slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip) |
|
{ |
|
int i, n, size, start; |
|
|
|
if(slip->more > 0){ |
|
i = 0; |
|
while(i < slip->more){ |
|
size = slip_unesc(slip->ibuf[i++], slip->ibuf, |
|
&slip->pos, &slip->esc); |
|
if(size){ |
|
memcpy(buf, slip->ibuf, size); |
|
memmove(slip->ibuf, &slip->ibuf[i], |
|
slip->more - i); |
|
slip->more = slip->more - i; |
|
return size; |
|
} |
|
} |
|
slip->more = 0; |
|
} |
|
|
|
n = net_read(fd, &slip->ibuf[slip->pos], |
|
sizeof(slip->ibuf) - slip->pos); |
|
if(n <= 0) |
|
return n; |
|
|
|
start = slip->pos; |
|
for(i = 0; i < n; i++){ |
|
size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos, |
|
&slip->esc); |
|
if(size){ |
|
memcpy(buf, slip->ibuf, size); |
|
memmove(slip->ibuf, &slip->ibuf[start+i+1], |
|
n - (i + 1)); |
|
slip->more = n - (i + 1); |
|
return size; |
|
} |
|
} |
|
return 0; |
|
} |
|
|
|
int slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip) |
|
{ |
|
int actual, n; |
|
|
|
actual = slip_esc(buf, slip->obuf, len); |
|
n = net_write(fd, slip->obuf, actual); |
|
if(n < 0) |
|
return n; |
|
else return len; |
|
}
|
|
|