lib/libc/sys-minix/getpeername.c

http://www.minix3.org/ · C · 111 lines · 89 code · 20 blank · 2 comment · 23 complexity · 9df7ab25b09c16a6b3e74880c0eca647 MD5 · raw file

  1. #include <sys/cdefs.h>
  2. #include "namespace.h"
  3. #include <minix/ansi.h>
  4. #include <errno.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <sys/ioctl.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <net/gen/in.h>
  11. #include <net/gen/tcp.h>
  12. #include <net/gen/tcp_io.h>
  13. #include <net/gen/udp.h>
  14. #include <sys/un.h>
  15. #define DEBUG 0
  16. static int _tcp_getpeername(int sock, struct sockaddr *_RESTRICT address,
  17. socklen_t *_RESTRICT address_len, nwio_tcpconf_t *tcpconfp);
  18. static int _uds_getpeername(int sock, struct sockaddr *_RESTRICT address,
  19. socklen_t *_RESTRICT address_len, struct sockaddr_un *uds_addr);
  20. int getpeername(int sock, struct sockaddr *_RESTRICT address,
  21. socklen_t *_RESTRICT address_len)
  22. {
  23. int r;
  24. nwio_tcpconf_t tcpconf;
  25. struct sockaddr_un uds_addr;
  26. r= ioctl(sock, NWIOGTCPCONF, &tcpconf);
  27. if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL))
  28. {
  29. if (r == -1)
  30. {
  31. /* Bad file descriptor */
  32. return -1;
  33. }
  34. return _tcp_getpeername(sock, address, address_len,
  35. &tcpconf);
  36. }
  37. r= ioctl(sock, NWIOGUDSPADDR, &uds_addr);
  38. if (r != -1 || (errno != ENOTTY && errno != EBADIOCTL))
  39. {
  40. if (r == -1)
  41. {
  42. /* Bad file descriptor */
  43. return -1;
  44. }
  45. return _uds_getpeername(sock, address, address_len,
  46. &uds_addr);
  47. }
  48. #if DEBUG
  49. fprintf(stderr, "getpeername: not implemented for fd %d\n", sock);
  50. #endif
  51. errno= ENOSYS;
  52. return -1;
  53. }
  54. static int _tcp_getpeername(int sock, struct sockaddr *_RESTRICT address,
  55. socklen_t *_RESTRICT address_len, nwio_tcpconf_t *tcpconfp)
  56. {
  57. socklen_t len;
  58. struct sockaddr_in sin;
  59. if (tcpconfp->nwtc_remaddr == 0 ||
  60. tcpconfp->nwtc_remport == 0)
  61. {
  62. errno= ENOTCONN;
  63. return -1;
  64. }
  65. memset(&sin, '\0', sizeof(sin));
  66. sin.sin_family= AF_INET;
  67. sin.sin_addr.s_addr= tcpconfp->nwtc_remaddr;
  68. sin.sin_port= tcpconfp->nwtc_remport;
  69. len= *address_len;
  70. if (len > sizeof(sin))
  71. len= sizeof(sin);
  72. memcpy(address, &sin, len);
  73. *address_len= len;
  74. return 0;
  75. }
  76. static int _uds_getpeername(int sock, struct sockaddr *_RESTRICT address,
  77. socklen_t *_RESTRICT address_len, struct sockaddr_un *uds_addr)
  78. {
  79. socklen_t len;
  80. if (uds_addr->sun_family != AF_UNIX)
  81. {
  82. errno= ENOTCONN;
  83. return -1;
  84. }
  85. len= *address_len;
  86. if (len > sizeof(struct sockaddr_un))
  87. len = sizeof(struct sockaddr_un);
  88. memcpy(address, uds_addr, len);
  89. *address_len= len;
  90. return 0;
  91. }