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