1a3c77c67a443e631febf708bb0c376caede31657Jeff Dike#include <string.h> 2a3c77c67a443e631febf708bb0c376caede31657Jeff Dike#include "slip_common.h" 337185b33240870719b6b5913a46e6a441f1ae96fAl Viro#include <net_user.h> 4a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 5a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeint slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip) 6a3c77c67a443e631febf708bb0c376caede31657Jeff Dike{ 7a3c77c67a443e631febf708bb0c376caede31657Jeff Dike int i, n, size, start; 8a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 9a3c77c67a443e631febf708bb0c376caede31657Jeff Dike if(slip->more > 0){ 10a3c77c67a443e631febf708bb0c376caede31657Jeff Dike i = 0; 11a3c77c67a443e631febf708bb0c376caede31657Jeff Dike while(i < slip->more){ 12a3c77c67a443e631febf708bb0c376caede31657Jeff Dike size = slip_unesc(slip->ibuf[i++], slip->ibuf, 13a3c77c67a443e631febf708bb0c376caede31657Jeff Dike &slip->pos, &slip->esc); 14a3c77c67a443e631febf708bb0c376caede31657Jeff Dike if(size){ 15a3c77c67a443e631febf708bb0c376caede31657Jeff Dike memcpy(buf, slip->ibuf, size); 16a3c77c67a443e631febf708bb0c376caede31657Jeff Dike memmove(slip->ibuf, &slip->ibuf[i], 17a3c77c67a443e631febf708bb0c376caede31657Jeff Dike slip->more - i); 18a3c77c67a443e631febf708bb0c376caede31657Jeff Dike slip->more = slip->more - i; 19a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return size; 20a3c77c67a443e631febf708bb0c376caede31657Jeff Dike } 21a3c77c67a443e631febf708bb0c376caede31657Jeff Dike } 22a3c77c67a443e631febf708bb0c376caede31657Jeff Dike slip->more = 0; 23a3c77c67a443e631febf708bb0c376caede31657Jeff Dike } 24a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 25a3c77c67a443e631febf708bb0c376caede31657Jeff Dike n = net_read(fd, &slip->ibuf[slip->pos], 26a3c77c67a443e631febf708bb0c376caede31657Jeff Dike sizeof(slip->ibuf) - slip->pos); 27a3c77c67a443e631febf708bb0c376caede31657Jeff Dike if(n <= 0) 28a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return n; 29a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 30a3c77c67a443e631febf708bb0c376caede31657Jeff Dike start = slip->pos; 31a3c77c67a443e631febf708bb0c376caede31657Jeff Dike for(i = 0; i < n; i++){ 32a3c77c67a443e631febf708bb0c376caede31657Jeff Dike size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos, 33a3c77c67a443e631febf708bb0c376caede31657Jeff Dike &slip->esc); 34a3c77c67a443e631febf708bb0c376caede31657Jeff Dike if(size){ 35a3c77c67a443e631febf708bb0c376caede31657Jeff Dike memcpy(buf, slip->ibuf, size); 36a3c77c67a443e631febf708bb0c376caede31657Jeff Dike memmove(slip->ibuf, &slip->ibuf[start+i+1], 37a3c77c67a443e631febf708bb0c376caede31657Jeff Dike n - (i + 1)); 38a3c77c67a443e631febf708bb0c376caede31657Jeff Dike slip->more = n - (i + 1); 39a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return size; 40a3c77c67a443e631febf708bb0c376caede31657Jeff Dike } 41a3c77c67a443e631febf708bb0c376caede31657Jeff Dike } 42a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return 0; 43a3c77c67a443e631febf708bb0c376caede31657Jeff Dike} 44a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 45a3c77c67a443e631febf708bb0c376caede31657Jeff Dikeint slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip) 46a3c77c67a443e631febf708bb0c376caede31657Jeff Dike{ 47a3c77c67a443e631febf708bb0c376caede31657Jeff Dike int actual, n; 48a3c77c67a443e631febf708bb0c376caede31657Jeff Dike 49a3c77c67a443e631febf708bb0c376caede31657Jeff Dike actual = slip_esc(buf, slip->obuf, len); 50a3c77c67a443e631febf708bb0c376caede31657Jeff Dike n = net_write(fd, slip->obuf, actual); 51a3c77c67a443e631febf708bb0c376caede31657Jeff Dike if(n < 0) 52a3c77c67a443e631febf708bb0c376caede31657Jeff Dike return n; 53a3c77c67a443e631febf708bb0c376caede31657Jeff Dike else return len; 54a3c77c67a443e631febf708bb0c376caede31657Jeff Dike} 55