예제 #1
0
파일: telnet.c 프로젝트: cracksoft/scanssh
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);
}
예제 #2
0
파일: server_file.c 프로젝트: reyk/httpd
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;
}
예제 #3
0
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);
    }
}
예제 #4
0
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++;
	}
}
예제 #5
0
파일: http.c 프로젝트: cracksoft/scanssh
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);
}
예제 #6
0
파일: job.c 프로젝트: kylape/tmux
/* 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);
	}
}
예제 #7
0
파일: server_file.c 프로젝트: Nshk/httpd
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;
}
예제 #8
0
// 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);
    }
}
예제 #9
0
파일: http.c 프로젝트: cracksoft/scanssh
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);
}
예제 #10
0
파일: client.c 프로젝트: iksaif/sockslink
/* 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);
  }
}