sock_bind_wild.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "unp.h"
  2. int
  3. sock_bind_wild(int sockfd, int family)
  4. {
  5. socklen_t len;
  6. switch (family) {
  7. case AF_INET: {
  8. struct sockaddr_in sin;
  9. bzero(&sin, sizeof(sin));
  10. sin.sin_family = AF_INET;
  11. sin.sin_addr.s_addr = htonl(INADDR_ANY);
  12. sin.sin_port = htons(0); /* bind ephemeral port */
  13. if (bind(sockfd, (SA *) &sin, sizeof(sin)) < 0)
  14. return(-1);
  15. len = sizeof(sin);
  16. if (getsockname(sockfd, (SA *) &sin, &len) < 0)
  17. return(-1);
  18. return(sin.sin_port);
  19. }
  20. #ifdef IPV6
  21. case AF_INET6: {
  22. struct sockaddr_in6 sin6;
  23. bzero(&sin6, sizeof(sin6));
  24. sin6.sin6_family = AF_INET6;
  25. sin6.sin6_addr = in6addr_any;
  26. sin6.sin6_port = htons(0); /* bind ephemeral port */
  27. if (bind(sockfd, (SA *) &sin6, sizeof(sin6)) < 0)
  28. return(-1);
  29. len = sizeof(sin6);
  30. if (getsockname(sockfd, (SA *) &sin6, &len) < 0)
  31. return(-1);
  32. return(sin6.sin6_port);
  33. }
  34. #endif
  35. }
  36. return(-1);
  37. }
  38. int
  39. Sock_bind_wild(int sockfd, int family)
  40. {
  41. int port;
  42. if ( (port = sock_bind_wild(sockfd, family)) < 0)
  43. err_sys("sock_bind_wild error");
  44. return(port);
  45. }