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