getpeername.c 899 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. /* posix */
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <fcntl.h>
  7. #include <string.h>
  8. #include <errno.h>
  9. /* bsd extensions */
  10. #include <sys/uio.h>
  11. #include <sys/socket.h>
  12. #include <netinet/in.h>
  13. #include <sys/un.h>
  14. #include "priv.h"
  15. int
  16. getpeername(int fd, struct sockaddr *addr, int *alen)
  17. {
  18. Rock *r;
  19. int i;
  20. struct sockaddr_in *rip;
  21. struct sockaddr_un *runix;
  22. r = _sock_findrock(fd, 0);
  23. if(r == 0){
  24. errno = ENOTSOCK;
  25. return -1;
  26. }
  27. switch(r->domain){
  28. case PF_INET:
  29. rip = (struct sockaddr_in*)&r->raddr;
  30. memmove(addr, rip, sizeof(struct sockaddr_in));
  31. *alen = sizeof(struct sockaddr_in);
  32. break;
  33. case PF_UNIX:
  34. runix = (struct sockaddr_un*)&r->raddr;
  35. i = &runix->sun_path[strlen(runix->sun_path)] - (char*)runix;
  36. memmove(addr, runix, i);
  37. *alen = i;
  38. break;
  39. default:
  40. errno = EAFNOSUPPORT;
  41. return -1;
  42. }
  43. return 0;
  44. }