[MEDIUM] backend: initialize the server stream_interface upon connect()
It's not normal to initialize the server-side stream interface from the accept() function, because it may change later. Thus, we introduce a new stream_sock_prepare_interface() function which is called just before the connect() and which sets all of the stream_interface's callbacks to the default ones used for real sockets. The ->connect function is also set at the same instant so that we can easily add new server-side protocols soon.
This commit is contained in:
parent
d04e858db0
commit
a8f55d5473
|
@ -39,6 +39,7 @@ void stream_sock_shutr(struct stream_interface *si);
|
|||
void stream_sock_shutw(struct stream_interface *si);
|
||||
void stream_sock_chk_rcv(struct stream_interface *si);
|
||||
void stream_sock_chk_snd(struct stream_interface *si);
|
||||
void stream_sock_prepare_interface(struct stream_interface *si);
|
||||
|
||||
|
||||
/* This either returns the sockname or the original destination address. Code
|
||||
|
|
|
@ -35,9 +35,11 @@
|
|||
#include <proto/lb_fwrr.h>
|
||||
#include <proto/lb_map.h>
|
||||
#include <proto/proto_http.h>
|
||||
#include <proto/proto_tcp.h>
|
||||
#include <proto/queue.h>
|
||||
#include <proto/server.h>
|
||||
#include <proto/session.h>
|
||||
#include <proto/stream_sock.h>
|
||||
#include <proto/task.h>
|
||||
|
||||
/*
|
||||
|
@ -902,8 +904,11 @@ int connect_server(struct session *s)
|
|||
return SN_ERR_INTERNAL;
|
||||
}
|
||||
|
||||
if (!s->req->cons->connect)
|
||||
return SN_ERR_INTERNAL;
|
||||
/* Prepare the stream interface for a TCP connection. Later
|
||||
* we may assign a protocol-specific connect() function.
|
||||
*/
|
||||
stream_sock_prepare_interface(s->req->cons);
|
||||
s->req->cons->connect = tcpv4_connect_server;
|
||||
|
||||
assign_tproxy_address(s);
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Functions operating on SOCK_STREAM and buffers.
|
||||
*
|
||||
* Copyright 2000-2009 Willy Tarreau <w@1wt.eu>
|
||||
* Copyright 2000-2010 Willy Tarreau <w@1wt.eu>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
@ -1221,6 +1221,17 @@ int stream_sock_accept(int fd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Prepare a stream interface to be used in socket mode. */
|
||||
void stream_sock_prepare_interface(struct stream_interface *si)
|
||||
{
|
||||
si->update = stream_sock_data_finish;
|
||||
si->shutr = stream_sock_shutr;
|
||||
si->shutw = stream_sock_shutw;
|
||||
si->chk_rcv = stream_sock_chk_rcv;
|
||||
si->chk_snd = stream_sock_chk_snd;
|
||||
si->iohandler = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
|
|
Loading…
Reference in New Issue