int * __h_errno(void) { /* NULL param here means use the default config file. */ struct net_data *net_data = net_data_init(NULL); if (net_data && net_data->res) return (&net_data->res->res_h_errno); return (&h_errno); }
struct __res_state * __res_state(void) { /* NULL param here means use the default config file. */ struct net_data *net_data = net_data_init(NULL); if (net_data && net_data->res) return (net_data->res); return (&_res); }
int * __h_errno(void) { /* NULL param here means use the default config file. */ struct net_data *net_data = net_data_init(NULL); if (net_data && net_data->res) return (&net_data->res->res_h_errno); #if !(__GLIBC__ > 2 || __GLIBC__ == 2 && __GLIBC_MINOR__ >= 3) return(&_res.res_h_errno); #else return (&h_errno); #endif }
static struct net_data * init(void) { struct net_data *net_data; if (!(net_data = net_data_init(NULL))) goto error; if (!net_data->ng) { net_data->ng = (*net_data->irs->ng_map)(net_data->irs); if (!net_data->ng) { error: errno = EIO; return (NULL); } } return (net_data); }
static struct net_data * init() { struct net_data *net_data; if (!(net_data = net_data_init(NULL))) goto error; if (!net_data->pw) { net_data->pw = (*net_data->irs->pw_map)(net_data->irs); if (!net_data->pw || !net_data->res) { error: errno = EIO; return (NULL); } (*net_data->pw->res_set)(net_data->pw, net_data->res, NULL); } return (net_data); }
static struct net_data * init() { struct net_data *net_data; if (!(net_data = net_data_init(NULL))) goto error; if (!net_data->ho) { net_data->ho = (*net_data->irs->ho_map)(net_data->irs); if (!net_data->ho || !net_data->res) { error: errno = EIO; if (net_data && net_data->res) RES_SET_H_ERRNO(net_data->res, NETDB_INTERNAL); return (NULL); } (*net_data->ho->res_set)(net_data->ho, net_data->res, NULL); } return (net_data); }
static int net_http_rsp_handler(struct net_handle_cxt* cxt, struct conn* server) { struct conn* client = cxt->client; client->tx = 0; struct net_data* data = mem_alloc(sizeof(struct net_data)); net_data_init(data); int ret = net_fetch_http(server, data); if (ret) { // Failed to fetch response from server conn_close(server); net_bad_gateway(client); net_data_done(data); mem_free(data); return ret; } struct net_rsp rsp; memset(&rsp, 0, sizeof(rsp)); rsp.data = data; ret = net_parse_rsp(&rsp); if (ret) { conn_close(server); net_bad_gateway(client); net_rsp_done(&rsp); return ret; } // TODO check headers and http version ret = net_forward_rsp_header(&rsp, client); if (ret) { net_rsp_done(&rsp); return ret; } if (rsp.ver_major*100 + rsp.ver_minor > 100) { // Higher than http 1.0 ret = net_transfer_body_HTTP_1_1(client, server, rsp.data); } else { PLOGD("Forwarding http 1.0 response"); while (1) { ret = conn_copy(client, server, 64*1024); if (ret < 0) { ret = 0; break; } } conn_close(client); conn_close(server); } struct net_req* req = cxt->head->req; if (ret == 0) ret = rsp.code; // WTF... log_http_req(&client->ep, req->data->buf.p + req->host, req->data->buf.p + req->path, client->tx); PLOGI("%s %s %s:%d%s %d", ep_tostring(&client->ep), req->data->buf.p, req->data->buf.p + req->host, req->port, req->data->buf.p + req->path, client->tx); net_rsp_done(&rsp); return ret; }