static int swClient_inet_addr(swClient *cli, char *host, int port) { //enable socks5 proxy if (cli->socks5_proxy) { cli->socks5_proxy->target_host = host; cli->socks5_proxy->l_target_host = strlen(host); cli->socks5_proxy->target_port = port; host = cli->socks5_proxy->host; port = cli->socks5_proxy->port; } void *s_addr = NULL; if (cli->type == SW_SOCK_TCP || cli->type == SW_SOCK_UDP) { cli->server_addr.addr.inet_v4.sin_family = AF_INET; cli->server_addr.addr.inet_v4.sin_port = htons(port); cli->server_addr.len = sizeof(cli->server_addr.addr.inet_v4); s_addr = &cli->server_addr.addr.inet_v4.sin_addr.s_addr; if (inet_pton(AF_INET, host, s_addr)) { return SW_OK; } } else if (cli->type == SW_SOCK_TCP6 || cli->type == SW_SOCK_UDP6) { cli->server_addr.addr.inet_v6.sin6_family = AF_INET6; cli->server_addr.addr.inet_v6.sin6_port = htons(port); cli->server_addr.len = sizeof(cli->server_addr.addr.inet_v6); s_addr = cli->server_addr.addr.inet_v6.sin6_addr.s6_addr; if (inet_pton(AF_INET6, host, s_addr)) { return SW_OK; } } else if (cli->type == SW_SOCK_UNIX_STREAM || cli->type == SW_SOCK_UNIX_DGRAM) { cli->server_addr.addr.un.sun_family = AF_UNIX; strncpy(cli->server_addr.addr.un.sun_path, host, sizeof(cli->server_addr.addr.un.sun_path)); cli->server_addr.len = sizeof(cli->server_addr.addr.un); return SW_OK; } if (cli->async) { swWarn("DNS lookup will block the process. Please use swoole_async_dns_lookup."); } if (swoole_gethostbyname(cli->_sock_domain, host, s_addr) < 0) { return SW_ERR; } return SW_OK; }
void swAio_handler_gethostbyname(swAio_event *event) { struct in_addr addr_v4; struct in6_addr addr_v6; int ret; #ifndef HAVE_GETHOSTBYNAME2_R SwooleAIO.lock.lock(&SwooleAIO.lock); #endif if (event->flags == AF_INET6) { ret = swoole_gethostbyname(AF_INET6, event->buf, (char *) &addr_v6); } else { ret = swoole_gethostbyname(AF_INET, event->buf, (char *) &addr_v4); } bzero(event->buf, event->nbytes); #ifndef HAVE_GETHOSTBYNAME2_R SwooleAIO.lock.unlock(&SwooleAIO.lock); #endif if (ret < 0) { event->error = h_errno; } else { if (inet_ntop(event->flags == AF_INET6 ? AF_INET6 : AF_INET, event->flags == AF_INET6 ? (void *) &addr_v6 : (void *) &addr_v4, event->buf, event->nbytes) == NULL) { ret = -1; event->error = SW_ERROR_BAD_IPV6_ADDRESS; } else { event->error = 0; ret = 0; } } event->ret = ret; }
static int swAioBase_thread_onTask(swThreadPool *pool, void *task, int task_len) { swAio_event *event = task; struct in_addr addr; char *ip_addr; int ret = -1; start_switch: switch(event->type) { case SW_AIO_WRITE: if (flock(event->fd, LOCK_EX) < 0) { swSysError("flock(%d, LOCK_EX) failed.", event->fd); break; } if (event->offset == 0) { ret = write(event->fd, event->buf, event->nbytes); } else { ret = pwrite(event->fd, event->buf, event->nbytes, event->offset); } if (flock(event->fd, LOCK_UN) < 0) { swSysError("flock(%d, LOCK_UN) failed.", event->fd); } break; case SW_AIO_READ: if (flock(event->fd, LOCK_SH) < 0) { swSysError("flock(%d, LOCK_SH) failed.", event->fd); break; } ret = pread(event->fd, event->buf, event->nbytes, event->offset); if (flock(event->fd, LOCK_UN) < 0) { swSysError("flock(%d, LOCK_UN) failed.", event->fd); } break; case SW_AIO_DNS_LOOKUP: ret = swoole_gethostbyname(AF_INET, event->buf, (char *) &addr); if (ret < 0) { event->error = h_errno; switch (h_errno) { case HOST_NOT_FOUND: bzero(event->buf, event->nbytes); ret = 0; break; default: ret = -1; break; } } else { ip_addr = inet_ntoa(addr); bzero(event->buf, event->nbytes); memcpy(event->buf, ip_addr, strnlen(ip_addr, SW_IP_MAX_LENGTH) + 1); ret = 0; } break; default: swWarn("unknow aio task."); break; } event->ret = ret; if (ret < 0) { if (errno == EINTR || errno == EAGAIN) { goto start_switch; } else { event->error = errno; } } swTrace("aio_thread ok. ret=%d", ret); do { ret = write(swAioBase_pipe_write, &task, sizeof(task)); if (ret < 0) { if (errno == EAGAIN) { swYield(); continue; } else if(errno == EINTR) { continue; } else { swWarn("sendto swoole_aio_pipe_write failed. Error: %s[%d]", strerror(errno), errno); } } break; } while(1); return SW_OK; }
static int swClient_inet_addr(swClient *cli, char *host, int port) { //enable socks5 proxy if (cli->socks5_proxy) { cli->socks5_proxy->target_host = host; cli->socks5_proxy->l_target_host = strlen(host); cli->socks5_proxy->target_port = port; host = cli->socks5_proxy->host; port = cli->socks5_proxy->port; } //enable http proxy if (cli->http_proxy) { cli->http_proxy->target_host = host; cli->http_proxy->target_port = port; host = cli->http_proxy->proxy_host; port = cli->http_proxy->proxy_port; } cli->server_host = host; cli->server_port = port; void *s_addr = NULL; if (cli->type == SW_SOCK_TCP || cli->type == SW_SOCK_UDP) { cli->server_addr.addr.inet_v4.sin_family = AF_INET; cli->server_addr.addr.inet_v4.sin_port = htons(port); cli->server_addr.len = sizeof(cli->server_addr.addr.inet_v4); s_addr = &cli->server_addr.addr.inet_v4.sin_addr.s_addr; if (inet_pton(AF_INET, host, s_addr)) { return SW_OK; } } else if (cli->type == SW_SOCK_TCP6 || cli->type == SW_SOCK_UDP6) { cli->server_addr.addr.inet_v6.sin6_family = AF_INET6; cli->server_addr.addr.inet_v6.sin6_port = htons(port); cli->server_addr.len = sizeof(cli->server_addr.addr.inet_v6); s_addr = cli->server_addr.addr.inet_v6.sin6_addr.s6_addr; if (inet_pton(AF_INET6, host, s_addr)) { return SW_OK; } } else if (cli->type == SW_SOCK_UNIX_STREAM || cli->type == SW_SOCK_UNIX_DGRAM) { cli->server_addr.addr.un.sun_family = AF_UNIX; strncpy(cli->server_addr.addr.un.sun_path, host, sizeof(cli->server_addr.addr.un.sun_path) - 1); cli->server_addr.addr.un.sun_path[sizeof(cli->server_addr.addr.un.sun_path) - 1] = 0; cli->server_addr.len = sizeof(cli->server_addr.addr.un.sun_path); return SW_OK; } else { return SW_ERR; } if (!cli->async) { if (swoole_gethostbyname(cli->_sock_domain, host, s_addr) < 0) { return SW_ERR; } } else { cli->wait_dns = 1; } return SW_OK; }