ga_aistruct.lc 4.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "gai_hdr.h"## 1 ##src/libgai/ga_aistruct.c##
  2. /*## 2 ##src/libgai/ga_aistruct.c##
  3. * Create and fill in an addrinfo{}.## 3 ##src/libgai/ga_aistruct.c##
  4. */## 4 ##src/libgai/ga_aistruct.c##
  5. /* include ga_aistruct1 */
  6. int## 5 ##src/libgai/ga_aistruct.c##
  7. ga_aistruct(struct addrinfo ***paipnext, const struct addrinfo *hintsp,## 6 ##src/libgai/ga_aistruct.c##
  8. const void *addr, int family)## 7 ##src/libgai/ga_aistruct.c##
  9. {## 8 ##src/libgai/ga_aistruct.c##
  10. struct addrinfo *ai;## 9 ##src/libgai/ga_aistruct.c##
  11. if ((ai = calloc(1, sizeof(struct addrinfo))) == NULL)## 10 ##src/libgai/ga_aistruct.c##
  12. return (EAI_MEMORY);## 11 ##src/libgai/ga_aistruct.c##
  13. ai->ai_next = NULL;## 12 ##src/libgai/ga_aistruct.c##
  14. ai->ai_canonname = NULL;## 13 ##src/libgai/ga_aistruct.c##
  15. **paipnext = ai;## 14 ##src/libgai/ga_aistruct.c##
  16. *paipnext = &ai->ai_next;## 15 ##src/libgai/ga_aistruct.c##
  17. if ((ai->ai_socktype = hintsp->ai_socktype) == 0)## 16 ##src/libgai/ga_aistruct.c##
  18. ai->ai_flags |= AI_CLONE;## 17 ##src/libgai/ga_aistruct.c##
  19. ai->ai_protocol = hintsp->ai_protocol;## 18 ##src/libgai/ga_aistruct.c##
  20. /* end ga_aistruct1 */
  21. /* include ga_aistruct2 */
  22. switch ((ai->ai_family = family)) {## 19 ##src/libgai/ga_aistruct.c##
  23. case AF_INET:{## 20 ##src/libgai/ga_aistruct.c##
  24. struct sockaddr_in *sinptr;## 21 ##src/libgai/ga_aistruct.c##
  25. /* 4allocate sockaddr_in{} and fill in all but port */## 22 ##src/libgai/ga_aistruct.c##
  26. if ((sinptr = calloc(1, sizeof(struct sockaddr_in))) == NULL)## 23 ##src/libgai/ga_aistruct.c##
  27. return (EAI_MEMORY);## 24 ##src/libgai/ga_aistruct.c##
  28. #ifdef HAVE_SOCKADDR_SA_LEN## 25 ##src/libgai/ga_aistruct.c##
  29. sinptr->sin_len = sizeof(struct sockaddr_in);## 26 ##src/libgai/ga_aistruct.c##
  30. #endif## 27 ##src/libgai/ga_aistruct.c##
  31. sinptr->sin_family = AF_INET;## 28 ##src/libgai/ga_aistruct.c##
  32. memcpy(&sinptr->sin_addr, addr, sizeof(struct in_addr));## 29 ##src/libgai/ga_aistruct.c##
  33. ai->ai_addr = (struct sockaddr *) sinptr;## 30 ##src/libgai/ga_aistruct.c##
  34. ai->ai_addrlen = sizeof(struct sockaddr_in);## 31 ##src/libgai/ga_aistruct.c##
  35. break;## 32 ##src/libgai/ga_aistruct.c##
  36. }## 33 ##src/libgai/ga_aistruct.c##
  37. case AF_INET6:{## 34 ##src/libgai/ga_aistruct.c##
  38. struct sockaddr_in6 *sin6ptr;## 35 ##src/libgai/ga_aistruct.c##
  39. /* 4allocate sockaddr_in6{} and fill in all but port */## 36 ##src/libgai/ga_aistruct.c##
  40. if ((sin6ptr = calloc(1, sizeof(struct sockaddr_in6))) == NULL)## 37 ##src/libgai/ga_aistruct.c##
  41. return (EAI_MEMORY);## 38 ##src/libgai/ga_aistruct.c##
  42. #ifdef HAVE_SOCKADDR_SA_LEN## 39 ##src/libgai/ga_aistruct.c##
  43. sin6ptr->sin6_len = sizeof(struct sockaddr_in6);## 40 ##src/libgai/ga_aistruct.c##
  44. #endif## 41 ##src/libgai/ga_aistruct.c##
  45. sin6ptr->sin6_family = AF_INET6;## 42 ##src/libgai/ga_aistruct.c##
  46. memcpy(&sin6ptr->sin6_addr, addr, sizeof(struct in6_addr));## 43 ##src/libgai/ga_aistruct.c##
  47. ai->ai_addr = (struct sockaddr *) sin6ptr;## 44 ##src/libgai/ga_aistruct.c##
  48. ai->ai_addrlen = sizeof(struct sockaddr_in6);## 45 ##src/libgai/ga_aistruct.c##
  49. break;## 46 ##src/libgai/ga_aistruct.c##
  50. }## 47 ##src/libgai/ga_aistruct.c##
  51. case AF_LOCAL:{## 48 ##src/libgai/ga_aistruct.c##
  52. struct sockaddr_un *unp;## 49 ##src/libgai/ga_aistruct.c##
  53. /* 4allocate sockaddr_un{} and fill in */## 50 ##src/libgai/ga_aistruct.c##
  54. if (strlen(addr) >= sizeof(unp->sun_path))## 51 ##src/libgai/ga_aistruct.c##
  55. return(EAI_SERVICE);## 52 ##src/libgai/ga_aistruct.c##
  56. if ( (unp = calloc(1, sizeof(struct sockaddr_un))) == NULL)## 53 ##src/libgai/ga_aistruct.c##
  57. return(EAI_MEMORY);## 54 ##src/libgai/ga_aistruct.c##
  58. unp->sun_family = AF_LOCAL;## 55 ##src/libgai/ga_aistruct.c##
  59. strcpy(unp->sun_path, addr);## 56 ##src/libgai/ga_aistruct.c##
  60. #ifdef HAVE_SOCKADDR_SA_LEN## 57 ##src/libgai/ga_aistruct.c##
  61. unp->sun_len = SUN_LEN(unp);## 58 ##src/libgai/ga_aistruct.c##
  62. #endif## 59 ##src/libgai/ga_aistruct.c##
  63. ai->ai_addr = (struct sockaddr *) unp;## 60 ##src/libgai/ga_aistruct.c##
  64. ai->ai_addrlen = sizeof(struct sockaddr_un);## 61 ##src/libgai/ga_aistruct.c##
  65. if (hintsp->ai_flags & AI_PASSIVE)## 62 ##src/libgai/ga_aistruct.c##
  66. unlink(unp->sun_path); /* OK if this fails */## 63 ##src/libgai/ga_aistruct.c##
  67. break;## 64 ##src/libgai/ga_aistruct.c##
  68. }## 65 ##src/libgai/ga_aistruct.c##
  69. }## 66 ##src/libgai/ga_aistruct.c##
  70. return (0);## 67 ##src/libgai/ga_aistruct.c##
  71. }## 68 ##src/libgai/ga_aistruct.c##
  72. /* end ga_aistruct2 */