slip_common.c 1.1 KB

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