The branch, master has been updated
       via  465176b7e2fc1370dded850a80a8fe8519e79db8 (commit)
      from  fee2664dad37536b05ce8bdae3e74d45b257f632 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 465176b7e2fc1370dded850a80a8fe8519e79db8
Author: Stefan Metzmacher <[email protected]>
Date:   Thu Dec 18 15:02:42 2008 +0100

    s3:cluster: register the client connection via CTDB_CONTROL_TCP_ADD
    
    This means we correctly pass IPv6 addresses too.
    (CTDB_CONTROL_TCP_CLIENT was IPv4 only)
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 source3/include/ctdbd_conn.h |    4 ++--
 source3/include/proto.h      |    1 -
 source3/lib/ctdbd_conn.c     |   26 +++++++++++++++++++-------
 source3/smbd/server.c        |    9 ++++++---
 4 files changed, 27 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h
index 39f50c2..44c3516 100644
--- a/source3/include/ctdbd_conn.h
+++ b/source3/include/ctdbd_conn.h
@@ -57,8 +57,8 @@ NTSTATUS ctdbd_traverse(uint32 db_id,
                        void *private_data);
 
 NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
-                           const struct sockaddr_in *server,
-                           const struct sockaddr_in *client,
+                           const struct sockaddr *server,
+                           const struct sockaddr *client,
                            void (*release_ip_handler)(const char *ip_addr,
                                                       void *private_data),
                            void *private_data);
diff --git a/source3/include/proto.h b/source3/include/proto.h
index b874beb..7c00d7b 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -7690,7 +7690,6 @@ void init_sec_ctx(void);
 
 int smbd_server_fd(void);
 int get_client_fd(void);
-int client_get_tcp_info(struct sockaddr_in *server, struct sockaddr_in 
*client);
 struct event_context *smbd_event_context(void);
 struct messaging_context *smbd_messaging_context(void);
 struct memcache *smbd_memcache(void);
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index 10a65c5..8d97606 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -1175,13 +1175,13 @@ NTSTATUS ctdbd_traverse(uint32 db_id,
  */
 
 NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
-                           const struct sockaddr_in *server,
-                           const struct sockaddr_in *client,
+                           const struct sockaddr *server,
+                           const struct sockaddr *client,
                            void (*release_ip_handler)(const char *ip_addr,
                                                       void *private_data),
                            void *private_data)
 {
-       struct ctdb_control_tcp p;
+       struct ctdb_control_tcp_vnn p;
        TDB_DATA data;
        NTSTATUS status;
 
@@ -1190,6 +1190,21 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection 
*conn,
         */
        SMB_ASSERT(conn->release_ip_handler == NULL);
 
+       switch (client->sa_family) {
+       case AF_INET:
+               p.dest.ip = *(struct sockaddr_in *)server;
+               p.src.ip = *(struct sockaddr_in *)client;
+               break;
+#ifdef HAVE_IPV6
+       case AF_INET6:
+               p.dest.ip6 = *(struct sockaddr_in6 *)server;
+               p.src.ip6 = *(struct sockaddr_in6 *)client;
+               break;
+#endif
+       default:
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
        conn->release_ip_handler = release_ip_handler;
 
        /*
@@ -1201,9 +1216,6 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
                return status;
        }
 
-       p.dest = *server;
-       p.src = *client;
-
        /*
         * inform ctdb of our tcp connection, so if IP takeover happens ctdb
         * can send an extra ack to trigger a reset for our client, so it
@@ -1213,7 +1225,7 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
        data.dsize = sizeof(p);
 
        return ctdbd_control(conn, CTDB_CURRENT_NODE, 
-                            CTDB_CONTROL_TCP_CLIENT, 0,
+                            CTDB_CONTROL_TCP_ADD, 0,
                             CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL, NULL);
 }
 
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index f7bdb58..cfdd05b 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -59,7 +59,8 @@ int get_client_fd(void)
        return server_fd;
 }
 
-int client_get_tcp_info(struct sockaddr_in *server, struct sockaddr_in *client)
+static int client_get_tcp_info(struct sockaddr_storage *server,
+                              struct sockaddr_storage *client)
 {
        socklen_t length;
        if (server_fd == -1) {
@@ -1466,7 +1467,7 @@ extern void build_options(bool screen);
                 * client.
                 */
 
-               struct sockaddr_in srv, clnt;
+               struct sockaddr_storage srv, clnt;
 
                if (client_get_tcp_info(&srv, &clnt) == 0) {
 
@@ -1474,7 +1475,9 @@ extern void build_options(bool screen);
 
                        status = ctdbd_register_ips(
                                messaging_ctdbd_connection(),
-                               &srv, &clnt, release_ip, NULL);
+                               (struct sockaddr *)&srv,
+                               (struct sockaddr *)&clnt,
+                               release_ip, NULL);
 
                        if (!NT_STATUS_IS_OK(status)) {
                                DEBUG(0, ("ctdbd_register_ips failed: %s\n",


-- 
Samba Shared Repository

Reply via email to