tHave a server that is bound to a non-default IP (via. BindAddress) also bind client sockets to that same IP when talking to the metaserver, so that the latter gets the originating IP correct. - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit 9918e1db7bd81607c915ab626ff744b39dff40d8 (DIR) parent da267b014539dfa6bf4c6862dc3a2bc4f9108fd9 (HTM) Author: Ben Webb <ben@salilab.org> Date: Tue, 30 Jul 2002 19:40:02 +0000 Have a server that is bound to a non-default IP (via. BindAddress) also bind client sockets to that same IP when talking to the metaserver, so tthat the latter gets the originating IP correct. Diffstat: M src/AIPlayer.c | 2 +- M src/curses_client/curses_client.c | 2 +- M src/gui_client/newgamedia.c | 2 +- M src/message.c | 1 + M src/network.c | 24 ++++++++++++++++-------- M src/network.h | 8 +++++--- M src/serverside.c | 1 + 7 files changed, 26 insertions(+), 14 deletions(-) --- (DIR) diff --git a/src/AIPlayer.c b/src/AIPlayer.c t@@ -157,7 +157,7 @@ void AIPlayerLoop() oldstatus = netbuf->status; oldsocks = netbuf->sockstat; - if (!StartNetworkBufferConnect(netbuf, ServerName, Port)) { + if (!StartNetworkBufferConnect(netbuf, NULL, ServerName, Port)) { AIConnectFailed(netbuf); return; } else { (DIR) diff --git a/src/curses_client/curses_client.c b/src/curses_client/curses_client.c t@@ -518,7 +518,7 @@ static gboolean DoConnect(Player *Play, GString *errstr) oldstatus = netbuf->status; oldsocks = netbuf->sockstat; - if (!StartNetworkBufferConnect(netbuf, ServerName, Port)) { + if (!StartNetworkBufferConnect(netbuf, NULL, ServerName, Port)) { doneOK = FALSE; } else { SetNetworkBufferUserPasswdFunc(netbuf, SocksAuthFunc, NULL); (DIR) diff --git a/src/gui_client/newgamedia.c b/src/gui_client/newgamedia.c t@@ -154,7 +154,7 @@ static void DoConnect(void) oldstatus = NetBuf->status; oldsocks = NetBuf->sockstat; - if (StartNetworkBufferConnect(NetBuf, ServerName, Port)) { + if (StartNetworkBufferConnect(NetBuf, NULL, ServerName, Port)) { DisplayConnectStatus(FALSE, oldstatus, oldsocks); SetNetworkBufferUserPasswdFunc(NetBuf, SocksAuthDialog, NULL); SetNetworkBufferCallBack(NetBuf, stgam.sockstat, NULL); (DIR) diff --git a/src/message.c b/src/message.c t@@ -413,6 +413,7 @@ gboolean OpenMetaHttpConnection(HttpConnection **conn) MetaServer.Path, METAVERSION); retval = OpenHttpConnection(conn, MetaServer.Name, MetaServer.Port, MetaServer.ProxyName, MetaServer.ProxyPort, + "", UseSocks && MetaServer.UseSocks ? &Socks : NULL, "GET", query, NULL, NULL); (DIR) diff --git a/src/network.c b/src/network.c t@@ -70,7 +70,7 @@ typedef enum { static gboolean StartSocksNegotiation(NetworkBuffer *NetBuf, gchar *RemoteHost, unsigned RemotePort); -static gboolean StartConnect(int *fd, gchar *RemoteHost, +static gboolean StartConnect(int *fd, const gchar *bindaddr, gchar *RemoteHost, unsigned RemotePort, gboolean *doneOK, LastError **error); t@@ -260,6 +260,7 @@ gboolean IsNetworkBufferActive(NetworkBuffer *NetBuf) } gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf, + const gchar *bindaddr, gchar *RemoteHost, unsigned RemotePort) { gchar *realhost; t@@ -276,7 +277,7 @@ gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf, realport = RemotePort; } - if (StartConnect(&NetBuf->fd, realhost, realport, &doneOK, + if (StartConnect(&NetBuf->fd, bindaddr, realhost, realport, &doneOK, &NetBuf->error)) { /* If we connected immediately, then set status, otherwise signal that * we're waiting for the connect to complete */ t@@ -1203,7 +1204,8 @@ static gboolean StartHttpConnect(HttpConnection *conn) ConnectPort = conn->Port; } - if (!StartNetworkBufferConnect(&conn->NetBuf, ConnectHost, ConnectPort)) { + if (!StartNetworkBufferConnect(&conn->NetBuf, conn->bindaddr, ConnectHost, + ConnectPort)) { return FALSE; } return TRUE; t@@ -1211,9 +1213,9 @@ static gboolean StartHttpConnect(HttpConnection *conn) gboolean OpenHttpConnection(HttpConnection **connpt, gchar *HostName, unsigned Port, gchar *Proxy, - unsigned ProxyPort, SocksServer *socks, - gchar *Method, gchar *Query, gchar *Headers, - gchar *Body) + unsigned ProxyPort, const gchar *bindaddr, + SocksServer *socks, gchar *Method, + gchar *Query, gchar *Headers, gchar *Body) { HttpConnection *conn; t@@ -1225,6 +1227,7 @@ gboolean OpenHttpConnection(HttpConnection **connpt, gchar *HostName, conn->HostName = g_strdup(HostName); if (Proxy && Proxy[0]) conn->Proxy = g_strdup(Proxy); + conn->bindaddr = g_strdup(bindaddr); conn->Method = g_strdup(Method); conn->Query = g_strdup(Query); if (Headers && Headers[0]) t@@ -1248,6 +1251,7 @@ void CloseHttpConnection(HttpConnection *conn) ShutdownNetworkBuffer(&conn->NetBuf); g_free(conn->HostName); g_free(conn->Proxy); + g_free(conn->bindaddr); g_free(conn->Method); g_free(conn->Query); g_free(conn->Headers); t@@ -1546,8 +1550,8 @@ gboolean BindTCPSocket(int sock, const gchar *addr, unsigned port, return (retval != SOCKET_ERROR); } -gboolean StartConnect(int *fd, gchar *RemoteHost, unsigned RemotePort, - gboolean *doneOK, LastError **error) +gboolean StartConnect(int *fd, const gchar *bindaddr, gchar *RemoteHost, + unsigned RemotePort, gboolean *doneOK, LastError **error) { struct sockaddr_in ClientAddr; struct hostent *he; t@@ -1562,6 +1566,10 @@ gboolean StartConnect(int *fd, gchar *RemoteHost, unsigned RemotePort, if (*fd == SOCKET_ERROR) return FALSE; + if (bindaddr && bindaddr[0] && !BindTCPSocket(*fd, bindaddr, 0, error)) { + return FALSE; + } + ClientAddr.sin_family = AF_INET; ClientAddr.sin_port = htons(RemotePort); ClientAddr.sin_addr = *((struct in_addr *)he->h_addr); (DIR) diff --git a/src/network.h b/src/network.h t@@ -154,6 +154,7 @@ struct _HttpConnection { gchar *Proxy; /* If non-NULL, a web proxy to use */ unsigned ProxyPort; /* The port to use for talking to * the proxy */ + char *bindaddr; /* local IP address to bind to */ gchar *Method; /* e.g. GET, POST */ gchar *Query; /* e.g. the path of the desired webpage */ gchar *Headers; /* if non-NULL, e.g. Content-Type */ t@@ -188,6 +189,7 @@ void SetNetworkBufferUserPasswdFunc(NetworkBuffer *NetBuf, gboolean IsNetworkBufferActive(NetworkBuffer *NetBuf); void BindNetworkBufferToSocket(NetworkBuffer *NetBuf, int fd); gboolean StartNetworkBufferConnect(NetworkBuffer *NetBuf, + const gchar *bindaddr, gchar *RemoteHost, unsigned RemotePort); void ShutdownNetworkBuffer(NetworkBuffer *NetBuf); void SetSelectForNetworkBuffer(NetworkBuffer *NetBuf, fd_set *readfds, t@@ -213,9 +215,9 @@ void CommitWriteBuffer(NetworkBuffer *NetBuf, ConnBuf *conn, gchar *addpt, gboolean OpenHttpConnection(HttpConnection **conn, gchar *HostName, unsigned Port, gchar *Proxy, - unsigned ProxyPort, SocksServer *socks, - gchar *Method, gchar *Query, gchar *Headers, - gchar *Body); + unsigned ProxyPort, const gchar *bindaddr, + SocksServer *socks, gchar *Method, + gchar *Query, gchar *Headers, gchar *Body); void CloseHttpConnection(HttpConnection *conn); gchar *ReadHttpResponse(HttpConnection *conn, gboolean *doneOK); void SetHttpAuthentication(HttpConnection *conn, gboolean proxy, (DIR) diff --git a/src/serverside.c b/src/serverside.c t@@ -289,6 +289,7 @@ void RegisterWithMetaServer(gboolean Up, gboolean SendData, retval = OpenHttpConnection(&MetaConn, MetaServer.Name, MetaServer.Port, MetaServer.ProxyName, MetaServer.ProxyPort, + BindAddress, UseSocks && MetaServer.UseSocks ? &Socks : NULL, "POST", MetaServer.Path, headers->str, body->str);