|
23 | 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
24 | 24 | * THE SOFTWARE. |
25 | 25 | */ |
| 26 | + |
| 27 | +#include "shared-bindings/socketpool/SocketPool.h" |
| 28 | + |
| 29 | +#include "py/runtime.h" |
| 30 | + |
| 31 | +#include "esp-idf/components/lwip/lwip/src/include/lwip/netdb.h" |
| 32 | + |
| 33 | +socketpool_socket_obj_t* common_hal_socketpool_socket(socketpool_socketpool_obj_t* self, |
| 34 | + socketpool_socketpool_addressfamily_t family, socketpool_socketpool_sock_t type) { |
| 35 | + |
| 36 | + int addr_family; |
| 37 | + int ipproto; |
| 38 | + if (family == SOCKETPOOL_AF_INET) { |
| 39 | + addr_family = AF_INET; |
| 40 | + ipproto = IPPROTO_IP; |
| 41 | + } else { // INET6 |
| 42 | + addr_family = AF_INET6; |
| 43 | + ipproto = IPPROTO_IPV6; |
| 44 | + } |
| 45 | + |
| 46 | + int socket_type; |
| 47 | + if (type == SOCKETPOOL_SOCK_STREAM) { |
| 48 | + socket_type = SOCK_STREAM; |
| 49 | + } else if (type == SOCKETPOOL_SOCK_DGRAM) { |
| 50 | + socket_type = SOCK_DGRAM; |
| 51 | + } else { // SOCKETPOOL_SOCK_RAW |
| 52 | + socket_type = SOCK_RAW; |
| 53 | + } |
| 54 | + |
| 55 | + int socknum = -1; |
| 56 | + esp_tls_t* tcp_handle = NULL; |
| 57 | + if (socket_type == SOCK_DGRAM || socket_type == SOCK_RAW) { |
| 58 | + socknum = lwip_socket(addr_family, socket_type, ipproto); |
| 59 | + } else { |
| 60 | + tcp_handle = esp_tls_init(); |
| 61 | + } |
| 62 | + if (socknum < 0 && tcp_handle == NULL) { |
| 63 | + mp_raise_RuntimeError(translate("Out of sockets")); |
| 64 | + } |
| 65 | + |
| 66 | + socketpool_socket_obj_t *sock = m_new_obj_with_finaliser(socketpool_socket_obj_t); |
| 67 | + sock->base.type = &socketpool_socket_type; |
| 68 | + sock->num = socknum; |
| 69 | + sock->tcp = tcp_handle; |
| 70 | + sock->ssl_context = NULL; |
| 71 | + sock->pool = self; |
| 72 | + return sock; |
| 73 | +} |
| 74 | + |
| 75 | + |
| 76 | +mp_obj_t common_hal_socketpool_socketpool_gethostbyname(socketpool_socketpool_obj_t* self, |
| 77 | + const char* host) { |
| 78 | + |
| 79 | + const struct addrinfo hints = { |
| 80 | + .ai_family = AF_INET, |
| 81 | + .ai_socktype = SOCK_STREAM, |
| 82 | + }; |
| 83 | + struct addrinfo *res; |
| 84 | + int err = getaddrinfo(host, NULL, &hints, &res); |
| 85 | + if (err != 0 || res == NULL) { |
| 86 | + return mp_const_none; |
| 87 | + } |
| 88 | + |
| 89 | + #pragma GCC diagnostic push |
| 90 | + #pragma GCC diagnostic ignored "-Wcast-align" |
| 91 | + struct in_addr *addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr; |
| 92 | + #pragma GCC diagnostic pop |
| 93 | + char ip_str[IP4ADDR_STRLEN_MAX]; |
| 94 | + inet_ntoa_r(*addr, ip_str, IP4ADDR_STRLEN_MAX); |
| 95 | + mp_obj_t ip_obj = mp_obj_new_str(ip_str, strlen(ip_str)); |
| 96 | + freeaddrinfo(res); |
| 97 | + |
| 98 | + return ip_obj; |
| 99 | +} |
0 commit comments