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