slip_common.c 1.1 KB

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