| #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; | |
| } |