int slip_user_read(int fd, void *buf, int len, struct slip_data *pri) { int i, n, size, start; if(pri->more>0) { i = 0; while(i < pri->more) { size = slip_unesc(pri->ibuf[i++], pri->ibuf, &pri->pos, &pri->esc); if(size){ memcpy(buf, pri->ibuf, size); memmove(pri->ibuf, &pri->ibuf[i], pri->more-i); pri->more=pri->more-i; return(size); } } pri->more=0; } n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos); if(n <= 0) return(n); start = pri->pos; for(i = 0; i < n; i++){ size = slip_unesc(pri->ibuf[start + i], pri->ibuf, &pri->pos, &pri->esc); if(size){ memcpy(buf, pri->ibuf, size); memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1)); pri->more=n-(i+1); return(size); } } return(0); }
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; }