_asrdresp.c 874 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <authsrv.h>
  4. static char *pbmsg = "AS protocol botch";
  5. int
  6. _asrdresp(int fd, char *buf, int len)
  7. {
  8. int n;
  9. char error[64];
  10. if(read(fd, buf, 1) != 1){
  11. werrstr(pbmsg);
  12. return -1;
  13. }
  14. n = len;
  15. switch(buf[0]){
  16. case AuthOK:
  17. if(readn(fd, buf, len) != len){
  18. werrstr(pbmsg);
  19. return -1;
  20. }
  21. break;
  22. case AuthErr:
  23. if(readn(fd, error, sizeof error) != sizeof error){
  24. werrstr(pbmsg);
  25. return -1;
  26. }
  27. error[sizeof error-1] = '\0';
  28. werrstr("remote: %s", error);
  29. return -1;
  30. case AuthOKvar:
  31. if(readn(fd, error, 5) != 5){
  32. werrstr(pbmsg);
  33. return -1;
  34. }
  35. error[5] = 0;
  36. n = atoi(error);
  37. if(n <= 0 || n > len){
  38. werrstr(pbmsg);
  39. return -1;
  40. }
  41. memset(buf, 0, len);
  42. if(readn(fd, buf, n) != n){
  43. werrstr(pbmsg);
  44. return -1;
  45. }
  46. break;
  47. default:
  48. werrstr(pbmsg);
  49. return -1;
  50. }
  51. return n;
  52. }