Beispiel #1
0
static void plug_proxy_sent (Plug p, int bufsize)
{
    ProxySocket *ps = FROMFIELD(p, ProxySocket, plugvt);

    if (ps->state != PROXY_STATE_ACTIVE) {
	ps->sent_bufsize = bufsize;
	ps->negotiate(ps, PROXY_CHANGE_SENT);
	return;
    }
    plug_sent(ps->plug, bufsize);
}
Beispiel #2
0
static void plug_proxy_sent(Plug p, int bufsize) {
	Proxy_Plug pp = (Proxy_Plug) p;
	Proxy_Socket ps = pp->proxy_socket;

	if (ps->state != PROXY_STATE_ACTIVE) {
		ps->sent_bufsize = bufsize;
		ps->negotiate(ps, PROXY_CHANGE_SENT);
		return;
	}
	plug_sent(ps->plug, bufsize);
}
Beispiel #3
0
/*
 * Call this when proxy negotiation is complete, so that this
 * socket can begin working normally.
 */
void proxy_activate (Proxy_Socket p)
{
    void *data;
    int len;
    long output_before, output_after;
    
    p->state = PROXY_STATE_ACTIVE;

    /* we want to ignore new receive events until we have sent
     * all of our buffered receive data.
     */
    sk_set_frozen(p->sub_socket, 1);

    /* how many bytes of output have we buffered? */
    output_before = bufchain_size(&p->pending_oob_output_data) +
	bufchain_size(&p->pending_output_data);
    /* and keep track of how many bytes do not get sent. */
    output_after = 0;
    
    /* send buffered OOB writes */
    while (bufchain_size(&p->pending_oob_output_data) > 0) {
	bufchain_prefix(&p->pending_oob_output_data, &data, &len);
	output_after += sk_write_oob(p->sub_socket, data, len);
	bufchain_consume(&p->pending_oob_output_data, len);
    }

    /* send buffered normal writes */
    while (bufchain_size(&p->pending_output_data) > 0) {
	bufchain_prefix(&p->pending_output_data, &data, &len);
	output_after += sk_write(p->sub_socket, data, len);
	bufchain_consume(&p->pending_output_data, len);
    }

    /* if we managed to send any data, let the higher levels know. */
    if (output_after < output_before)
	plug_sent(p->plug, output_after);

    /* if we were asked to flush the output during
     * the proxy negotiation process, do so now.
     */
    if (p->pending_flush) sk_flush(p->sub_socket);

    /* if we have a pending EOF to send, send it */
    if (p->pending_eof) sk_write_eof(p->sub_socket);

    /* if the backend wanted the socket unfrozen, try to unfreeze.
     * our set_frozen handler will flush buffered receive data before
     * unfreezing the actual underlying socket.
     */
    if (!p->freeze)
	sk_set_frozen((Socket)p, 0);
}
Beispiel #4
0
static void handle_sentdata(struct handle *h, int new_backlog)
{
    Handle_Socket ps = (Handle_Socket) handle_get_privdata(h);

    if (new_backlog < 0) {
        /* Special case: this is actually reporting an error writing
         * to the underlying handle, and our input value is the error
         * code itself, negated. */
        plug_closing(ps->plug, win_strerror(-new_backlog), -new_backlog, 0);
        return;
    }

    plug_sent(ps->plug, new_backlog);
}
Beispiel #5
0
static int localproxy_select_result(int fd, int event)
{
    Local_Proxy_Socket s;
    char buf[20480];
    int ret;

    if (!(s = find234(localproxy_by_fromfd, &fd, localproxy_fromfd_find)) &&
	!(s = find234(localproxy_by_fromfd, &fd, localproxy_errfd_find)) &&
	!(s = find234(localproxy_by_tofd, &fd, localproxy_tofd_find)) )
	return 1;		       /* boggle */

    if (event == 1) {
        if (fd == s->cmd_err) {
            ret = read(fd, buf, sizeof(buf));
            if (ret > 0)
                log_proxy_stderr(s->plug, &s->pending_error_data, buf, ret);
        } else {
            assert(fd == s->from_cmd);
            ret = read(fd, buf, sizeof(buf));
            if (ret < 0) {
                return plug_closing(s->plug, strerror(errno), errno, 0);
            } else if (ret == 0) {
                return plug_closing(s->plug, NULL, 0, 0);
            } else {
                return plug_receive(s->plug, 0, buf, ret);
            }
        }
    } else if (event == 2) {
	assert(fd == s->to_cmd);
	if (localproxy_try_send(s))
	    plug_sent(s->plug, bufchain_size(&s->pending_output_data));
	return 1;
    }

    return 1;
}
Beispiel #6
0
void localproxy_sentdata(struct handle *h, int new_backlog)
{
    Local_Proxy_Socket ps = (Local_Proxy_Socket) handle_get_privdata(h);
    
    plug_sent(ps->plug, new_backlog);
}
Beispiel #7
0
static void handle_sentdata(struct handle *h, int new_backlog)
{
    Handle_Socket ps = (Handle_Socket) handle_get_privdata(h);
    
    plug_sent(ps->plug, new_backlog);
}