sk_connect_zero_addr.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <arpa/inet.h>
  3. #include <error.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. int main(void)
  7. {
  8. int fd1, fd2, one = 1;
  9. struct sockaddr_in6 bind_addr = {
  10. .sin6_family = AF_INET6,
  11. .sin6_port = htons(20000),
  12. .sin6_flowinfo = htonl(0),
  13. .sin6_addr = {},
  14. .sin6_scope_id = 0,
  15. };
  16. inet_pton(AF_INET6, "::", &bind_addr.sin6_addr);
  17. fd1 = socket(AF_INET6, SOCK_STREAM, IPPROTO_IP);
  18. if (fd1 < 0) {
  19. error(1, errno, "socket fd1");
  20. return -1;
  21. }
  22. if (setsockopt(fd1, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one))) {
  23. error(1, errno, "setsockopt(SO_REUSEADDR) fd1");
  24. goto out_err1;
  25. }
  26. if (bind(fd1, (struct sockaddr *)&bind_addr, sizeof(bind_addr))) {
  27. error(1, errno, "bind fd1");
  28. goto out_err1;
  29. }
  30. if (listen(fd1, 0)) {
  31. error(1, errno, "listen");
  32. goto out_err1;
  33. }
  34. fd2 = socket(AF_INET6, SOCK_STREAM, IPPROTO_IP);
  35. if (fd2 < 0) {
  36. error(1, errno, "socket fd2");
  37. goto out_err1;
  38. }
  39. if (connect(fd2, (struct sockaddr *)&bind_addr, sizeof(bind_addr))) {
  40. error(1, errno, "bind fd2");
  41. goto out_err2;
  42. }
  43. close(fd2);
  44. close(fd1);
  45. return 0;
  46. out_err2:
  47. close(fd2);
  48. out_err1:
  49. close(fd1);
  50. return -1;
  51. }