int telnet_makeconnect(struct bufferevent *bev, struct argument *arg) { extern struct addr *socks_dst_addr; struct evbuffer *input = EVBUFFER_INPUT(bev); struct telnet_state *state = arg->a_state; ip_addr_t address; socks_resolveaddress("www.google.com", &address); if (evbuffer_find(input, CCPROXY, strlen(CCPROXY)) != NULL) { state->response = "telnet-proxy: CCproxy"; state->connect_wait = "OK!"; evbuffer_add_printf(EVBUFFER_OUTPUT(bev), "open %s:80\r\n", addr_ntoa(socks_dst_addr)); bufferevent_enable(bev, EV_WRITE); return (1); } else if (evbuffer_find(input, GATEWAY1, strlen(GATEWAY1)) != NULL) { state->response = "telnet-proxy: Gateway"; state->connect_wait = "Connected to:"; evbuffer_add_printf(EVBUFFER_OUTPUT(bev), "%s:80\r\n", addr_ntoa(socks_dst_addr)); bufferevent_enable(bev, EV_WRITE); return (1); } else if (evbuffer_find(input, GATEWAY2, strlen(GATEWAY2)) != NULL) { state->response = "telnet-proxy: Gateway"; /* * We do not get a connection confirmation, just the echoed * string. So, we wait for the echo and then send our command. */ state->connect_wait = ":80"; evbuffer_add_printf(EVBUFFER_OUTPUT(bev), "%s:80\r\n", addr_ntoa(socks_dst_addr)); bufferevent_enable(bev, EV_WRITE); return (1); } else if (evbuffer_find(input, WINGATE, strlen(WINGATE)) != NULL) { state->response = "telnet-proxy: WinGate"; state->connect_wait = "...Connected"; evbuffer_add_printf(EVBUFFER_OUTPUT(bev), "%s:80\r\n", addr_ntoa(socks_dst_addr)); bufferevent_enable(bev, EV_WRITE); return (1); } else if (EVBUFFER_LENGTH(input) > 512) { return (-1); } return (0); }
void server_file_error(struct bufferevent *bev, short error, void *arg) { struct client *clt = arg; struct evbuffer *src, *dst; if (error & EVBUFFER_TIMEOUT) { server_close(clt, "buffer event timeout"); return; } if (error & EVBUFFER_ERROR) { if (errno == EFBIG) { bufferevent_enable(bev, EV_READ); return; } server_close(clt, "buffer event error"); return; } if (error & (EVBUFFER_READ|EVBUFFER_WRITE|EVBUFFER_EOF)) { bufferevent_disable(bev, EV_READ|EV_WRITE); clt->clt_done = 1; src = EVBUFFER_INPUT(clt->clt_bev); /* Close the connection if a previous pipeline is empty */ if (clt->clt_pipelining && EVBUFFER_LENGTH(src) == 0) clt->clt_persist = 0; if (clt->clt_persist) { /* Close input file and wait for next HTTP request */ if (clt->clt_fd != -1) close(clt->clt_fd); clt->clt_fd = -1; clt->clt_toread = TOREAD_HTTP_HEADER; server_reset_http(clt); bufferevent_enable(clt->clt_bev, EV_READ|EV_WRITE); /* Start pipelining if the buffer is not empty */ if (EVBUFFER_LENGTH(src)) { clt->clt_pipelining++; server_read_http(clt->clt_bev, arg); } return; } dst = EVBUFFER_OUTPUT(clt->clt_bev); if (EVBUFFER_LENGTH(dst)) { /* Finish writing all data first */ bufferevent_enable(clt->clt_bev, EV_WRITE); return; } server_close(clt, "done"); return; } server_close(clt, "unknown event error"); return; }
void stream_request_writecb(struct bufferevent *bev, void *arg) { _DEBUG("stream_request_writecb()\n"); if (EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) == 0) { bufferevent_enable(bev, EV_READ); } }
static void http_chunked_writecb(struct bufferevent *bev, void *arg) { if (EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) == 0) { /* enable reading of the reply */ bufferevent_enable(bev, EV_READ); test_ok++; } }
void http_makeconnect(struct bufferevent *bev, struct argument *arg) { extern struct addr *socks_dst_addr; ip_addr_t address; socks_resolveaddress("www.google.com", &address); evbuffer_add_printf(EVBUFFER_OUTPUT(bev), "CONNECT %s:80 HTTP/1.0\r\n" "\r\n", addr_ntoa(socks_dst_addr), SSHUSERAGENT); bufferevent_enable(bev, EV_WRITE); }
/* Called when output buffer falls below low watermark (default is 0). */ void job_write_callback(unused struct bufferevent *bufev, void *data) { struct job *job = data; size_t len = EVBUFFER_LENGTH(EVBUFFER_OUTPUT(job->event)); log_debug("job write %p: %s, pid %ld, output left %zu", job, job->cmd, (long) job->pid, len); if (len == 0) { shutdown(job->fd, SHUT_WR); bufferevent_disable(job->event, EV_WRITE); } }
void server_file_error(struct bufferevent *bev, short error, void *arg) { struct client *clt = arg; struct evbuffer *dst; if (error & EVBUFFER_TIMEOUT) { server_close(clt, "buffer event timeout"); return; } if (error & EVBUFFER_ERROR) { if (errno == EFBIG) { bufferevent_enable(bev, EV_READ); return; } server_close(clt, "buffer event error"); return; } if (error & (EVBUFFER_READ|EVBUFFER_WRITE|EVBUFFER_EOF)) { bufferevent_disable(bev, EV_READ|EV_WRITE); clt->clt_done = 1; if (clt->clt_persist) { /* Close input file and wait for next HTTP request */ if (clt->clt_fd != -1) close(clt->clt_fd); clt->clt_fd = -1; clt->clt_toread = TOREAD_HTTP_HEADER; server_reset_http(clt); bufferevent_enable(clt->clt_bev, EV_READ|EV_WRITE); return; } dst = EVBUFFER_OUTPUT(clt->clt_bev); if (EVBUFFER_LENGTH(dst)) { /* Finish writing all data first */ bufferevent_enable(clt->clt_bev, EV_WRITE); return; } server_close(clt, "done"); return; } server_close(clt, "unknown event error"); return; }
// called by libevent when the write buffer reaches 0. static void buffered_on_write(struct bufferevent *bev, void *arg) { struct DSClient *client = (struct DSClient *)arg; struct DomainSocket *uds = (struct DomainSocket *)client->uds; struct evbuffer *evb; _DEBUG("%s: %d\n", __FUNCTION__, client->fd); evb = EVBUFFER_OUTPUT(bev); if (EVBUFFER_LENGTH(evb) == 0) { bufferevent_disable(bev, EV_WRITE); } if (*uds->write_callback) { (*uds->write_callback)(client); } }
void http_makerequest(struct bufferevent *bev, struct argument *arg, const char *word, int fqdn) { extern struct addr *socks_dst_addr; ip_addr_t address; socks_resolveaddress("www.google.com", &address); evbuffer_add_printf(EVBUFFER_OUTPUT(bev), "GET %s%s/search?hl=en&ie=UTF-8&oe=UTF-8&q=%s&btnG=Google+Search HTTP/1.0\r\n" "Host: www.google.com\r\n" "User-Agent: %s\r\n" "\r\n", fqdn ? "http://" : "", fqdn ? addr_ntoa(socks_dst_addr) : "", word, SSHUSERAGENT); bufferevent_enable(bev, EV_WRITE); }
/* Disconnect client as soon as buffer are empty */ void client_disconnect(Client *cl) { size_t bytes = EVBUFFER_LENGTH(EVBUFFER_OUTPUT(cl->client.bufev)); prcl_trace(cl, "disconnecting client"); /* first, try to send bytes, then disconnect */ if (bytes) cl->close = true; else { if (!cl->authenticated && cl->client_method == AUTH_METHOD_USERNAME) { /* tsocks <= 1.8 will freeze if the socket is disconnected before * authentication results */ client_auth_username_fail(cl); cl->close = true; } else client_drop(cl); } }