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);