1
0

Sockaddr.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /* vim: set expandtab ts=4 sw=4: */
  2. /*
  3. * You may redistribute this program and/or modify it under the terms of
  4. * the GNU General Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * You should have received a copy of the GNU General Public License
  13. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. #ifndef Sockaddr_H
  16. #define Sockaddr_H
  17. #include "memory/Allocator.h"
  18. #include "util/Endian.h"
  19. #include "util/Linker.h"
  20. Linker_require("util/platform/Sockaddr.c")
  21. #include <stdint.h>
  22. struct Sockaddr
  23. {
  24. /** the length of this sockaddr, this field is included in the length. */
  25. uint16_t addrLen;
  26. #define Sockaddr_flags_BCAST 1
  27. uint16_t flags;
  28. uint32_t pad;
  29. };
  30. /** The number of bytes of space taken for representing the addrLen at the beginning. */
  31. #define Sockaddr_OVERHEAD 8
  32. /** The maximum possible size for the native sockaddr (not including Sockaddr_OVERHEAD) */
  33. #define Sockaddr_MAXSIZE 128
  34. struct Sockaddr_storage
  35. {
  36. struct Sockaddr addr;
  37. uint64_t nativeAddr[Sockaddr_MAXSIZE / 8];
  38. };
  39. /** 127.0.0.1 and ::1 addresses for building from. */
  40. const struct Sockaddr* const Sockaddr_LOOPBACK_be;
  41. const struct Sockaddr* const Sockaddr_LOOPBACK_le;
  42. #define Sockaddr_LOOPBACK (Endian_isBigEndian() ? Sockaddr_LOOPBACK_be : Sockaddr_LOOPBACK_le)
  43. const struct Sockaddr* const Sockaddr_LOOPBACK6;
  44. /**
  45. * Parse a sockaddr from a string, may be IP4 or IP6.
  46. *
  47. * @param str a string representation of the sockaddr.
  48. * @param output a sockaddr_storage to populate, if null then the validity of the string will be
  49. * checked only.
  50. * @return 0 if all goes well, -1 if there is an error.
  51. */
  52. int Sockaddr_parse(const char* str, struct Sockaddr_storage* out);
  53. /**
  54. * Convert a sockaddr to a printable string.
  55. */
  56. char* Sockaddr_print(struct Sockaddr* addr, struct Allocator* alloc);
  57. /**
  58. * Get the port from a sockaddr if applicable.
  59. *
  60. * @param a sockaddr.
  61. * @return the port number or -1 if not applicable to this sockaddr.
  62. */
  63. int Sockaddr_getPort(struct Sockaddr* sa);
  64. /**
  65. * Set the port for a sockaddr if applicable.
  66. *
  67. * @param sa a sockaddr.
  68. * @param port the port number to set.
  69. * @return 0 if all goes well, -1 if not applicable to this sockaddr.
  70. */
  71. int Sockaddr_setPort(struct Sockaddr* sa, uint16_t port);
  72. /**
  73. * Get the address family for the address.
  74. *
  75. * @param a sockaddr.
  76. * @return the AF number for this sockaddr.
  77. */
  78. extern const int Sockaddr_AF_INET;
  79. extern const int Sockaddr_AF_INET6;
  80. int Sockaddr_getFamily(struct Sockaddr* sa);
  81. /**
  82. * Get the address stored in a sockaddr.
  83. *
  84. * @param sa a sockaddr.
  85. * @param addrPtr a pointer which will be set to the actual address component of the sockaddr.
  86. * If NULL, the length will be returned only.
  87. * @return the length of the address component in bytes, -1 if failed to parse.
  88. */
  89. int Sockaddr_getAddress(struct Sockaddr* sa, void* addrPtr);
  90. /**
  91. * Get a new sockaddr from the native form, IE: sockaddr_in or sockaddr_in6.
  92. */
  93. struct Sockaddr* Sockaddr_fromNative(const void* ss, int addrLen, struct Allocator* alloc);
  94. /**
  95. * Output the native form of a sockaddr.
  96. */
  97. static inline void* Sockaddr_asNative(struct Sockaddr* sa)
  98. {
  99. return (void*)(&sa[1]);
  100. }
  101. static inline const void* Sockaddr_asNativeConst(const struct Sockaddr* sa)
  102. {
  103. return (const void*)(&sa[1]);
  104. }
  105. struct Sockaddr* Sockaddr_fromName(char* name, struct Allocator* alloc);
  106. /**
  107. * Contrast with Sockaddr_fromNative(), Sockaddr_fromBytes() takes
  108. * input as the bytes of the address eg: Sockaddr_fromBytes({127,0,0,1}, Sockaddr_AF_INET, alloc)
  109. */
  110. struct Sockaddr* Sockaddr_fromBytes(const uint8_t* bytes, int addrFamily, struct Allocator* alloc);
  111. /**
  112. * Clone the sockaddr, the clone will use only as much memory as the type of sockaddr requires.
  113. */
  114. struct Sockaddr* Sockaddr_clone(const struct Sockaddr* addr, struct Allocator* alloc);
  115. /**
  116. * Normalize inconsistent native sockaddr implementations
  117. */
  118. void Sockaddr_normalizeNative(void* nativeSockaddr);
  119. #endif