From: Willy Tarreau Date: Mon, 31 May 2010 15:44:19 +0000 (+0200) Subject: [MEDIUM] backend: initialize the server stream_interface upon connect() X-Git-Tag: v1.5-dev8~585 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a8f55d54738bf3c4e9071c6109ac0b302bc1c720;p=thirdparty%2Fhaproxy.git [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. --- diff --git a/include/proto/stream_sock.h b/include/proto/stream_sock.h index d0d172f190..e5d4f517a9 100644 --- a/include/proto/stream_sock.h +++ b/include/proto/stream_sock.h @@ -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 diff --git a/src/backend.c b/src/backend.c index 0e99879627..1fc6b2aaad 100644 --- a/src/backend.c +++ b/src/backend.c @@ -35,9 +35,11 @@ #include #include #include +#include #include #include #include +#include #include /* @@ -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); diff --git a/src/stream_sock.c b/src/stream_sock.c index 171ed294cd..9159796952 100644 --- a/src/stream_sock.c +++ b/src/stream_sock.c @@ -1,7 +1,7 @@ /* * Functions operating on SOCK_STREAM and buffers. * - * Copyright 2000-2009 Willy Tarreau + * Copyright 2000-2010 Willy Tarreau * * 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: