cf-socket.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #ifndef HEADER_CURL_CF_SOCKET_H
  2. #define HEADER_CURL_CF_SOCKET_H
  3. /***************************************************************************
  4. * _ _ ____ _
  5. * Project ___| | | | _ \| |
  6. * / __| | | | |_) | |
  7. * | (__| |_| | _ <| |___
  8. * \___|\___/|_| \_\_____|
  9. *
  10. * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
  11. *
  12. * This software is licensed as described in the file COPYING, which
  13. * you should have received as part of this distribution. The terms
  14. * are also available at https://curl.se/docs/copyright.html.
  15. *
  16. * You may opt to use, copy, modify, merge, publish, distribute and/or sell
  17. * copies of the Software, and permit persons to whom the Software is
  18. * furnished to do so, under the terms of the COPYING file.
  19. *
  20. * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
  21. * KIND, either express or implied.
  22. *
  23. * SPDX-License-Identifier: curl
  24. *
  25. ***************************************************************************/
  26. #include "curl_setup.h"
  27. #include "nonblock.h" /* for curlx_nonblock(), formerly Curl_nonblock() */
  28. #include "sockaddr.h"
  29. struct Curl_addrinfo;
  30. struct Curl_cfilter;
  31. struct Curl_easy;
  32. struct connectdata;
  33. struct Curl_sockaddr_ex;
  34. struct ip_quadruple;
  35. /*
  36. * The Curl_sockaddr_ex structure is basically libcurl's external API
  37. * curl_sockaddr structure with enough space available to directly hold any
  38. * protocol-specific address structures. The variable declared here will be
  39. * used to pass / receive data to/from the fopensocket callback if this has
  40. * been set, before that, it is initialized from parameters.
  41. */
  42. struct Curl_sockaddr_ex {
  43. int family;
  44. int socktype;
  45. int protocol;
  46. unsigned int addrlen;
  47. union {
  48. struct sockaddr addr;
  49. struct Curl_sockaddr_storage buff;
  50. } _sa_ex_u;
  51. };
  52. #define curl_sa_addr _sa_ex_u.addr
  53. /*
  54. * Parse interface option, and return the interface name and the host part.
  55. */
  56. CURLcode Curl_parse_interface(const char *input,
  57. char **dev, char **iface, char **host);
  58. /*
  59. * Create a socket based on info from 'conn' and 'ai'.
  60. *
  61. * Fill in 'addr' and 'sockfd' accordingly if OK is returned. If the open
  62. * socket callback is set, used that!
  63. *
  64. */
  65. CURLcode Curl_socket_open(struct Curl_easy *data,
  66. const struct Curl_addrinfo *ai,
  67. struct Curl_sockaddr_ex *addr,
  68. int transport,
  69. curl_socket_t *sockfd);
  70. int Curl_socket_close(struct Curl_easy *data, struct connectdata *conn,
  71. curl_socket_t sock);
  72. #ifdef USE_WINSOCK
  73. /* When you run a program that uses the Windows Sockets API, you may
  74. experience slow performance when you copy data to a TCP server.
  75. https://support.microsoft.com/kb/823764
  76. Work-around: Make the Socket Send Buffer Size Larger Than the Program Send
  77. Buffer Size
  78. */
  79. void Curl_sndbuf_init(curl_socket_t sockfd);
  80. #else
  81. #define Curl_sndbuf_init(y) Curl_nop_stmt
  82. #endif
  83. /**
  84. * Assign the address `ai` to the Curl_sockaddr_ex `dest` and
  85. * set the transport used.
  86. */
  87. CURLcode Curl_sock_assign_addr(struct Curl_sockaddr_ex *dest,
  88. const struct Curl_addrinfo *ai,
  89. int transport);
  90. /**
  91. * Creates a cfilter that opens a TCP socket to the given address
  92. * when calling its `connect` implementation.
  93. * The filter will not touch any connection/data flags and can be
  94. * used in happy eyeballing. Once selected for use, its `_active()`
  95. * method needs to be called.
  96. */
  97. CURLcode Curl_cf_tcp_create(struct Curl_cfilter **pcf,
  98. struct Curl_easy *data,
  99. struct connectdata *conn,
  100. const struct Curl_addrinfo *ai,
  101. int transport);
  102. /**
  103. * Creates a cfilter that opens a UDP socket to the given address
  104. * when calling its `connect` implementation.
  105. * The filter will not touch any connection/data flags and can be
  106. * used in happy eyeballing. Once selected for use, its `_active()`
  107. * method needs to be called.
  108. */
  109. CURLcode Curl_cf_udp_create(struct Curl_cfilter **pcf,
  110. struct Curl_easy *data,
  111. struct connectdata *conn,
  112. const struct Curl_addrinfo *ai,
  113. int transport);
  114. /**
  115. * Creates a cfilter that opens a UNIX socket to the given address
  116. * when calling its `connect` implementation.
  117. * The filter will not touch any connection/data flags and can be
  118. * used in happy eyeballing. Once selected for use, its `_active()`
  119. * method needs to be called.
  120. */
  121. CURLcode Curl_cf_unix_create(struct Curl_cfilter **pcf,
  122. struct Curl_easy *data,
  123. struct connectdata *conn,
  124. const struct Curl_addrinfo *ai,
  125. int transport);
  126. /**
  127. * Creates a cfilter that keeps a listening socket.
  128. */
  129. CURLcode Curl_conn_tcp_listen_set(struct Curl_easy *data,
  130. struct connectdata *conn,
  131. int sockindex,
  132. curl_socket_t *s);
  133. /**
  134. * Return TRUE iff the last filter at `sockindex` was set via
  135. * Curl_conn_tcp_listen_set().
  136. */
  137. bool Curl_conn_is_tcp_listen(struct Curl_easy *data,
  138. int sockindex);
  139. /**
  140. * Peek at the socket and remote ip/port the socket filter is using.
  141. * The filter owns all returned values.
  142. * @param psock pointer to hold socket descriptor or NULL
  143. * @param paddr pointer to hold addr reference or NULL
  144. * @param pip pointer to get IP quadruple or NULL
  145. * Returns error if the filter is of invalid type.
  146. */
  147. CURLcode Curl_cf_socket_peek(struct Curl_cfilter *cf,
  148. struct Curl_easy *data,
  149. curl_socket_t *psock,
  150. const struct Curl_sockaddr_ex **paddr,
  151. struct ip_quadruple *pip);
  152. extern struct Curl_cftype Curl_cft_tcp;
  153. extern struct Curl_cftype Curl_cft_udp;
  154. extern struct Curl_cftype Curl_cft_unix;
  155. extern struct Curl_cftype Curl_cft_tcp_accept;
  156. #endif /* HEADER_CURL_CF_SOCKET_H */